我正在创建一个包,该包使用 adata.table
作为数据集并具有几个函数,这些函数使用:=
.
我已经建立了一个简单的包来展示我的problem
library(devtools)
install_github('foo','mnel')
它包含两个功能
foo <- function(x){
x[, a := 1]
}
fooCall <- function(x){
eval(substitute(x[, a :=1]),parent.frame(1))
}
和一个数据集(不是延迟加载)DT
,使用创建
DT <- data.table(b = 1:5)
save(DT, file = 'data/DT.rda')
当我安装这个包时,我的理解是foo(DT)
应该在DT
.
library(foo)
data(DT)
foo(DT)
b a
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
# However this has not assigned by reference within `DT`
DT
b
1: 1
2: 2
3: 3
4: 4
5: 5
如果我使用更多correct
tracmem(DT)
DT <- foo(DT)
# This works without copying
DT
b a
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
untracemem(DT)
如果我在函数内使用eval
andsubstitute
fooCall(DT)
b a
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
# it does assign by reference
DT
b a
1: 1 1
2: 2 1
3: 3 1
4: 4 1
5: 5 1
我应该坚持
DT <- foo(DT)
或eval
/substitute
路线,或- 有什么我不了解如何
data
加载数据集的地方,即使不是懒惰的?