r - 如果对象是从文件中新加载的,data.table 不会通过引用修改?

标签 r data.table

似乎如果 data.table 是新加载的,包含 := 的函数不会通过引用修改。

有人可以复制吗?是错误吗?

test<-function(data){data[,ppp:=1]}

a<-data.table(x=1:2)
save(a,file="ttt")
load("ttt")
test(a) # show ppp
a # doesn't have ppp


b<-data.table(x=1:2)
test(b) # show ppp
b # has ppp

更新

有点“特征”的是,如果列指针向量中没有剩余槽,则会执行浅拷贝。 data.table 名称绑定(bind)到新向量。它在同一范围内工作正常。但是,除非手动将返回值绑定(bind)到名称,否则外部作用域看不到此更改。

options(datatable.alloccol=4)
options(datatable.verbose=TRUE)
a<-as.data.table(matrix(1:20, ncol=4))
truelength(a) # 4
test<-function(x){print(truelength(x));x[,pp:=1];print(truelength(x));x}
test(a)
a # doesn't change

最佳答案

data.table 需要在内存中过度分配才能通过引用添加列。加载后情况并非如此:

load("ttt")
length(a)
#[1] 1
truelength(a)
#[1] 0

b <- data.table(x=1:2)
length(b)
#[1] 1
truelength(b)
#[1] 100

来自 help(truelength):

For tables loaded from disk however, truelength is 0 in R 2.14.0 and random in R <= 2.13.2; i.e., in both cases perhaps unexpected. data.table detects this state and over-allocates the loaded data.table when the next column addition or deletion occurs.

但似乎如果您将一个(新加载的)data.table 传递给一个函数,然后在函数内部通过引用添加,就会发生过度分配,但不会在全局环境中达到 up 符号(仅函数内的局部符号)。如果您直接在全局环境中执行此操作或不将 data.table 作为函数参数传递,它就可以工作。

如果 data.table 已经过度分配(通常是这种情况,除了刚从磁盘加载时),则有备用槽用于通过引用添加列,并且没有浅拷贝(以实现over-allocation) 需要在函数内部通过 := 来完成。

这可能值得一个错误报告(但我还没有检查是否已经有一个)。

R version 3.0.1 (2013-05-16)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] de_DE.UTF-8/de_DE.UTF-8/de_DE.UTF-8/C/de_DE.UTF-8/de_DE.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] microbenchmark_1.3-0 data.table_1.8.8    

loaded via a namespace (and not attached):
[1] tools_3.0.1

关于r - 如果对象是从文件中新加载的,data.table 不会通过引用修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18494284/

相关文章:

r - 将十六进制字符向量转换为 R 中的原始向量

list - 将列表写入文本文件,保留名称,R

r - 在 R 中,dataframe[-NULL] 返回空数据帧

r - 按组对前 500 行进行子集,用于组的子集

r - 仅选择出现在其他因素的每个水平中的那些水平的因素

r - 如何在R data.table中有效地找到具有非零值的最后一行

r - 为什么 knitr 不尊重 RStudio 项目细节?

R 的随机森林无法分配大小为 7.5 Gb 的向量

r - 在 for 循环中对 data.table 进行子集化较慢且资源匮乏

r - 合并具有重叠值的行