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

时间:2018-10-18 16:50:06

标签: r data.table

也许有人可以告诉我为什么我在data.table中添加一列(而不重新分配它们)后,为我分配给“ idVars”的名称发生了变化?我如何才能坚持分配以仅存储前两个列名?

谢谢!

编辑:在我看来,这不是this问题的重复,因为我专门要求一个包含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)

1 个答案:

答案 0 :(得分:5)

我们可以在copy中创建一个names,因为names(DT)和'idVars'具有相同的内存位置

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()时可能需要dt_names = names(DT)。由于R的修改时复制dt_names仍然指向内存中与names(DT)相同的位置。因此,现在通过引用来修改DT ,例如通过添加新列,dt_names也将得到更新。为避免这种情况,必须明确复制:dt_names <- copy(names(DT))