有时候,当我使用R并想复制一个变量以使其保持不变,并在以后使用它来监视更改时,R不会复制该变量,并且所有更改都将应用于这两个变量。 / p>
为什么会这样?怎么预防呢?下图的哪一部分是错误的?
但并非始终如此:
答案 0 :(得分:1)
问题在于对象copy
的放置。如果您不创建copy
,则它将在相同的存储位置更改。为避免这种情况,我们可以copy
对象,这样可以防止在第二个对象更改时对其进行任何更改
library(data.table)
b <- copy(a)
一个可复制的例子是
a <- as.data.table(mtcars)
b <- a
b[, v1 := 2]
identical(a, b) # a also changed
#[1] TRUE
如果我们这样做copy
a <- as.data.table(mtcars)
b <- copy(a)
b[, v1 := 2]
identical(a, b)
#[1] FALSE
此外,根据?copy
执行dt_names = names(DT)时可能需要copy()。由于R的修改时复制,dt_names仍与names(DT)指向内存中的相同位置。因此,现在通过引用修改DT,例如通过添加新列,dt_names也将得到更新。为避免这种情况,必须显式复制:dt_names <-copy(names(DT))。
如果我们使用<-
进行分配,则更改后内存位置将更改
a <- 2
b <- a
tracemem(a)
#[1] "<0x7fcedcafc370>"
tracemem(b)
#[1] "<0x7fcedcafc370>"
a <- a + 2
tracemem(a) # change here
#[1] "<0x7fcedcaa3ba0>"