oggetti data.table assegnati con: = dalla funzione interna non stampata

Vorrei modificare un data.table all’interno di una funzione. Se utilizzo la funzione := all’interno della funzione, il risultato viene stampato solo per la seconda chiamata.

Guarda la seguente illustrazione:

 library(data.table) mydt <- data.table(x = 1:3, y = 5:7) myfunction <- function(dt) { dt[, z := y - x] dt } 

Quando chiamo solo la funzione, la tabella non viene stampata (che è il comportamento standard, tuttavia, se salvi il dato restituito.table in un nuovo object, non viene stampato alla prima chiamata, solo per la seconda.

 myfunction(mydt) # nothing is printed result <- myfunction(mydt) result # nothing is printed result # for the second time, the result is printed mydt # xyz # 1: 1 5 4 # 2: 2 6 4 # 3: 3 7 4 

Potresti spiegare perché questo succede e come prevenirlo?

Come David Arenburg menziona in un commento , la risposta può essere trovata qui . È stato corretto un bug nella versione 1.9.6 ma la correzione ha introdotto questo aspetto negativo.

Uno dovrebbe chiamare DT[] alla fine della funzione per evitare questo comportamento.

 myfunction < - function(dt) { dt[, z := y - x][] } myfunction(mydt) # prints immediately # xyz # 1: 1 5 4 # 2: 2 6 4 # 3: 3 7 4 

Mi dispiace se non dovrei pubblicare qualcosa qui che non è una risposta, ma il mio post è troppo lungo per un commento.

Vorrei sottolineare che la soluzione di janosdivenyi di aggiungere un trailing [] a dt non sempre fornisce i risultati attesi (anche quando si utilizza data.table 1.9.6 o 1.10.4) come faccio di seguito.

Gli esempi sottostanti mostrano che se dt è l’ultima riga nella funzione si ottiene il comportamento desiderato senza la presenza del trailing [] , ma se dt non è sull’ultima riga della funzione allora è necessario un trailing [] per ottenere il comportamento desiderato

Il primo esempio mostra che senza il trailing [] su dt ottiene il comportamento previsto quando dt è sull’ultima riga della funzione

 mydt < - data.table(x = 1:3, y = 5:7) myfunction <- function(dt) { df <- 1 dt[, z := y - x] } myfunction(mydt) # Nothing printed as expected mydt # Content printed as desired ## xyz ## 1: 1 5 4 ## 2: 2 6 4 ## 3: 3 7 4 

Aggiungere un trailing [] su dt dà un comportamento inaspettato

 mydt < - data.table(x = 1:3, y = 5:7) myfunction <- function(dt) { df <- 1 dt[, z := y - x][] } myfunction(mydt) # Content printed unexpectedly ## xyz ## 1: 1 5 4 ## 2: 2 6 4 ## 3: 3 7 4 mydt # Content printed as desired ## xyz ## 1: 1 5 4 ## 2: 2 6 4 ## 3: 3 7 4 

Spostare df < - 1 dopo il dt senza trascinamento [] dà un comportamento inaspettato

 mydt < - data.table(x = 1:3, y = 5:7) myfunction <- function(dt) { dt[, z := y - x] df <- 1 } myfunction(mydt) # Nothing printed as expected mydt # Nothing printed unexpectedly 

Spostare df < - 1 dopo il dt con un trailing [] dà il comportamento previsto

 mydt < - data.table(x = 1:3, y = 5:7) myfunction <- function(dt) { dt[, z := y - x][] df <- 1 } myfunction(mydt) # Nothing printed as expected mydt # Content printed as desired ## xyz ## 1: 1 5 4 ## 2: 2 6 4 ## 3: 3 7 4