当我跑...
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[...]
的情节是正确的:
虽然重播是错误的:
在recordedplot中,x
和y
的最终值神奇地应用于所有三个图,可能是因为data.table处理指向by=
组中定义的列的指针。
我不确定我是否理解发生了什么,因为我可以在表面上改变示例,编写v = id2*1:10
而不是v = id*10 + id2*1:10
并且 - poof - 问题消失了。
我想知道(i)为什么会发生这种情况,以及(ii)我可以通过哪些简单的调整来解决这个问题?
答案 0 :(得分:2)
一个工作黑客就是写j
喜欢
with(copy(.SD), {yada yada})
或类似的,确保引用是.SD
的每组副本,并且不会混淆。