我有点难以理解为什么数据表更新不同数据表的列。
请考虑以下可重现的代码。
library(data.table)
dt <- data.table(a=rep(letters[1:4], 5),
b=rep(letters[5:8], 5),
c=rep(letters[3:6], 5),
x=sample(1:100, 20),
y=sample(1:100, 20),
z=sample(1:100, 20))
假设我将 dt 分配给 dt.1:
dt.1 <- dt
接下来,假设我通过引用更新 dt.1 中的一列:
dt.1[, x:= x^2]
列 x 确实是平方的,但 dt 中的列 x 也是平方的,即
dt[,x :=x^2]
在后台执行。
为什么会发生这种情况,如何防止这种类型的更新/依赖关系发生?
谢谢
因为data.table
的引用语义正在做
dt.1 <- dt
表示dt.1
和dt
引用内存中的同一对象。修改一个会修改另一个。换句话说,dt.1
是dt.
的浅拷贝(指针的副本(
您可以通过执行以下操作来执行深层复制
dt.1 <- copy(dt)
这将在内存中创建dt
的第二个副本。对dt.1
的任何修改都不会影响原始副本dt
。