:=(通过引用传递)data.table包中的运算符同时修改另一个数据表对象

时间:2011-11-06 21:18:16

标签: r pass-by-reference data.table

在测试我的代码时,我发现了以下内容:如果我将data.table DT1分配给DT并随后更改DTDT1会随之更改。因此,DTDT1似乎是内部关联的。这是预期的行为吗?虽然我不是编程专家,但这对我来说是错误的,并且使用简单的R变量或data.frame对其进行测试,我无法重现该行为。这里发生了什么?

DF <- data.frame(ID=letters[1:5],
                  value=1:5)
DF1 <- DF
all.equal(DF1, DF)
[1] TRUE
DF[1, "value"] <- DF[1, "value"]*2
all.equal(DF1, DF)
[1] "Component 2: Mean relative difference: 1"

library(data.table)
data.table 1.7.1  For help type: help("data.table")
DT <- data.table(ID=letters[1:5],
                  value=1:5)
DT1 <- DT
all.equal(DT1, DT)
[1] TRUE
DT[, value:=value*2]
     ID value
[1,]  a     2
[2,]  b     4
[3,]  c     6
[4,]  d     8
[5,]  e    10
all.equal(DT1, DT)
[1] TRUE

1 个答案:

答案 0 :(得分:24)

data.table中的这篇文档会有所帮助。 ? data.table::copy

  

不返回任何值。 data.table通过引用修改。如果您需要副本,请先复制一份(使用DT2 = copy(DT))。 copy()有时也可能在以下之前有用:=用于通过引用分配给列。