r - 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 已更新。这种行为正常吗?
解决方案
我们需要使用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"
推荐阅读
- c++ - 无法从文件中读取视频,但可以从相机中读取
- ios - 后台推送通知不起作用iOS12 Swift4.2
- python - 如何一个接一个地播放视频的多个片段
- sql - 根据多条记录创建 SQL 查询?
- regex - 提取子字符串 bash
- graphql - 使用种子文件将数据从 JSON 文件添加到 Prisma 数据库
- jquery - jQuery 仅在 div 之前未附加的情况下附加?
- javascript - Javascript中的Excel ROUND函数
- c++ - 关于原子自旋锁和 std::this_thread::yield() 的问题
- java - 如何在使用 Spring Boot 生成 jOOQ 代码之前运行 Flyway 迁移?