6

異なる代入演算子を使用すると、data.table に一貫性のない (私にとっては一貫性のない) 動作があることに気付きました。「=」と copy() の違いがまったくわからなかったことを認めなければならないので、ここでいくつかの光を当てることができるかもしれません。以下の copy() の代わりに "=" または "<-" を使用すると、コピーした data.table を変更すると、元の data.table も変更されます。

次のコマンドを実行してください。意味がわかります。

library(data.table)
example(data.table)

DT
   x y  v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1  4
5: b 3  5
6: b 6  6
7: c 1  7
8: c 3  8
9: c 6  9

DT2 = DT

ここで、DT2 の v 列を変更します。

DT2[ ,v:=3L]
   x y  v
1: a 1  3
2: a 3  3
3: a 6  3
4: b 1  3
5: b 3  3
6: b 6  3
7: c 1  3
8: c 3  3
9: c 6  3

しかし、DT に何が起こったのか見てみましょう:

DT
   x y  v
1: a 1  3
2: a 3  3
3: a 6  3
4: b 1  3
5: b 3  3
6: b 6  3
7: c 1  3
8: c 3  3
9: c 6  3

それも変わりました。つまり、DT2 を変更すると、元の DT が変更されました。copy() を使用する場合はそうではありません:

example(data.table)  # reset DT
DT3 <- copy(DT)
DT3[, v:= 3L]
   x y  v
1: a 1  3
2: a 3  3
3: a 6  3
4: b 1  3
5: b 3  3
6: b 6  3
7: c 1  3
8: c 3  3
9: c 6  3

DT
   x y  v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1  4
5: b 3  5
6: b 6  6
7: c 1  7
8: c 3  8
9: c 6  9

この動作は想定されていますか?

4

1 に答える 1

11

はい。これは予想される動作であり、十分に文書化されています。

data.table元のオブジェクトへの参照を使用してインプレース変更を実現するため、非常に高速です。

このため、本当にデータをコピーしたい場合は、以下を使用する必要があります。copy(DT)


のドキュメントから?copy

data.tableは参照によって変更され、(目に見えないように)返されるため、複合ステートメントで使用できます。例:setkey(DT,a)[J("foo")]。コピーが必要な場合は、最初に(を使用して)コピーを取りますDT2=copy(DT)。また、参照によって列にサブ割り当てするために使用されるcopy() 前に役立つ場合もあります。:=を参照してください?copy

この質問も参照してください: data.tableが別のテーブルへの参照である場合と別のテーブルのコピーである場合を正確に理解する

于 2012-06-25T15:35:32.230 に答える