2016-01-15 13 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 

3番目の行のネストされた関数が正しい結果を生成しない理由を説明できますか?

答えて

14

.は、常に次の関数の最初の引数として渡されるからです。つまり、colSumsの2回目の試行では、colSumsの最初の引数としてis.na(.)を渡していると仮定しますが、実際にはna.rmという2番目のパラメータとして渡しています。コードが実際にどのように見えるかは、df %>% colSums(x = ., na.rm = is.na(.))です。ファンクションの周りに{}を使用すると、.が最初のパラメータとして渡されるのを防ぐことができます。 df %>% {colSums(is.na(.))}