Rのプログラマーは「Rって独特な言語だから、R言語独自の機能が多くて他の言語に応用が効かない」とか言いがちですが、そんなことは無いと思います。関数型言語(Scheme)の影響が強いので、ちょっと立ち位置は遠いのかもしれませんが。
例えば、以前私が「最近Pythonで高階関数やリスト内包表記を使いこなせるようになったからfor文使わなくなってきた」と言ったら、「Rプログラマーみたいなこと言うね」と言われたのですが、map(Rならapply系の関数)は大抵のスクリプト言語全般で使えますし、そんなに特別なことではないはずです。
R独自に思える機能の一つに、パイプ演算子%>%
というものがあります。Rというより、代表的なライブラリであるdplyr
やmagrittr
の機能ですけど。
これも実は、githubの説明文に、「F#の|>
演算子を使えるようにしたものだよ」と書いてあります(つまり、完全なオリジナルのアイデアではありません)。また、Elixir等の関数型言語を中心に、他言語でも実装されているものがいくつかあるようです。
R package to bring forward-piping features ala F#'s |> operator. Ceci n'est pas un pipe.
というわけで、他言語のパイプ事情をざっと調べてみました。
F#
全ての元ネタです。パイプ「ライン」演算子と呼ばれることが多いみたいですね。
「Javaに対するScala、C#に対するF#」みたいな立ち位置の言語だと聞いています。
F#といったらパイプライン演算子。パイプラインは文化。と、いうわけかで、実際、私がよく目にしているF#のコードというのは基本|>で繋ぐ、という形であり、それが実にイイなー。などという憧憬はあるのでF#を書くとなったらとりあえずまずはパイプライン演算子の学習から入ったりなどしたりする。
こんな感じになるそうです。
let function1 x = x + 1 let function2 x = x * 2 let result = 100 |> function1 |> function2 // 答えは202
Elixir
その他の関数型言語(OCaml, Haskellなど)
元々実装されているわけではありませんが、似た機能を簡単に作ることができます。
Ruby
実装できなくはないが、元々メソッドチェーンしやすい言語なのでそんなにメリットないかも…。
Python
この中では珍しく、Rのパイプ演算子をpandasでも使いたいというモチベーションの記事です。
なんか書いてますが英語なのでよく分かりません。
Pipelining in Pythonmtomassoli.wordpress.com
JavaScript
ライブラリがあるっぽいです。
気になるのはこの一文。
This proposal introduces a new operator |> similar to F#, OCaml, Elixir, Elm, Julia, and LiveScript, as well as UNIX pipes. It's a backwards-compatible way of streamlining chained function calls in a readable, functional manner, and provides a practical alternative to extending built-in prototypes.
Julia
よくわかりませんでした…。
調べた結果
F#とElixirでパイプライン演算子が広く使われていて、ライブラリも含めるとRのプログラマーもパイプ処理を使いこなしている人が多いです。ユーザー数でいうとRは関数型言語としてももうちょっと存在感出していい気がするんだけど、F#やElixirのプログラマーはR言語の存在に気づいて無さそう…。