2015-12-03 13 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

さて、%>%オペレータがfollowing rulesを定義magrittrパッケージから借用される:デフォルトで

  1. 左辺(LHS)が上に現れる関数の第1引数としてパイプします右手側(RHS)。
  2. LHSが最初の位置以外で必要な場合は、プレースホルダとして '。'を使用できます。あなたはあなたが(関数が受信しているdata.frameとベクトルの両方を取得している

    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 
    

    この例で全体のデータフレームがまだ最初のパラメータとして渡されていることがわかります

2つのパラメータ)。これは、.を最初のパラメータ以外の位置に移動していないため、オブジェクトを最初のパラメータとして渡す動作を変更していないためです。

magrittrパッケージには、このような場合に別の演算子が使用されることがあります。 %$%を使用できます。

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

偉大な答え。私はあなたが明示的に '.'と打つと、' .'をもう一度押すのではないという印象を受けました。明らかに私は間違っていた。 –