包含data.table名称的变量是否已更改?

ism*_*gal 2 r data.table

也许有些人可以告诉我为什么我为"dataVars"分配的名字在我的data.table中添加一列后没有改变(没有重新分配它们)?如何保持赋值只存储前两个列名?

谢谢!

编辑:在我看来,这不是这个问题的重复,因为我特别要求一个包含data.table列名的向量,而不是data.table本身.当然机制是相同的,但似乎指出这个机制有什么扩展效果似乎对这个网站上的其他用户有用 - 因此我不会删除这个问题.

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)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

我们可以创建一个copynames作为names(DT)和"idVars"具有相同的内存位置

tracemem(names(DT))
#[1] "<0x7f9d74c99600>"
tracemem(idVars)
#[1] "<0x7f9d74c99600>"
Run Code Online (Sandbox Code Playgroud)

所以,相反创造copynames

idVars <- copy(names(DT))
tracemem(idVars)
#[1] "<0x7f9d7d2b97c8>"
Run Code Online (Sandbox Code Playgroud)

并且在作业完成后它不会改变

DT[, "c" := 1:10]
idVars
#[1] "a" "b"
Run Code Online (Sandbox Code Playgroud)

根据?copy:

一个copy()做的时候可能需要dt_names = names(DT).由于R的复制修改,dt_names仍然指向内存中的相同位置names(DT).因此DT ,现在通过引用修改,例如添加新列,dt_names也将更新.为避免这种情况,必须明确复制:dt_names <- copy(names(DT)).