R data.table导致line()绘制奇怪的东西

R data.table导致line()绘制奇怪的东西,r,data.table,R,Data.table,我想画一条线性回归线y=m*x+b,其中x来自data.table中的一列,m和b是固定的。当我执行此程序时: library(data.table) dt = data.table(KEY_COLUMN = c("a","c","d","e","b"), x = c(29.34224, 26.77573, 25.45568, 26.27839, 28.22389) ) x = dt$x m = -0.1211562 b = 63

我想画一条线性回归线y=m*x+b,其中x来自data.table中的一列,m和b是固定的。当我执行此程序时:

library(data.table)

dt = data.table(KEY_COLUMN = c("a","c","d","e","b"),
                x = c(29.34224, 26.77573, 25.45568, 26.27839, 28.22389)
                )
x = dt$x
m = -0.1211562
b = 63.09729
plot(c(25,30), c(58,61))
lines(x, m*x + b, col="red")
setkeyv(dt, "KEY_COLUMN")
然后我得到了一张奇怪的照片: 这不可能是数据的真实情况,因为嘿,我在画一条线y=mx+b

更尴尬的是,当删除在线条画后面发生的命令
setkeyv(dt,“KEY\u COLUMN”)
时,所有的东西都会运行,我得到一条线条。如果这还不够:当把'bad'命令
setkeyv(dt,“KEY\u COLUMN”)
放在那里,但在lines命令之后插入一个
browser()
,那么一切都按预期工作,我得到一行

这是一个“量子”错误:只要你想看到错误,它就会消失。。。只有在你无法真正观察到错误的情况下,错误才会存在。我是否愚蠢/忽略了一些非常简单的事情,或者发生了什么

干杯


FW

如您所知,data.table通过引用进行修改。当我一次完成所有代码的源代码时,我可以重现这一点。如果我一行一行地找到它,我就会得到预期的结果。因此,我假设这种情况会发生:

的第一个参数是对
x
的引用(指针),它是对data.table的
x
列的引用。因为它从未被修改过,所以它从未被实际复制并保持为引用。行的第二个参数不是引用,因为表达式将被计算并生成一个新的(独立)变量

现在,打印速度很慢,在用于打印的C代码实际生成打印之前,最后一行代码被计算(并设置了键)。这将对内存中的data.table进行排序,
x
仍然只是对它的引用。这些行是基于重新排序的x数据生成的

如果强制复制,我可以获得预期结果:

library(data.table)

dt = data.table(KEY_COLUMN = c("a","c","d","e","b"),
                x = c(29.34224, 26.77573, 25.45568, 26.27839, 28.22389)
)

x = copy(dt$x)
#alternatively modifying x works: x[1] <- x[1]

m = -0.1211562
b = 63.09729
plot(c(25,30), c(58,61))
lines(x, m*x + b, col="red")
setkeyv(dt, "KEY_COLUMN")
库(data.table)
dt=数据表(键列=c(“a”、“c”、“d”、“e”、“b”),
x=c(29.34224、26.77573、25.45568、26.27839、28.22389)
)
x=副本(dt$x)

#或者修改x works:x[1]我认为您需要在绘图之前对数据进行排序。考虑<代码>图(C(1,5,2),C(1∶6),类型=“L”)< /代码>的结果。但是x的顺序不重要:比较图(C(1,2,3),2×C(1,2,3)+ 5,类型=“L”)到图(C(1,3,2),2×C(1,3,2)+ 5,类型=“L”):它们看起来完全相同……它们看起来不完全相同,在函数反复绘制的地方,线更暗。我敢打赌,罗兰下面的理论是导致你当前问题的原因。太好了!我还注意到,调用“copy()”时不会出现问题,但我无法看到重新排序将如何影响打印,因为打印是提前完成的。。。嗯,至少看起来是这样。你的解释听起来很合理。我将实现我自己版本的“lines”,在实际绘制输入之前复制输入。@FabianWerner您还可以计算data.table中的y值,并使用带有数据参数的lines公式方法。然后x和y将一起重新排序,这样就不会有问题了。