Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在data.table列表列中保存绘图_R_Plot_Graph_Data.table - Fatal编程技术网

R 在data.table列表列中保存绘图

R 在data.table列表列中保存绘图,r,plot,graph,data.table,R,Plot,Graph,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")

当我跑的时候

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)我可以做些什么简单的调整来绕过它?

一个可行的方法是编写
j
这样的代码

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

或者类似的方法,确保引用是对
.SD
的每组副本的引用,并且不会混淆。

毫不奇怪,一种解决方法是使用
v+0
代替
v
来确保变量按值传递。这就是我将要做的,直到我听到一个更好的方法。当我运行这段代码时,对于正常的DT图和记录图,我得到了相同的结果(都是错误的)。然而,当我切换到
v=id2*1:10
时,我确实得到了正确的结果。@takje-Huh,我想知道我们是否有不同的版本或其他东西。我使用的是R3.2.4和数据。表1.10.4I使用R3.3.2版本对此进行了测试。数据表版本相同。调整绘图窗口的大小会得到与
replayPlot