This question already has answers here:
Understanding exactly when a data.table is a reference to (vs a copy of) another data.table
(2个答案)
5年前关闭。
当我复制一个data.table并修改新的表时,原始的表被更改了,我无法弄清楚。这是正常行为吗?
更明确地创建新的data.table时,我没有问题:
高温超导
(2个答案)
5年前关闭。
当我复制一个data.table并修改新的表时,原始的表被更改了,我无法弄清楚。这是正常行为吗?
dt = data.table(zone=1:5, pc=11:15)
dtt = dt
dtt[, pc := pc*2 ]
dtt
zone pc
1: 1 22
2: 2 24
3: 3 26
4: 4 28
5: 5 30
dt
zone pc
1: 1 22
2: 2 24
3: 3 26
4: 4 28
5: 5 30
更明确地创建新的data.table时,我没有问题:
dtt = data.table(dt)
最佳答案
当您将新变量分配给已存在的变量时,R不会创建副本,而只是指向新变量,这非常好,因为除非绝对需要,否则您不想复制副本-修改时复制。
此后,由于您使用了:=
运算符(通过引用对其进行了修改),并且由于此刻两个对象都指向同一位置,因此它会反射(reflect)在两个对象上。
解决方法是使用data.table
函数显式复制copy()
,然后按如下方式通过引用进行分配:
dtt = copy(dt) ## dt and dtt are not pointing to same locations anymore
dtt[, pc := pc*2] ## assignment by reference doesn't affect dt
高温超导
关于R数据表的复制和修改更改了原始数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22956098/