我正在尝试在data.table中生成一个新变量,我生成,保存并再次加载。加载后我通过get()间接地对data.table进行加法,这对于生成新变量不起作用,只要我之前不直接为变量创建它。 可能是某种环境问题?
# Generate data.table
t<-data.table(x=c(1,2,3,4))
tStr<-"t"
names(t)
# Generate Variable a -> ok
get(tStr)[, a:=1]
names(t)
# Generate Variable b -> ok
t[, b:=1]
names(t)
# Save
save(t, file="test.Robj")
load("test.Robj", .GlobalEnv)
# Generate Variable c -> fails
get(tStr)[, c:=1]
names(t)
# Generate Variable d -> ok
t[, d:=1]
names(t)
# Generate Variable e -> ok again !?
get(tStr)[, e:=1]
names(t)
感谢您的帮助
答案 0 :(得分:4)
这是因为重要的元数据无法在存储操作中存活:
> 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
个对象时重新分配内部指针。
在这种情况下,使用参考修改似乎重置指针。
编辑:作为用例的解决方法,您可以尝试:
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语义冲突的这个模糊区域中踩踏。