¿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[
es0
significa fuerzaR_Visible
en (vea la sección 1.6 de R-Internals). Por lo tanto, cuando probamosinvisible()
o estableciendoR_Visible
a0
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 unaj
que también devuelve datos; una actualización mixta y seleccione en una consulta. Detectar sij
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).