objetos data.table asignados con: = desde dentro de la función no impresa

Me gustaría modificar una data.table dentro de una función. Si utilizo la función := dentro de la función, el resultado solo se imprime para la segunda llamada.

Mira la siguiente ilustración:

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

Cuando invoco solo la función, la tabla no se imprime (que es el comportamiento estándar. Sin embargo, si data.table la data.table devuelta en un nuevo objeto, no se imprime en la primera llamada, solo en la segunda.

 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 

¿Podría explicar por qué sucede esto y cómo prevenirlo?

Como David Arenburg menciona en un comentario , la respuesta se puede encontrar aquí . Se corrigió un error en la versión 1.9.6 pero el arreglo introdujo este inconveniente.

Se debe llamar DT[] al final de la función para evitar este comportamiento.

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

Lo siento si se supone que no debo publicar algo aquí que no es una respuesta, pero mi publicación es demasiado larga para un comentario.

Me gustaría señalar que la solución de janosdivenyi de agregar un seguimiento [] a dt no siempre da los resultados esperados (incluso cuando se utiliza data.table 1.9.6 o 1.10.4) como lo hago a continuación.

Los ejemplos a continuación muestran que si dt es la última línea de la función, uno obtiene el comportamiento deseado sin la presencia del seguimiento [] , pero si dt no está en la última línea de la función, entonces se necesita un seguimiento [] para obtener el comportamiento deseado

El primer ejemplo muestra que sin seguimiento [] en dt obtenemos el comportamiento esperado cuando dt está en la última línea de la función

 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 

Agregar un seguimiento [] en dt da un comportamiento inesperado

 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 

Mover df <- 1 a después del dt sin seguimiento [] da un comportamiento inesperado

 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 

Mover df <- 1 después del dt con un seguimiento [] da el comportamiento esperado

 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