也许有些人可以告诉我,为什么在向我的data.table添加列之后,我分配给"idVars“的名称会发生变化(不需要重新分配它们)?如何将赋值持久化以仅存储前两个列名?
谢谢!
library(data.table)
DT <- data.table(a=1:10, b=1:10)
idVars <- names(DT)
print(idVars)
# [1] "a" "b"
DT[, "c" := 1:10]
print(idVars)
# [1] "a" "b" "c"
# devtools::session_info()
# data.table * 1.11.6 2018-09-19 CRAN (R 3.5.1)
发布于 2018-10-19 00:52:25
我们可以创建names
的copy
,因为names(DT)
和'idVars‘具有相同的内存位置
tracemem(names(DT))
#[1] "<0x7f9d74c99600>"
tracemem(idVars)
#[1] "<0x7f9d74c99600>"
因此,改为创建names
的copy
idVars <- copy(names(DT))
tracemem(idVars)
#[1] "<0x7f9d7d2b97c8>"
它不会在任务完成后改变
DT[, "c" := 1:10]
idVars
#[1] "a" "b"
根据?copy
的说法
执行
dt_names = names(DT)
时可能需要copy()
。由于R的修改时复制,dt_names
仍然指向与names(DT)
相同的内存位置。因此,现在通过引用修改DT
,比如添加一个新列,dt_names
也会得到更新。要避免这种情况,必须显式复制:dt_names <- copy(names(DT))
.
https://stackoverflow.com/questions/52878907
复制相似问题