p_tan's blog

勉強日記です。ツッコミ大歓迎

RでF#のパイプ演算子

2014/03/26追記

magrittrパッケージに以下で書いてるようなパイプ演算子があります。
下でやってることよりもっとちゃんとつくってあるので、
unaryとか必要ないです。

> 1:3 %>% sort(dec=T)
[1] 3 2 1

追記ここまで



Rは演算子の定義ができるので、F#のパイプ演算子っぽいものが作れる。

> "%>%" <- function(x, f) f(x)
>  3:1 %>% sort
[1] 1 2 3

ついでに任意の関数を1引数関数に変換するunaryってのも作っておくと色々と捗るかもしれない。

> unary <- function(f, ...) function(x) f(x, ...) 
> 1:3 %>% unary(sort, dec=T)
[1] 3 2 1

あと、Rは->演算子で左から右への代入ができるので、パイプ演算子と組合せると非常に美しい感じ。

> # ソートしてlogをとって変数xに代入
> 3:1 %>% sort %>% log -> x
> x
[1] 0.0000000 0.6931472 1.0986123

ただし注意点として、複数行に渡る式を書く時は、演算子を行末に置く必要がある。

> # 3:1 %>% sort
> #     %>% log
> # とやろうとすると、1行目で式が評価されちゃう
> 3:1 %>% sort
[1] 1 2 3
> # パイプ演算子は行末に置く必要がある
> 3:1 %>%
+   sort %>%
+   log
[1] 0.0000000 0.6931472 1.0986123