似乎如果a 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
Run Code Online (Sandbox Code Playgroud)
如果在列指针向量中没有剩余的槽,则有一个"特征",将执行浅拷贝.该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
Run Code Online (Sandbox Code Playgroud)
需要在内存中过度分配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
Run Code Online (Sandbox Code Playgroud)
来自help(truelength):
但是对于从磁盘加载的表,在R 2.14.0中truelength为0,在R <= 2.13.2中随机为0; 也就是说,在两种情况下都可能出乎 data.table检测此状态,并在下一列添加或删除发生时过度分配已加载的data.table.
但似乎你将一个(新加载的)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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |