也许有人可以告诉我为什么我在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)
答案 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))
。