使用colnames()函数和data.table似乎会将结果变量转换为“通过引用传递”的变量。我正在使用R 3.6.0和data.table 1.12.2
library(data.table)
DT = data.table(
ID = c("b","b","b","a","a","c"),
a = 1:6,
b = 7:12,
c = 13:18
)
column_names = colnames(DT)
DT[, e := 23:28]
column_names
我希望column_names为“ ID”,“ a”,“ b”和“ c”,不包括新添加的列“ e”。但是column_names已更新。这是正常现象吗?
答案 0 :(得分:2)
我们需要使用copy
来避免根据?copy
的文档在分配后对其进行更改
执行dt_names = names(DT)时可能需要copy()。由于R的修改时复制,dt_names仍与names(DT)指向内存中的相同位置。因此,现在通过引用修改DT,例如通过添加新列,dt_names也将得到更新。为避免这种情况,必须显式复制:dt_names <-copy(names(DT))
所以,我们这样做
column_names = copy(colnames(DT))
现在,分配后
DT[, e := 23:28]
column_names
#[1] "ID" "a" "b" "c"