Atribuindo por referência em conjuntos de dados de pacotes carregados
Eu estou no processo de criar um pacote que usa umdata.table
como um conjunto de dados e tem algumas funções que atribuem por referência usando:=
.
Eu construí um pacote simples para demonstrar minhaproblem
library(devtools)
install_github('foo','mnel')
Ele contém duas funções
foo <- function(x){
x[, a := 1]
}
fooCall <- function(x){
eval(substitute(x[, a :=1]),parent.frame(1))
}
e um conjunto de dados (não carregado com preguiça)DT
, criado usando
DT <- data.table(b = 1:5)
save(DT, file = 'data/DT.rda')
Quando eu instalo este pacote, meu entendimento é quefoo(DT)
deve atribuir por referência dentroDT
.
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
Se eu usar maiscorrect
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)
Se eu usareval
esubstitute
dentro da função
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
Eu deveria ficar com
DT <- foo(DT)
ou oeval
/substitute
rota ouExiste algo que eu não estou entendendo sobre comodata
carrega conjuntos de dados, mesmo quando não é preguiçoso?