2016-01-08 10 views
6

Coś naprawdę dziwnego dzieje się tutaj. W poniższym kodzie utworzę zmienną o nazwie temp. Muszę zadzwonić dwa razy, zanim zobaczę, co to jest. Na przykład. Za pierwszym razem, gdy to nazywam, konsola nic nie pokazuje. Za drugim razem pokazuje, że jest. Czy ktoś może mi pomóc zrozumieć, co tu się dzieje?Czy trzeba wywołać zmienną dwa razy przed obliczeniem?

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) 

Co moja konsola robi (pierwsza rozmowa nic nie robi):

> 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

Widzę to też w RStudio i Rterm (R w wersji 3.2.2 (2015-08-14) Platforma: x86_64-W64-mingw32/64 (64- bit); data.table_1.9.6). 'print.data.frame (temp)' działa najpierw. – jbaums

+0

Zawsze zauważyłem to po wywołaniu ': =' lub 'set()' w 'data.table' – tospig

+4

Jestem pewien, że widziałem to wcześniej jako znane zachowanie z data.table. Istnieje duplikat na SO gdzieś, prawdopodobnie jeden z guru data.table będzie wiedział, gdzie on jest. – joran

Odpowiedz

9

Jest to znany efektem ubocznym poprawki realizowanego zgnieść jeszcze większy błąd. Jest to dokumentacja here, jako pierwszy element w sekcji "USUNIĘTE BŁĘDY" wydania wersji 1.9.6. Cytując z tego linku:

jeśli (TRUE) DT [, LHS: = RHS] nie drukuje, # 869 i # 1122. Dodano testy. Aby to zadziałało, musieliśmy żyć z jedną wadą: jeśli a: = jest używane wewnątrz funkcji bez DT [] przed końcem funkcji, to następnym razem DT lub print (DT) są wpisywane pytaj, nic nie będzie drukowane. Powtarza się powtarzający się DT lub wydruk (DT). Aby tego uniknąć: dołącz DT [] po ostatnim: = w twojej funkcji. Jeśli nie jest to możliwe (np. Nie jest to funkcja, którą możesz zmienić), to DT [] po znaku zachęty zostanie wydrukowane. Tak jak poprzednio, dodanie [] na końcu zapytania: = jest zalecanym językiem do aktualizacji, a następnie drukowania; na przykład > DT [, foo: = 3L] []. Podziękowania dla Jureissa i Jana Góreckiego za zgłoszenie.

Jak wyjaśniono tam, rozwiązaniem jest dołączyć operację spływu [] do końcowego := Niezawierające w swojej funkcji. Tutaj Oznaczałoby to w następujący sposób:

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

Dziękuję Josh! – jks612

Powiązane problemy