2017-02-24 36 views
14

当我运行...保存地块在data.table列表列

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[...]情节是正确的:

虽然重播是错误的:

在录制的图表中, xy的最终值会神奇地应用于所有三个图表,这可能是因为data.table处理指向by=组中定义的列的指针。

虽然我并不确定自己明白发生了什么,因为我可以从表面上改变这个例子,编写v = id2*1:10而不是v = id*10 + id2*1:10,并且 - poof - 问题消失。

我想知道(i)为什么会发生这种情况?(ii)我可以做些什么简单的调整?

+3

不出所料,一种解决方法是确保通过使用'v + 0'代替'v'来传递变量。这是我会做的,直到我听到更好的方式。 – Frank

+1

当我运行这个代码时,我得到了正常DT图和记录图(都是错误的)的相同结果。但是,当我切换到'v = id2 * 1:10'时,我的确得到了正确的结果。 – takje

+0

@takje嗯,我想知道我们是否有不同的版本或者什么的。我使用R 3.2.4和data.table 1.10.4 – Frank

回答

2

一个工作黑客是写j

with(copy(.SD), {yada yada}) 

或相似,从而确保引用到的.SD每组副本,不要让混为一谈。