R中data.table的colnames()行为

时间:2019-06-19 09:16:03

标签: r data.table

使用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已更新。这是正常现象吗?

1 个答案:

答案 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"