gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:40:14 25 4
gpt4 key购买 nike

我正在尝试在我生成、保存并再次加载的 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)

谢谢你的帮助

最佳答案

这是因为重要的元数据无法在存储操作中存活:

> 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 语义发生冲突.

关于r - 加载data.table对象后直接用get(data.table)生成一个新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25558238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com