为什么有时在R中的引用是作为参考?

时间:2019-05-23 05:37:34

标签: r pass-by-reference

有时候,当我使用R并想复制一个变量以使其保持不变,并在以后使用它来监视更改时,R不会复制该变量,并且所有更改都将应用于这两个变量。 / p>

为什么会这样?怎么预防呢?下图的哪一部分是错误的?

ad

但并非始终如此:

enter image description here

1 个答案:

答案 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>"