【问题标题】:Why sometimes assigments in R are by reference? [duplicate]为什么有时 R 中的作业是通过引用进行的? [复制]
【发布时间】:2019-05-23 05:37:33
【问题描述】:

有时当我使用 R 时,我想制作一个变量的副本以使其保持原样,并在以后使用它来监视更改,R 不会复制该变量,并且所有更改都应用于它们。

为什么会这样?如何预防?下图哪一部分有问题?

但并非一直如此:

【问题讨论】:

  • 你能举个例子吗?
  • 我添加了图片。
  • 看起来您在此处使用data.table 选项 (:=)
  • 使用主要功能是避免复制的包,抱怨它不复制...

标签: r pass-by-reference


【解决方案1】:

问题在于对象的copying。如果你不创建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 仍然指向与名称(DT)相同的内存位置。因此,现在通过引用修改 DT,比如添加一个新列,dt_names 也将得到更新。为避免这种情况,必须明确复制:dt_names


如果我们用&lt;-做赋值,改变后内存位置会改变

a <- 2
b <- a
tracemem(a)
#[1] "<0x7fcedcafc370>"
tracemem(b)
#[1] "<0x7fcedcafc370>"
a <- a + 2
tracemem(a)  # change here
#[1] "<0x7fcedcaa3ba0>"

【讨论】:

  • 我添加了另一张图片。为什么在那种情况下没有发生呢?它们有什么不同吗?
  • @NoLie 在第二种情况下,您正在执行&lt;-,它位于不同的内存位置。
  • 所以,问题是:= 在第一张图片的最后一行,上面写着:biofix := 666 ?
  • @NoLie 我用一个例子更新了帖子,你可以通过tracemem查看对象是否在同一位置更新
猜你喜欢
  • 2013-05-22
  • 1970-01-01
  • 2011-06-20
  • 2011-12-24
  • 2020-03-12
  • 1970-01-01
  • 2012-09-05
  • 2016-02-24
  • 1970-01-01
相关资源
最近更新 更多