R のパイプ演算子について批判的に書かれたブログのポストを見つけて、コメント欄まで含めて面白く読んだ。
上記の記事を読んでの感想もといポエムである。
F#のパイプ演算子|>
を模して(私はF#は書いたことがないのであまりわからないが)magrittr
パッケージによってRに導入されたパイプ演算子%>%
は以下のような書き方を可能にする。
seq(length(x))
# あるいは
. <- length(x)
seq(.)
# ↑を↓のように書ける
x %>%
length() %>%
seq()
まあこんなに短いものだと大して旨味もないが長ったらしい例はリンク先の記事にもある。
リンク先の記事の著者が問題にしているのはどうやら
- パイプ演算子はNSEを使っているが、それは予想もしないような結果をもたらさないか?
- パイプスタイルに馴染みのない人々もいるのにドキュメンテーションにまでパイプ演算子が当然のように使われるのはどうなの?
という点のようだ。
もっともな主張ではあるかもしれない。
特に入れ子になった関数呼び出しなどと比べた場合にパイプ演算子を使うと評価順序がガラッと変わるので、その評価順序の変化でエンバグしない? とかパフォーマンス落ちてない? とか言われると判断しづらい。今のところ私はそういうことには遭遇していないが。
少なくともエラー時のスタックトレースが非常に追いづらくなるのは確かだ。
ただそれでも私はパイプ演算子は多用している。タイプ数が少なくて済むし読みやすいと思うし、序でに言えば代入演算子が減らせるのが良い点であると思っている。評価順序がわかりづらくなる? 最初っから R の値の評価順序なんかわかりづらいんだから今さらだろう
代入演算子が減らせるのが良い点であるのかというと趣味の問題と言えばそれまでかとも思う。要するに私はちょっとした Haskell かぶれの考え方をしていて、一度名前に値をバインディングしたものを出来るだけ動かさない方が良いよね、と思っているのだ。そして同時に私は安直な名前を付けるのは嫌いだが、名前を考えるのも嫌いなのだ。特に dplyr / tidyr での表の変形の過程で出てくる「何かをグループ化したやつ」だの「ちょっとフィルターかけたやつ」だの「横積みにしたやつ」だのに名前を一々つけてなんていられるかとも思う。
私は別に R でコードを書く人々とそんなにたくさん交流している訳ではないので完全に偏見だが、パイプ演算子を多用する人たちというのは関数型プログラミングかぶれな傾向が強いのではないか。代入演算子を憎んでいるのだ、おそらく。