tutorial style formatstyle extension data r function data.table assignment-operator

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



render table shiny (2)

Me gustaría modificar un data.table dentro de una función. Si uso 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 llamo solo a 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 para la segunda.

myfunction(mydt) # nothing is printed result <- myfunction(mydt) result # nothing is printed result # for the second time, the result is printed mydt # x y z # 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 comment , la respuesta se puede encontrar github.com/Rdatatable/data.table/blob/master/… . Se solucionó un error en la versión 1.9.6, pero la solución introdujo este inconveniente.

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

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


Lo siento si no debo publicar algo aquí que no sea 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 final [] a dt no siempre da los resultados esperados (incluso cuando uso 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, se obtiene el comportamiento deseado sin la presencia del final [] , pero si dt no está en la última línea de la función, se necesita un final [] para obtener el comportamiento deseado

El primer ejemplo muestra que sin trailing [] 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 ## x y z ## 1: 1 5 4 ## 2: 2 6 4 ## 3: 3 7 4

Agregar un final [] 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 ## x y z ## 1: 1 5 4 ## 2: 2 6 4 ## 3: 3 7 4 mydt # Content printed as desired ## x y z ## 1: 1 5 4 ## 2: 2 6 4 ## 3: 3 7 4

Mover df <- 1 a después de 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 de dt con un final [] 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 ## x y z ## 1: 1 5 4 ## 2: 2 6 4 ## 3: 3 7 4