【发布时间】:2017-02-24 22:19:52
【问题描述】:
当我跑步时...
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来确保按值传递变量。在我听到更好的方法之前,我会这样做。 -
当我运行这段代码时,对于正常的 DT 图和记录图(都是错误的),我得到了相同的结果。但是,当我切换到
v = id2*1:10时,我确实得到了两者的正确结果。 -
@takje Huh,我想知道我们是否有不同的版本。我正在使用 R 3.2.4 和 data.table 1.10.4
-
我用 R 版本 3.3.2 对此进行了测试。数据表版本相同。
-
调整绘图窗口的大小与
replayPlot的结果相同
标签: r plot graph data.table