首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >包含data.table名称的变量是否已更改?

包含data.table名称的变量是否已更改?
EN

Stack Overflow用户
提问于 2018-10-19 00:50:06
回答 1查看 119关注 0票数 2

也许有些人可以告诉我,为什么在向我的data.table添加列之后,我分配给"idVars“的名称会发生变化(不需要重新分配它们)?如何将赋值持久化以仅存储前两个列名?

谢谢!

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-19 00:52:25

我们可以创建namescopy,因为names(DT)和'idVars‘具有相同的内存位置

代码语言:javascript
复制
tracemem(names(DT))
#[1] "<0x7f9d74c99600>"
tracemem(idVars)
#[1] "<0x7f9d74c99600>"

因此,改为创建namescopy

代码语言:javascript
复制
idVars <- copy(names(DT))
tracemem(idVars)
#[1] "<0x7f9d7d2b97c8>"

它不会在任务完成后改变

代码语言:javascript
复制
DT[, "c" := 1:10]
idVars
#[1] "a" "b"

根据?copy的说法

执行dt_names = names(DT)时可能需要copy()。由于R的修改时复制,dt_names仍然指向与names(DT)相同的内存位置。因此,现在通过引用修改DT,比如添加一个新列,dt_names也会得到更新。要避免这种情况,必须显式复制:dt_names <- copy(names(DT)).

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52878907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档