包含 data.table 名称的变量已就地更改? [复制]
Posted
技术标签:
【中文标题】包含 data.table 名称的变量已就地更改? [复制]【英文标题】:Variable containing data.table names changed in place? [duplicate] 【发布时间】:2019-03-23 13:13:54 【问题描述】:也许有些人可以告诉我为什么在我的 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)
【问题讨论】:
【参考方案1】:我们可以创建names
的copy
,因为names(DT)
和“idVars”具有相同的内存位置
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
:
执行
dt_names = names(DT)
时可能需要copy()
。由于 R 的 copy-on-modify,dt_names
仍然指向与names(DT)
相同的内存位置。因此现在修改DT
通过引用,比如添加一个新列,dt_names
也将得到更新。为避免这种情况,必须明确复制:dt_names <- copy(names(DT))
。
【讨论】:
非常感谢!这种行为最近有改变吗?我想知道为什么我之前没有偶然发现这一点。 对解释表示赞同。不知道 R 在那种情况下使用指针。 @ismirsehregal 不确定这种情况下的更改,但通常当我们执行:=
时,如果我想将其分开,我会创建初始对象的副本以上是关于包含 data.table 名称的变量已就地更改? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
RuntimeError:梯度计算所需的变量之一已被就地操作修改
遇到 RuntimeError:梯度计算所需的变量之一已被就地操作修改