2017-02-24 44 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每組副本,不要讓混爲一談。