包含 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】:

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

tracemem(names(DT))
#[1] "<0x7f9d74c99600>"
tracemem(idVars)
#[1] "<0x7f9d74c99600>"

因此,改为创建 copynames

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-modifydt_names 仍然指向与 names(DT) 相同的内存位置。因此现在修改DT 通过引用,比如添加一个新列,dt_names 也将得到更新。为避免这种情况,必须明确复制:dt_names &lt;- copy(names(DT))

【讨论】:

非常感谢!这种行为最近有改变吗?我想知道为什么我之前没有偶然发现这一点。 对解释表示赞同。不知道 R 在那种情况下使用指针。 @ismirsehregal 不确定这种情况下的更改,但通常当我们执行:= 时,如果我想将其分开,我会创建初始对象的副本

以上是关于包含 data.table 名称的变量已就地更改? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

错误:梯度计算所需的变量之一已被就地操作修改

RuntimeError:梯度计算所需的变量之一已被就地操作修改

遇到 RuntimeError:梯度计算所需的变量之一已被就地操作修改

R data.table:如何使用包含列名的 R 变量?

在 R 中,自定义由 dcast.data.table 创建的列的名称

RuntimeError:梯度计算所需的变量之一已被就地操作修改:PyTorch 错误