当我运行时...
library(data.table)
DT = CJ(id = 1, id2 = 1:3)[, .(
d = as.IDate("2017-01-01")+1:10, v = id*10 + id2*1:10
), by=.(id, id2)]
plotDT = DT[, {
par(mfrow = c(uniqueN(id2), 1), mar = c(2,2,.5,2))
.SD[,{
plot(d, v, type="l")
}, by=id2]
.(p = .(recordPlot()))
}, by=id]
x11()
plotDT[id == 1L, replayPlot(p[[1]])]
DT[...]
的情节是正确的:
而回放却是错误的:
在记录的图中,x
和y
的最终值被神奇地应用于所有三个图表,这可能是由于data.table处理在by=
组中定义的列指针的方式所致。
尽管如此,我并不确定自己理解了发生了什么,因为我可以对示例进行表面上的更改,将v=id2*1:10
改为v=id*10+id2*1:10
然后问题就消失了。
我想知道:(i)为什么会出现这种情况, (ii)有什么简单的调整我可以做来避免它?
v + 0
代替v
,确保变量按值传递。在我听到更好的方法之前,我会这样做。 - Frankv = id2*1:10
时,两者确实都给出了正确的结果。 - takjewith(copy(.SD), {yada j})
是一个足够好的解决方法。参考链接:http://stackoverflow.com/questions/43536583/data-table-not-returning-correct-plots?noredirect=1&lq=1#comment74148898_43548292 - Frank