我正在創建一個包,該包使用data.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
和substitute
功能
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
路由或- 有沒有什麼我不理解如何加載數據集,即使不懶惰?
從未嘗試過通過引用數據包更新中!但是包中的數據不是隻有在被封裝_sealed_時纔會被讀取?在這裏輸入'DT'並不意味着它已經被引用分配了嗎? DT可能已被複制到'.GlobalEnv',並且可能是它已被更新的地方。 – 2013-03-04 07:58:25
Btw' tracemem'報告R本身的_duplications_。不太可能捕獲data.table所做的副本,例如,第一次過度分配時,因爲從技術上講,這不是完美的重複,而是過度分配(儘管是淺層複製而不是深層複製)。 – 2013-03-04 08:01:19
也許在包中的數據對象上嘗試'alloc.col',看看會發生什麼。 – 2013-03-04 08:04:17