2016-01-15 14 views
12

Quando utilizzo la funzione nidificata in una fase di piping, l'ordine di esecuzione sembra non intuitivo.Ordine di esecuzione di funzioni annidate in pipe dplyr

df <- data.frame(a = c(1,NA,2), b = c(NA, NA, 1)) 
df %>% is.na %>% colSums # Produce correct count of missing values 
df %>% colSums(is.na(.)) # Produce NA 

Qualcuno può spiegare perché la funzione annidata nella terza riga non produce il risultato corretto?

risposta

14

È perché il . viene sempre passato come primo argomento della seguente funzione. Pertanto, nel secondo tentativo di colSums, si presuppone che si passi is.na(.) come primo argomento a colSums, ma in realtà lo si passa come secondo, ovvero il parametro na.rm. Quindi, in realtà il tuo codice è df %>% colSums(x = ., na.rm = is.na(.)). È possibile impedire il passaggio del . come primo parametro utilizzando {} attorno alla funzione.

Problemi correlati