2012-07-06 10 views
24

¿Hay alguna manera de evitar que data.table imprima la nueva tabla de datos después de asignar una nueva columna por referencia? El comportamiento estándar escómo suprimir la salida cuando se utiliza `: =` en R {data.table}, antes de v1.8.3?

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 alguna 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).

Respuesta

25

Desde <-.data.table no hace una copia, puede utilizar <-:

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 interactiv e modo.

Así, en el modo por lotes, puede simplemente usar:

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

Esto no producirá salida, cuando se ejecuta como una secuencia de comandos en modo batch.


Más información de Mateo Dowle:

Véase también FAQ 2.21 y 2.22:

2,21 ¿Por qué DT[i,col:=value] devolución de la totalidad de DT? No esperaba ningún valor visible (consistente con <-), o un mensaje o valor de retorno que contenía cuántas filas se actualizaron. No es obvio que los datos se hayan actualizado por referencia.

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

2.22 Bien, pero ¿no se puede devolver el valor de retorno de DT[i,col:=value] de forma invisible, entonces?

  • Intentamos pero obliga R internamente para visibilidad en [. El valor de La columna de evaluación de FunTab (consulte src/main/names.c) para [ es 0, que significa fuerza R_Visible activada (consulte la sección 1.6 de R-Internals). Por lo tanto, cuando probamos invisible() o estableciendo R_Visible en 0 directamente con nosotros mismos, eval en src/main/eval.c lo volvería a forzar.
  • Después de acostumbrarse a este comportamiento, puede llegar a preferirlo (tenemos). Después de todo, ¿cuántas veces asignamos usando <- y luego miramos de inmediato los datos para verificar que estén correctos?
  • Podemos mezclar := en un j que también devuelve datos; una actualización mixta y seleccione en una consulta. Para detectar si j solo actualiza (y luego se comporta de manera diferente) podría ser confuso.

Segunda actualización de Mateo Dowle:

ahora hemos encontrado una solución y v1.8.3 ya no imprima el resultado cuando se utiliza :=. Actualizaremos las preguntas más frecuentes 2.21 y 2.22.

+0

Gracias! Usaré '<-' en ese caso. –

+2

+10 No pensé en probar 'DT <-DT [i, col: = value]'. La repetición del nombre de la variable no es genial, pero funciona. Eso me da una idea de cómo hacer que 'DT [i, col: = value]' regrese de manera invisible: ahora aparece como [FR # 2128] (https://r-forge.r-project.org/tracker/index. php? func = detail & aid = 2128 & group_id = 240 & atid = 978), gracias! –

+0

+1 para el poderoso hack inteligente + fragmento interesante de las preguntas frecuentes. –

Cuestiones relacionadas