->か<-か、どっちが邪悪?

始まりは@hrbrmstrさんのこのブログ記事でした。

要は、重度のパイプ依存症になると、

iris_filtered <- iris %>%
  filter(Sepal.Length > 5) %>%
  arrange(desc(Species))

というのを見ると「%>%は右を向いてるのに<-は左を向いてて流れが一方向じゃない。なにこれ気持ち悪い!」と感じるようになってしまう、という話らしいです。

ではどうすればいいのか。こういうときは、->を使いましょう、というのがこの人の主張です。

Rの代入演算子=<-->

ちょっとわき道にそれて、=<-->の違いについて軽く見てみます。

=<-の違い

?`<-`を見ると、以下のように書いてあります。

The operator <- can be used anywhere, whereas the operator = is only allowed at the top level (e.g., in the complete expression typed at the command prompt) or as one of the subexpressions in a braced list of expressions.

どうしてこうなったのか知らないのですが、=はトップレベルでしか使えないらしいです。ということで、=<-を使い分けよう、 なんていうめんどくさいことは当然ながら考えず、とりあえず<-使っとけば間違いない、という思考が蔓延することになります(...よね? 私だけ?)。

->とは

<-があるわけなので、とーぜん逆向きの->もあります。あんまり見かけないかもしれませんが、<-=と逆に、左のものを右に代入する演算子です。

なので、以下の2つは同じことです。

a <- 1

1 -> a

<-の代わりに->を使う

では->を使うと上の例がどうなるかというと、こうです。

iris %>%
  filter(Sepal.Length > 5) %>%
  arrange(desc(Species)) -> iris_filtered

個人的には、この書き方はたまにします。でも、この書き方は、そもそも最後に->していることに気づきにくいのが難点です。

神もそう言っておられます。

%<>%の代わりに->を使う

しかしパイプ依存症はこんなところでは収まりません。

magrittrには、変数を処理してまた同じ変数に代入する%<>%というパイプがあります(参考:magrittr 1.5を試してみる。 - Technically, technophobic.)。上の例で、aという別の変数に代入するのではなくiris自体を書き換えるなら、%<>%を使ってこんな風に書けます。

iris %<>%
  filter(Sepal.Length > 5) %>%
  arrange(desc(Species))

これを、->を使って、

iris %>%
  filter(Sepal.Length > 5) %>%
  arrange(desc(Species)) -> iris

と書こう、というのが@hrbrmstrさんの提案です。左から右にきれいに流れていくじゃないか、と。

うーん、どうなんでしょう。これはさすがにやりすぎ感が。。

ご本人登場!

そして盛り上がる議論に、本家magrittrを生んだStephan氏が電撃参戦します。

right-assign.md

曰く、

you don't follow a recipe only to be enlightened after you followed all of the steps; "Oh, It was buns that I was baking!?" A recipe start with the promise, this is what you get, and then you follow the steps.

パンづくりに例えて、調理の工程がすべて終わってから「あ! 俺パンつくってたのか!」とはならないでしょう、と。

Another analogy in the left-to-right discussion is that you don't see books where chapters are named on a page after the end of the chapter, although the pages are read from left-to-right (in most languages).

代入する変数を先に示すのは、章や節に見出しをつけるようなことだ、と。

なるほど。これは納得感あります。<-と適切な変数名を使っていればそれが見出し代わりになるというのはお得ですね。

感想

ということで、私は左派になりましたが、今後もこの論争はR界を地味に二分していくような気がします。お前は右か左かどっちだ!とか問い詰められる日がくるのかなあ、なんて考えて、なんか政治の話みたいでウケる。この論争を生温かく見守っていきたいと思います。