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

Resuelto janosdivenyi asked hace 54 años • 2 respuestas

Me gustaría modificar a data.tabledentro 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.tableen 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?

janosdivenyi avatar Jan 01 '70 08:01 janosdivenyi
Aceptado

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.tablela pregunta frecuente 2.23 :

¿Por qué a veces tengo que escribir DTdos 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 sin DT[]antes del final de la función, la próxima vez que DTse escriba en el mensaje, no se imprimirá nada. DTSe imprimirá un testamento repetido . Para evitar esto: incluya un DT[]después del último :=en su función. Si eso no es posible (por ejemplo, no es una función que pueda cambiar), se print(DT)garantiza DT[]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][].

janosdivenyi avatar Oct 07 '2015 10:10 janosdivenyi