看来如果一个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
Update
这是一个“特征”,如果列指针向量中没有剩余槽,则将执行浅复制。这data.table
名称绑定到新向量。在相同的范围内它工作得很好。但是,外部作用域无法看到此更改,除非手动将返回值绑定到名称。
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
From help(truelength)
:
然而,对于从磁盘加载的表,R 2.14.0 中的真实长度为 0,R
但似乎如果您将(新加载的)data.table 传递给函数,然后在函数内部通过引用添加,则会发生过度分配,但不会到达全局环境中的符号(仅函数内部的局部符号) )。如果您直接在全局环境中执行此操作或不将 data.table 作为函数参数传递,则它可以工作。
如果 data.table 已经过度分配(通常情况下,除了从磁盘刚加载时之外),则有空闲插槽供该列通过引用添加到其中,并且没有浅复制(以实现过度分配)需要由:=
函数内部。
这可能值得一份错误报告(但我还没有检查是否已经有一个)。
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)