自分自身のためにいくつかの問題を解決するために、コピーがいつ作成され、いつコピーされないかをよりよく理解したいと思いdata.table
ます。this question が指摘しているように、 data.table が別の data.table への参照である場合 (vs のコピー) を正確に理解する場合、単純に次を実行すると、元のものが変更されます。
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
(上記で変更)