Sono in fase di creazione di un pacchetto che utilizza un set di dati data.table
e ha un paio di funzioni che assegnano per riferimento utilizzando :=
.Assegnazione per riferimento nei set di dati del pacchetto caricato
ho costruito un pacchetto semplice per dimostrare il mio problem
library(devtools)
install_github('foo','mnel')
Contiene due funzioni
foo <- function(x){
x[, a := 1]
}
fooCall <- function(x){
eval(substitute(x[, a :=1]),parent.frame(1))
}
e un set di dati (non pigro carico) DT
, creati utilizzando
DT <- data.table(b = 1:5)
save(DT, file = 'data/DT.rda')
Quando installo questo pacchetto, la mia comprensione è che foo(DT)
debba essere assegnato per riferimento entro 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
Se uso il più 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)
Se uso eval
e substitute
all'interno della funzione
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
Devo restare con
DT <- foo(DT)
oeval
/substitute
route, o- C'è qualcosa che non capisco su come
data
carica set di dati, anche quando non è pigro?
mai cercato di aggiornare con i dati di riferimento nei pacchetti! Ma i dati nei pacchetti non dovrebbero essere letti solo dato che sono _sealed_? Digitare 'DT' alla fine qui non significa che sia stato assegnato per riferimento, vero? DT potrebbe essere stato copiato in '.GlobalEnv' e potrebbe essere dove è stato aggiornato. –
Btw 'tracemem' riporta _duplications_ da R stesso. È improbabile che riesca a catturare una copia di data.table, ad esempio quando si esegue una sovra-allocazione per la prima volta perché tecnicamente non è una duplicazione perfetta, ma un'eccessiva allocazione (anche se una copia superficiale non è profonda). –
Forse prova 'alloc.col' sull'oggetto dati nel pacchetto e vedi cosa succede. –