这是因为重要的元数据无法在存储操作中保留下来:
> t<-data.table(x=c(1,2,3,4))
> attr(t, ".internal.selfref")
<pointer: 0x0000000000100788>
> save(t, file="test.Robj")
> load("test.Robj", .GlobalEnv)
> attr(t, ".internal.selfref")
<pointer: (nil)>
> t[, d:=1]
> attr(t, ".internal.selfref")
<pointer: 0x0000000000100788>
注意你是如何丢失内存指针的。我不确定这到底是一个错误,还是一个data.table
是什么save
做。看来为了让它正常工作,我们需要一个特殊的load
加载时重新分配内部指针的方法data.table
对象。
在这种情况下,使用引用修改似乎会重置指针。
EDIT:作为您的用例的解决方法,您可以尝试:
t <- data.table(x=c(1,2,3,4))
save(t, file="test.Robj")
load("test.Robj", .GlobalEnv)
assign("t", get("t")[, c:=3])
t
其按预期工作:
x c
1: 1 3
2: 2 3
3: 3 3
4: 4 3
另请注意,期望:
get("t")[, c:=3]
会起作用有点像期待:
get("x") <- 5
将工作。data.table
将来可能会添加此功能,但您是否正在踏入这个模糊的区域,其中的参考性质data.table
确实开始与 R 语义发生冲突。