r - 包含 data.table 名称的变量已就地更改?
问题描述
也许有些人可以告诉我为什么在向我的 data.table 添加列(而不重新分配它们)后分配给“idVars”的名称会发生变化?我怎样才能坚持分配只存储前两个列名?
谢谢!
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)
解决方案
我们可以创建一个as thecopy
和'idVars' 有相同的内存位置names
names(DT)
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()
执行时可能需要Adt_names = names(DT)
。由于 R 的copy-on-modify,dt_names
仍然指向与names(DT)
. 因此,现在DT
通过引用进行修改,比如添加新列,dt_names
也将得到更新。为避免这种情况,必须明确复制:dt_names <- copy(names(DT))
.
推荐阅读
- mysql - MySQL:错误代码 1114。表已满(表甚至不存在)
- javascript - reactjs - 为什么通过父道具和组件onChange更新表单值状态?
- php - 在 Android Only php 中显示一些东西
- php - 以 HTML 和 PHP 显示的会话开始时间
- ionic3 - Ionic 3 onNotificationClicked() 不订阅 Cordova 地理围栏插件
- java - this.getContext() 可能为空,在使用自定义适配器的片段中
- apache-flink - Flink 可查询状态错误
- security - 执行 npm audit 的建议后没有任何变化
- python - 如何在一次热编码 sklearn 后保留列名?
- markdown - 我可以在降价中重用内容(单一来源)吗?