setkeys在子集的数据帧的浅拷贝上打破原点

时间:2018-04-10 17:15:45

标签: r data.table

我有一个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")]

cpyorig的浅表副本,并引用orig的部分内容(除了省略的列外)。

由于cpyorig的子集,因此它仅引用共享列,setDT(cpy)的引用更新功能不会发挥作用。这会使origcpy处于潜在危险状态,只会共享指向其子列的指针。

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本身及其省略的列的引用?

0 个答案:

没有答案