首页 > 解决方案 > R 中 data.table 的 colnames() 行为

问题描述

将 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 已更新。这种行为正常吗?

标签: rdata.table

解决方案


我们需要使用copy它来避免它在分配后根据文档进行更改?copy

执行 dt_names = names(DT) 时可能需要一个 copy()。由于 R 的修改时复制,dt_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" 

推荐阅读