2016-01-08 7 views
6

Etwas wirklich merkwürdiges geht hier vor sich. Im folgenden Code erstelle ich eine Variable namens temp. Ich muss es zweimal anrufen, bevor ich sehen kann, was es ist. Z.B. Das erste Mal, wenn ich es nenne, zeigt die Konsole nichts. Das zweite Mal zeigt es die data.table/data.frame, dass es ist. Kann mir jemand helfen zu verstehen, was hier vor sich geht?Müssen Variablen vor der Auswertung zweimal aufgerufen werden?

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) 

Was meine Konsole (der erste Anruf nicht alles tun) tut:

> 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

ich dies zu sehen, in RStudio und Rterm (R Version 3.2.2 (2015.08.14); Plattform: x86_64-w64-mingw32/x64 (64- Bit); data.table_1.9.6). 'print.data.frame (temp)' funktioniert zuerst. – jbaums

+0

Ich habe das immer bemerkt nach einem ': =' oder 'set()' Aufruf in 'data.table' – tospig

+4

Ich bin sicher, ich habe gesehen, dass dies zuvor als ein bekanntes Verhalten mit data.table kommen. Es gibt irgendwo ein Duplikat auf SO, wahrscheinlich wird einer der data.table-Gurus wissen, wo es ist. – joran

Antwort

9

Dies ist die bekannte Nebenwirkung des Updates implementiert einen noch größeren Fehler zu quetschen. Es ist dokumentiert here, als der erste Artikel unter "Bugfixes" Abschnitt der v1.9.6 Release. Zitat von diesem Link:

wenn (TRUE) DT [, LHS: = RHS] nicht mehr gedruckt, # 869 und # 1122. Tests hinzugefügt. Um dies zu erreichen, mussten wir mit einem Nachteil leben: Wenn a: = innerhalb einer Funktion ohne DT [] vor dem Ende der Funktion verwendet wird, dann wird DT oder print (DT) das nächste Mal bei der Aufforderung, nichts wird gedruckt. Ein wiederholter DT oder Druck (DT) wird gedruckt. Um dies zu vermeiden, fügen Sie ein DT [] nach dem letzten: = in Ihre Funktion ein. Wenn dies nicht möglich ist (z. B. ist dies keine Funktion, die Sie ändern können), wird DT [] an der Eingabeaufforderung garantiert gedruckt. Wie zuvor ist das Hinzufügen eines zusätzlichen [] am Ende einer: = -Abfrage ein empfohlenes Idiom zum Aktualisieren und Drucken. z.B. > DT [, foo: = 3L] []. Danke an Jureiss und Jan Gorecki für die Berichterstattung.

Wie es erläutert, ist die Lösung ein nachlauf [] auf die der letzten := haltigen Betrieb in Ihrer Funktion anzuhängen. Hier würde das bedeuten, Sie folgendermaßen vorgehen:

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

Danke Josh! – jks612

Verwandte Themen