Appendix A — コラム: magrittr

Rでは、複数の関数を利用した処理を実行する方法として主に2つの手段がある。一つは逐次的に処理を実行する形式である。これは処理内容をオブジェクトに代入し、別の処理にオブジェクトの値を渡す方法である。この方法では代入先のオブジェクトを新たに作成しても良いし、既存のオブジェクトを上書きすることもできる。一方で、すべての処理を入れ子式に記述し、処理を一括で実行することも可能である。

# 逐次的に処理を実行する形式
tmp.ex1 <- c(1, 2, NA, 4)
tmp.ex1 <- mean(tmp.ex1, na.rm = TRUE)
round(tmp.ex1, digits = 2)
[1] 2.33
# 関数の中に関数を記述する形式 (入れ子構造)
round(mean(c(1, 2, NA, 4), na.rm = TRUE), digits = 2)
[1] 2.33

処理結果を保存する方式では、途中結果を別の場面で利用する際に便利であるが、多数のオブジェクトを作ることで混乱を招く可能性がある。対して入れ子構造での表記では1行で処理内容を表現しており、オブジェクトの混乱を防ぐことはできるが、処理が複雑になると、処理内容と元の値との関係がわかりにくくなってしまう。このような問題を解消するために発案されたのが、F#やコマンドラインで用いられるパイプ処理の仕組みを取り入れた{magrittr}パッケージである。

# magrittrパッケージを利用できるようにする
library(magrittr)

# パイプ処理を行ったもの
c(1, 2, NA, 4) %>% 
  mean(na.rm = TRUE) %>% 
  round(digits = 2)
[1] 2.33