2011-11-06 28 views
24

在測試我的代碼,我發現了以下內容:如果我分配data.table DT1DT和更改DT之後,DT1隨着它變化。所以DTDT1似乎是內部鏈接。這是預期的行爲?儘管我不是編程專家,但這看起來不對,而且使用簡單的R變量或data.frame進行測試,我無法重現該行爲。這裏發生了什麼事?:=(通過引用傳遞)操作者在data.table包修改另一個數據表對象同時

DF <- data.frame(ID=letters[1:5], 
        value=1:5) 
DF1 <- DF 
all.equal(DF1, DF) 
[1] TRUE 
DF[1, "value"] <- DF[1, "value"]*2 
all.equal(DF1, DF) 
[1] "Component 2: Mean relative difference: 1" 

library(data.table) 
data.table 1.7.1 For help type: help("data.table") 
DT <- data.table(ID=letters[1:5], 
        value=1:5) 
DT1 <- DT 
all.equal(DT1, DT) 
[1] TRUE 
DT[, value:=value*2] 
    ID value 
[1,] a  2 
[2,] b  4 
[3,] c  6 
[4,] d  8 
[5,] e 10 
all.equal(DT1, DT) 
[1] TRUE 

回答

24

data.table這篇文檔將有所幫助。 ? data.table::copy

未返回任何值。 data.table通過引用進行修改。如果您需要複印件,請先複印一份(使用DT2 =複印件(DT))。 copy()在以下情況下有時也會有用:=用於通過引用將其分配給列。