我有一个data.frame orig
,它是子集并分配给cpy
。
library(data.table)
orig <- data.frame(id=letters[c(2,1,2,1)], col1=c(300,46,89,2),
col2=1:4, col3=1:4)
print(orig)
# id col1 col2 col3
# b 300 1 1
# a 46 2 2
# b 89 3 3
# a 2 4 4
cpy <- orig[,c("id","col1","col2")]
cpy
是orig
的浅表副本,并引用orig
的部分内容(除了省略的列外)。
由于cpy
是orig
的子集,因此它仅引用共享列,setDT(cpy)
的引用更新功能不会发挥作用。这会使orig
和cpy
处于潜在危险状态,只会共享指向其子列的指针。
setDT(cpy)
.Internal(inspect(orig))
.Internal(inspect(cpy))
如果现在setkey
已应用于cpy
其列,那么orig
中的列将被排序(此处按引用更新播放)。省略的列(col3
)不受排序的影响,因为它们在cpy
中未知。然后它们与对象的其余部分不同步。
setkey(cpy,id,col1)
print(cpy)
# id col1 col2
# a 2 4
# a 46 2
# b 89 3
# b 300 1
print(orig)
# id col1 col2 col3
# a 2 4 1
# a 46 2 2
# b 89 3 3
# b 300 1 4
要避免此行为,在分配cpy
(例如copy()
)时强制深层而不是浅层副本的任何操作都会中断对orig
的引用,从而防止不必要的混乱那里。
cpy
是否有任何方法不会丢失对象orig
本身及其省略的列的引用?