【问题标题】:Saving plots in a data.table list column将绘图保存在 data.table 列表列中
【发布时间】: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[...] 的情节是正确的:

虽然回放是错误的:

在记录图中,xy 的最终值神奇地应用于所有三个图形,这可能是因为 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


【解决方案1】:

一个有效的技巧是写j like

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2010-12-21
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2017-04-22
    相关资源
    最近更新 更多