R 包含数据的变量。是否就地更改了表名?

R 包含数据的变量。是否就地更改了表名?,r,data.table,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" # de

也许有些人可以告诉我,为什么在向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)
库(data.table)

DT我们可以创建
名称的
副本
,因为
名称(DT)
和'idVars'具有相同的内存位置

tracemem(names(DT))
#[1] "<0x7f9d74c99600>"
tracemem(idVars)
#[1] "<0x7f9d74c99600>"
而且在任务完成后也不会改变

DT[, "c" := 1:10]
idVars
#[1] "a" "b"
根据
?复制


执行
dt\u names=names(dt)
时,可能需要
copy()
。由于R在修改时复制,
dtu名称
仍然指向与
names(dt)
相同的内存位置。因此,现在通过引用修改
DT
,比如通过添加一个新列,
DT\u name
也将得到更新。为了避免这种情况,我们必须明确地复制:
dtu名称非常感谢!最近这种行为改变了吗?我想知道为什么我之前没有被这件事绊倒。对解释投赞成票。不知道R在这种情况下使用指针。@ismirsehregal不确定这种情况下的更改,但通常在执行
:=
时,如果要将初始对象分开,我会创建一个副本
DT[, "c" := 1:10]
idVars
#[1] "a" "b"