¿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 deDT? 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 lasoptions(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[es0significa fuerzaR_Visibleen (vea la sección 1.6 de R-Internals). Por lo tanto, cuando probamosinvisible()o estableciendoR_Visiblea0directamente nosotros mismos,evalen 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 unajque también devuelve datos; una actualización mixta y seleccione en una consulta. Detectar sijsolo 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).