只是爲了自己清理一些東西,我想更好地理解何時創建副本以及何時不在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
(高於此改變)
即使'newDT < - DT [x <11]'也會創建一個副本。通過子集創建'newDT'後,'newDT [,b:= 5]'。使用'tracemem'和'.Internal(inspect(。))'是理解這一點的信息工具。 – Arun 2013-04-08 22:39:15
@阿倫:對不起,我不確定我是否理解你的觀點。你能解釋一下你指的是什麼嗎?你的意思是說第一個例子和第二個例子會一樣嗎?在那種情況下是的 - 這是真的。我只是想要一個單獨的例子來說清楚。 – Alex 2013-04-08 22:42:06
當然,你能解釋一下你指的是哪個'j'語句:'據我瞭解,這種情況發生的原因是因爲當你執行一個j語句時,只是爲了確定。我會用我之前談論的內容寫一個答案。 – Arun 2013-04-08 22:46:27