2015-12-03 43 views
5

我無法弄清楚這一點。dplyr和所有的奇怪

library(dplyr) 
dat <- data.frame(a = 1:5,b = rep(TRUE,5)) 

# this doesn't work 
dat %>% all(.$b) # tricky 

# this doesn't work 
dat %>% all(b) # 

# this does 
dat %>% .$b %>% all 

我發現令人困惑的是all(.$b)不起作用。這對我來說似乎並不直觀。

回答

6

那麼,%>%操作者從magrittr包定義借用following rules

  1. 默認情況下,左手側(左軸)將管道在作爲函數出現在第一個參數右側(RHS)。
  2. 當需要LHS而非第一個位置時,可以使用點「。」作爲佔位符。

你可以看到整個數據幀仍然被傳遞作爲第一個參數這個例子

f<-function(...) str(list(...)) 
dat %>% f(.$b) 
# $ :'data.frame':  5 obs. of 2 variables: 
# ..$ a: int [1:5] 1 2 3 4 5 
# ..$ b: logi [1:5] TRUE TRUE TRUE TRUE TRUE 
# $ : logi [1:5] TRUE TRUE TRUE TRUE TRUE 

所以你得到兩個data.frame和矢量(在函數接收兩個參數)。我相信這是因爲您沒有將.移動到第一個參數以外的位置,因此您沒有改變將對象作爲第一個參數傳遞的行爲。

只是碰巧magrittr包有一個不同的操作符用於這種情況。您可以使用%$%

library(magrittr) 
dat %$% all(b) 
# [1] TRUE 
+0

很好的答案。我的印象是,當你明確輸入'.'時,它不會再向前推'.'。很明顯,我錯了。 –