r data.table

¿Cómo suprimir la salida cuando se usa `:=` en R{data.table}, antes de v1.8.3?



(1)

Como <-.data.table no hace una copia, puede usar <- :

Crear un objeto data.table:

library(data.table) di <- data.table(iris)

Crear una nueva columna:

di <- di[, z:=1:nrow(di)] di # Sepal.Length Sepal.Width Petal.Length Petal.Width Species z # [1,] 5.1 3.5 1.4 0.2 setosa 1 # [2,] 4.9 3.0 1.4 0.2 setosa 2 # [3,] 4.7 3.2 1.3 0.2 setosa 3 # [4,] 4.6 3.1 1.5 0.2 setosa 4 # [5,] 5.0 3.6 1.4 0.2 setosa 5 # [6,] 5.4 3.9 1.7 0.4 setosa 6 # [7,] 4.6 3.4 1.4 0.3 setosa 7 # [8,] 5.0 3.4 1.5 0.2 setosa 8 # [9,] 4.4 2.9 1.4 0.2 setosa 9 # [10,] 4.9 3.1 1.5 0.1 setosa 10 # First 10 rows of 150 printed.

También vale la pena recordar que R solo imprime el valor de un objeto en modo interactivo.

Entonces, en modo por lotes, simplemente puedes usar:

di[, z:=1:nrow(di)]

Esto no producirá ningún resultado cuando se ejecute como un script en modo batch.

Más información de Matthew Dowle:

También vea las preguntas frecuentes 2.21 y 2.22:

2.21 ¿Por qué DT[i,col:=value] devuelve la totalidad de DT ? No esperaba un valor visible (consistente con <- ), o un mensaje o valor de retorno que contenga cuántas filas se actualizaron. No es obvio que los datos hayan sido actualizados por referencia.

Para que la sintaxis compuesta pueda funcionar; por ejemplo, DT[i,done:=TRUE][,sum(done)] . El número de filas actualizadas se devuelve cuando la verbosidad está activada, ya sea por consulta o globalmente usando las options(datatable.verbose=TRUE) .

2.22 Ok, pero ¿no puede devolverse el valor de retorno de DT[i,col:=value] manera invisible?

  • Intentamos pero R internamente fuerza la visibilidad para [ . El valor de la columna eval de FunTab (vea src / main / names.c) para [ es 0 significa fuerza R_Visible en (vea la sección 1.6 de R-Internals). Por lo tanto, cuando probamos invisible() o estableciendo R_Visible a 0 directamente nosotros mismos, eval en src / main / eval.c lo forzaría de nuevo.
  • Después de acostumbrarse a este comportamiento, puede llegar a preferirlo (tenemos). Después de todo, ¿cuántas veces realizamos una subasignación usando <- y luego observamos los datos inmediatamente para verificar que está bien?
  • Podemos mezclar := en una j que también devuelve datos; una actualización mixta y seleccione en una consulta. Detectar si j solo actualiza (y luego se comporta de forma diferente) puede ser confuso.

Segunda actualización de Matthew Dowle:

Ahora hemos encontrado una solución y v1.8.3 ya no imprime el resultado cuando se usa := . Actualizaremos las preguntas frecuentes 2.21 y 2.22.

¿Hay alguna forma de evitar que data.table imprima la nueva data.table después de asignar una nueva columna por referencia? Reconozco que el comportamiento estándar es

library(data.table) example(data.table) DT # x y v # 1: a 1 42 # 2: a 3 42 # 3: a 6 42 # 4: b 1 11 # 5: b 3 11 # 6: b 6 11 # 7: c 1 7 # 8: c 3 8 # 9: c 6 9 DT[,z:=1:nrow(DT)] # x y v z # 1: a 1 42 1 # 2: a 3 42 2 # 3: a 6 42 3 # 4: b 1 11 4 # 5: b 3 11 5 # 6: b 6 11 6 # 7: c 1 7 7 # 8: c 3 8 8 # 9: c 6 9 9

Es decir, la tabla se imprime en la pantalla después de la asignación. ¿hay una manera de evitar que data.table muestre la nueva tabla después de asignar la nueva columna z? Sé que puedo detener este comportamiento diciendo

DT <- copy(DT[,z:=1:nrow(DT)])

pero eso es derrotar el propósito de := (que está diseñado para evitar copias).