31

在测试我的代码时,我发现了以下内容:如果我将 data.table 分配DT1DT并在DT之后进行DT1更改,则随之更改。因此DTDT1似乎是内部联系的。这是预期的行为吗?尽管我不是编程专家,但这对我来说似乎是错误的,并且使用简单的 R 变量或 a 对其进行测试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
4

1 回答 1

29

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

不返回任何值。data.table 通过引用进行修改。如果需要副本,请先获取副本(使用 DT2=copy(DT))。在 := 用于通过引用对列进行子分配之前,copy() 有时也可能很有用。

于 2011-11-06T21:34:56.467 回答