在加载data.table对象后直接使用get(data.table)生成一个新变量

时间:2014-08-28 21:22:55

标签: r data.table

我正在尝试在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)

感谢您的帮助

1 个答案:

答案 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.tablesave之间的内在冲突。为了使其正常工作,我们需要一个特殊的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语义冲突的这个模糊区域中踩踏。