首页 > 解决方案 > 包含 data.table 名称的变量已就地更改?

问题描述

也许有些人可以告诉我为什么在向我的 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)

标签: rdata.table

解决方案


我们可以创建一个as thecopy和'idVars' 有相同的内存位置namesnames(DT)

tracemem(names(DT))
#[1] "<0x7f9d74c99600>"
tracemem(idVars)
#[1] "<0x7f9d74c99600>"

所以,改为创建copy一个names

idVars <- copy(names(DT))
tracemem(idVars)
#[1] "<0x7f9d7d2b97c8>"

并且在分配后它不会改变

DT[, "c" := 1:10]
idVars
#[1] "a" "b"

根据?copy

copy()执行时可能需要A dt_names = names(DT)。由于 R 的copy-on-modifydt_names仍然指向与names(DT). 因此,现在DT 通过引用进行修改,比如添加新列,dt_names也将得到更新。为避免这种情况,必须明确复制:dt_names <- copy(names(DT)).


推荐阅读