【发布时间】:2019-05-23 05:37:33
【问题描述】:
【问题讨论】:
-
你能举个例子吗?
-
我添加了图片。
-
看起来您在此处使用
data.table选项 (:=) -
使用主要功能是避免复制的包,抱怨它不复制...
标签: r pass-by-reference
【问题讨论】:
data.table 选项 (:=)
标签: r pass-by-reference
问题在于对象的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
如果我们用<-做赋值,改变后内存位置会改变
a <- 2
b <- a
tracemem(a)
#[1] "<0x7fcedcafc370>"
tracemem(b)
#[1] "<0x7fcedcafc370>"
a <- a + 2
tracemem(a) # change here
#[1] "<0x7fcedcaa3ba0>"
【讨论】:
<-,它位于不同的内存位置。
:= 在第一张图片的最后一行,上面写着:biofix := 666 ?
tracemem查看对象是否在同一位置更新