objetos data.table asignados con: = desde dentro de la función no impresos
Me gustaría modificar a data.table
dentro de una función. Si uso la :=
característica 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 guardo lo devuelto data.table
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ías explicar por qué sucede esto y cómo prevenirlo?
Se corrigió un error en la versión 1.9.6 que introdujo este inconveniente (consulte NOTICIAS 1.9.6, CORRECCIÓN DE ERRORES N.° 1 ).
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
# x y z
# 1: 1 5 4
# 2: 2 6 4
# 3: 3 7 4
Esto se describe en data.table
la pregunta frecuente 2.23 :
¿Por qué a veces tengo que escribir
DT
dos veces después de usarlo:=
para imprimir el resultado en la consola?
Esta es una desventaja desafortunada para que el número 869 funcione. Si
:=
se usa a dentro de una función sinDT[]
antes del final de la función, la próxima vez queDT
se escriba en el mensaje, no se imprimirá nada.DT
Se imprimirá un testamento repetido . Para evitar esto: incluya unDT[]
después del último:=
en su función. Si eso no es posible (por ejemplo, no es una función que pueda cambiar), seprint(DT)
garantizaDT[]
que se imprimirá cuando se le solicite. Como antes, agregar un extra[]
al final de:=
la consulta es un modismo recomendado para actualizar y luego imprimir; por ejemplo >DT[,foo:=3L][]
.