2016-01-15 33 views
12

當我在管道步驟中使用嵌套函數時,執行順序看起來不直觀。在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 

任何人都可以解釋爲什麼在第三行嵌套函數不會產生正確的結果?

回答

14

這是因爲.總是作爲第一個參數傳遞給下面的函數。因此,在colSums的第二次嘗試中,您假設您將is.na(.)作爲第一個參數傳遞給colSums,但您實際上將其作爲第二個參數傳遞,即na.rm參數。所以你的代碼實際上看起來是df %>% colSums(x = ., na.rm = is.na(.))。您可以通過在函數週圍使用{}來防止.作爲第一個參數傳遞。 df %>% {colSums(is.na(.))}