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