2013-04-08 38 views
5

只是爲了自己清理一些東西,我想更好地理解何時創建副本以及何時不在data.table中。由於這個問題指出Understanding exactly when a data.table is a reference to (vs a copy of) another data.table,如果簡單地運行下列那麼你最終修改原始:瞭解data.table的參考屬性R

library(data.table) 

DT <- data.table(a=c(1,2), b=c(11,12)) 
print(DT) 
#  a b 
# [1,] 1 11 
# [2,] 2 12 

newDT <- DT  # reference, not copy 
newDT[1, a := 100] # modify new DT 

print(DT)   # DT is modified too. 
#  a b 
# [1,] 100 11 
# [2,] 2 12 

然而,如果做到這一點(例如),那麼你最終修改的新版本:

DT = data.table(a=1:10) 
DT 
    a 
1: 1 
2: 2 
3: 3 
4: 4 
5: 5 
6: 6 
7: 7 
8: 8 
9: 9 
10: 10 

newDT = DT[a<11] 
newDT 
    a 
1: 1 
2: 2 
3: 3 
4: 4 
5: 5 
6: 6 
7: 7 
8: 8 
9: 9 
10: 10 

newDT[1:5,a:=0L] 

newDT 
    a 
1: 0 
2: 0 
3: 0 
4: 0 
5: 0 
6: 6 
7: 7 
8: 8 
9: 9 
10: 10 

DT 
    a 
1: 1 
2: 2 
3: 3 
4: 4 
5: 5 
6: 6 
7: 7 
8: 8 
9: 9 
10: 10 

據我瞭解,之所以出現這種情況是因爲當你執行i聲明,data.table返回一個全新的表,而不是由舊data.table選擇元素所佔用的內存的引用。這是正確和真實的嗎?

編輯:對不起,我的意思i沒有j(高於此改變)

+0

即使'newDT < - DT [x <11]'也會創建一個副本。通過子集創建'newDT'後,'newDT [,b:= 5]'。使用'tracemem'和'.Internal(inspect(。))'是理解這一點的信息工具。 – Arun 2013-04-08 22:39:15

+0

@阿倫:對不起,我不確定我是否理解你的觀點。你能解釋一下你指的是什麼嗎?你的意思是說第一個例子和第二個例子會一樣嗎?在那種情況下是的 - 這是真的。我只是想要一個單獨的例子來說清楚。 – Alex 2013-04-08 22:42:06

+0

當然,你能解釋一下你指的是哪個'j'語句:'據我瞭解,這種情況發生的原因是因爲當你執行一個j語句時,只是爲了確定。我會用我之前談論的內容寫一個答案。 – Arun 2013-04-08 22:46:27

回答

7

當您在第二個例子中newDT,你正在評估i(不j)。 :=j參數內通過引用進行分配。在i語句中沒有等價物,因爲自引用通過分配列而不是行。

A data.table是一個列表。它的長度==列數,但在分配這樣你就可以不用複製整個表(例如使用j:=

如果我們檢查data.table,那麼我們可以看到truelength添加更多的列(tl = 100) - 即列指針的時隙的numbe

.Internal(inspect(DT)) 
@1427d6c8 19 VECSXP g0c7 [OBJ,NAM(2),ATT] (len=1, tl=100) 
    @b249a30 13 INTSXP g0c4 [NAM(2)] (len=10, tl=0) 1,2,3,4,5,... 

的data.table每個元件內具有長度10,和tl=0。目前沒有辦法增加列的truelength,以允許通過引用附加額外的行。

?truelength

目前,它只是列指針列表載體,其是 超額分配(即truelength(DT)),而不是列向量 自己,將要在未來實現快速排插入()

當你評估idata.table不檢查您是否僅返回在同一順序的所有行作爲原(再不敢在這種情況下,僅複製),它簡單地返回副本。

+0

像往常一樣優秀的答案!我會挽救尷尬並放棄我的回答:)。 – Arun 2013-04-08 22:59:56

+0

@mnel:我認爲我對我的問題並不完全清楚,或者我不完全明白你的答案。我的意思是瞭解,當你評估'我',一個副本返回,而不是一個參考..是真的嗎? – Alex 2013-04-08 23:17:34

+0

@Alex正確 - 我已經重寫了我的最後陳述(二讀時不是特別清楚) – mnel 2013-04-08 23:22:33