Asignación por referencia en conjuntos de datos de paquetes cargados
Estoy en el proceso de crear un paquete que usa undata.table
como un conjunto de datos y tiene un par de funciones que se asignan por referencia utilizando:=
.
He construido un paquete simple para demostrar miproblem
library(devtools)
install_github('foo','mnel')
Contiene dos funciones
foo <- function(x){
x[, a := 1]
}
fooCall <- function(x){
eval(substitute(x[, a :=1]),parent.frame(1))
}
y un conjunto de datos (no cargado perezoso)DT
, creado usando
DT <- data.table(b = 1:5)
save(DT, file = 'data/DT.rda')
Cuando instalo este paquete, mi entendimiento es quefoo(DT)
debe asignar por referencia dentro deDT
.
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
Si uso mascorrect
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)
Si yo usoeval
ysubstitute
dentro de la función
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
Debería seguir con
DT <- foo(DT)
o laeval
/substitute
ruta, o¿Hay algo que no entiendo sobre cómodata
carga datasets, incluso cuando no es perezoso?