2016-01-08 13 views
6

Qui sta succedendo qualcosa di davvero strano. Nel codice qui sotto, creo una variabile denominata temp. Devo chiamarlo due volte prima di poter vedere di cosa si tratta. Per esempio. La prima volta che lo chiamo, la console non mostra nulla. La seconda volta mostra lo data.table/data.frame che è. Qualcuno può aiutarmi a capire cosa sta succedendo qui?Devo chiamare la variabile due volte prima di valutare?

library(magrittr) 
library(data.table) 

myDT <- as.data.table(mtcars) 


temp <- 
    myDT %>% 
    melt(id.vars = c('cyl', 'mpg', 'hp'), 
     measure.vars = c('vs','am','gear','carb'), 
     variable.name = 'Data') %>% 
    extract(value > 0) %>% 
    extract(, value := NULL) 

Che la mia console sta facendo (la prima chiamata non fa nulla):

> temp 
> temp 
    cyl mpg hp Data 
1: 4 22.8 93 vs 
2: 6 21.4 110 vs 
3: 6 18.1 105 vs 
4: 4 24.4 62 vs 
5: 4 22.8 95 vs 
... 
... 
+1

Vedo anche questo, in RStudio e Rterm (R versione 3.2.2 (2015/08/14); Piattaforma: x86_64-W64-mingw32/x64 (64- bit); data.table_1.9.6). 'print.data.frame (temp)' funziona prima di tutto. – jbaums

+0

Ho sempre notato questo dopo una chiamata ': =' o 'set()' in 'data.table' – tospig

+4

Sono certo di averlo visto prima come un comportamento noto con data.table. C'è un duplicato su SO da qualche parte, probabilmente uno dei guru data.table saprà dove si trova. – joran

risposta

9

Questo è il noto effetto collaterale della correzione in atto per schiacciare un ancora più grande errore. È documentato here, come il primo elemento nella sezione "BUG FIXES" della versione v1.9.6. Citando da quel collegamento:

if (TRUE) DT [, LHS: = RHS] non stampa più, # 869 e # 1122. Test aggiunti. Per far funzionare tutto questo abbiamo dovuto convivere con uno svantaggio: se a: = è usato all'interno di una funzione senza DT [] prima della fine della funzione, quindi la prossima volta che DT o print (DT) viene digitato sul prompt, non verrà stampato nulla. Verrà stampato un DT o una stampa (DT) ripetuto. Per evitare ciò: includi un DT [] dopo l'ultimo: = nella tua funzione. Se ciò non è possibile (ad es., Non è una funzione che è possibile modificare), è possibile stampare DT [] al prompt. Come prima, aggiungere un extra [] alla fine di a: = query è un idioma consigliato da aggiornare e quindi stampare; per esempio. > DT [, foo: = 3L] []. Grazie a Jureiss e Jan Gorecki per aver segnalato.

Come spiegato lì, la soluzione è aggiungere un'operazione di trascinamento [] alla finale := -contenente nella funzione. Qui, ciò significherebbe fare il seguente:

library(magrittr) 
library(data.table)  
myDT <- as.data.table(mtcars) 
temp <- 
    myDT %>% 
    melt(id.vars = c('cyl', 'mpg', 'hp'), 
     measure.vars = c('vs','am','gear','carb'), 
     variable.name = 'Data') %>% 
    extract(value > 0) %>% 
    extract(, value := NULL) %>% `[` 

## Following which, this will print the first time 
temp 
+0

Grazie Josh! – jks612