2012-07-06 14 views
24

C'è un modo per impedire a data.table di stampare il nuovo data.table dopo aver assegnato una nuova colonna per riferimento? Il comportamento standard ècome sopprimere l'output quando si utilizza `: =` in R {data.table}, prima della 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 

ovvero la tabella viene stampata sullo schermo dopo l'assegnazione. c'è un modo per fermare data.table dal mostrare la nuova tabella dopo aver assegnato la nuova colonna z? So che posso fermare questo comportamento dicendo

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

ma che sta sconfiggendo lo scopo di := (che è stato progettato per evitare copie).

risposta

25

Dal <-.data.table non fa una copia, è possibile utilizzare <-:

Creare un oggetto data.table:

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

creare una nuova colonna:

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. 

Vale anche la pena di ricordare che R stampa solo il valore di un oggetto in interattivo e modalità.

Quindi, in modalità batch, si può semplicemente utilizzare:

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

Questo non produrrà alcun output quando viene eseguito come uno script in modalità batch.


Maggiori informazioni del Matthew Dowle:

vedere anche FAQ 2.21 e 2.22:

2,21 Perché il DT[i,col:=value] restituire l'intera DT? Mi aspettavo un valore non visibile (coerente con <-) o un messaggio o un valore di ritorno contenente il numero di righe aggiornate. Non è ovvio che i dati siano stati effettivamente aggiornati per riferimento.

In modo che la sintassi composta possa funzionare; ad es., DT[i,done:=TRUE][,sum(done)]. Il numero di righe aggiornate viene restituito quando la verbosità è attiva, su base per query o globalmente utilizzando options(datatable.verbose=TRUE).

2.22 Ok, ma non è possibile restituire il valore restituito di DT[i,col:=value] in modo invisibile, quindi?

  • abbiamo provato a ma R costringe internamente visibilità per [. Il valore di colonna eval di FunTab (vedere src/main/names.c) per [ è 0 indicando la forza R_Visible (consultare la sezione R-Internals 1.6). Pertanto, quando abbiamo provato invisible() o impostando R_Visible a 0 direttamente noi stessi, eval in src/main/eval.c lo forza nuovamente.
  • Dopo essersi abituato a questo comportamento, si potrebbe crescere per preferirlo (abbiamo). Dopotutto, quante volte ricodifichiamo utilizzando <- e poi guardiamo immediatamente i dati per verificare che sia ok?
  • Possiamo mescolare := in un j che restituisce anche i dati; un aggiornamento misto e selezionare in una query. Per scoprire se j si aggiorna solo (e quindi si comporta diversamente) potrebbe essere fonte di confusione.

Secondo aggiornamento da Matthew Dowle:

ora abbiamo trovato una soluzione e non è più v1.8.3 stampa il risultato quando si utilizza :=. Aggiorneremo le domande frequenti 2.21 e 2.22.

+0

Grazie! Userò '<-' in quel caso. –

+2

+10 Non ho pensato di provare 'DT <-DT [i, col: = value]'. La ripetizione del nome della variabile non è eccezionale, ma funziona. Questo mi dà un'idea di come ottenere 'DT [i, col: = value]' per tornare invisibilmente: ora sollevato come [FR # 2128] (https://r-forge.r-project.org/tracker/index). php? func = detail & aid = 2128 & group_id = 240 & atid = 978), grazie! –

+0

+1 per il trucco intelligente più potente + lo snippet interessante delle FAQ. –

Problemi correlati