1. 趣旨
パイプ演算子という概念すら知らなかった僕個人のためのレファレンスです。
そういうわけで、そんなに高度な話はないです。
2. パイプ演算子 「%>%」
「関数の出力結果(オブジェクト)を次の関数の引数に渡してくれる」もの。
平たく言えば、「左から右へ受け流す~」(ムーディ勝山)
知らなくても生きていける。知っていると生きやすい。ムーディもそう言ってた。
2-1. メリット
- コードの簡素化。
- 計算過程を途中で保存する必要がなくなる。
- 改行して細かくメモを残せる
2-2. 前提
パイプ演算子自体は、初めからRに備わっている機能ではない。
dplyrというパッケージを読み込むことで、初めてパイプ演算子を使えるので、パイプ演算子の入ったコードを使う場合は予めパッケージを準備する必要がある。
# 未インストールの場合は、パッケージを導入する。
install.packages("dplyr")
library(dplyr)
2-3. Ex.
> sum(1:10) %>% c(10, 20, .) %>% print()
[1] 10 20 55
一つ一つ分解すると、
sum(1:10) %>% c(10, 20, .)
ここで、sum(1:10)
の結果をc(10, 20, .)
に渡している。
引き渡す先は「.」の位置。「.」を打つことで、どの引数にオブジェクトを引き渡すかを明示できる。
c(10, 20, .) %>% print()
ここでは、代入後のc(10, 20, .)
の結果をprint()
に送っている。
この場合は、先ほどと違い、print()
の引数に「.」はない。
引数が1つだったり、もともと引数が入っているところに代入しようとする場合、「.」を打たないと先頭の引数として取り扱われる。
こうやって関数を数珠繋ぎにすることができる、というのが特徴といえる。
そして、パイプ演算子を使った計算結果は、普通の関数と同様に保存できる。
> vector1 <- sum(1:10) %>% c(10, 20, .)
[1] 10 20 55
> vector1
[1] 10 20 55
2-4. 改行してもパイプで繋がる
sum(1:10) %>% # 1から10までを足し算。
c(10, 20, .) %>% # ベクトルを作成。足し算の結果は最後尾に。
print() # ベクトルを表示。
とまあ、こういう感じでパイプ演算子毎に改行できるので、メモも残しやすい。
3. 補足
別に知らなくても生きていけるというのは、普通の記法でも同じ結果を得られるから。
# 記法1
> vector1 <- sum(1:10)
> vector1 <- c(10, 20, vector1)
> print(vector1)
[1] 10 20 55
# 記法2
print(c(10,20,sum(1:10)))
[1] 10 20 55
# 記法3:パイプ演算子を用いた記法
sum(1:10) %>% c(10, 20, .) %>% print()
[1] 10 20 55
ただ、パイプ演算子を使うほうがスマートだし、流れで記述できるので、慣れるとこっちのほうが分かりやすい。
あと、ググって他人のコードを見ると、思ったよりパイプ演算子が使われてることが多いので、知らないとコードの意味が分からないことはあるかもしれない。
3-1. それぞれの記法の比較
- **
記法1
**の場合、何をやっているかは一目でわかるが、計算過程(ここではsum(1:10)
の結果)を一旦vector1
として保存して参照しなければならないのが面倒な上、コードが複数行に渡るので冗長になってしまう。 - **
記法2
**の場合、コードが一行なのでスマートかもしれないが、入れ子になっているため、何をやっているのかはパッと見ではわからない。後からコードを書き換えるときもカッコの数などに気を使わないといけないので、柔軟性に欠ける。 -
記法3
、つまりパイプで書いた場合はどうだろう。パイプ演算子の意味が分かっている者にとっては、このコードが何をしたいのかという流れが一目瞭然だし、コードも簡潔である。途中の処理を加えるといった修正もしやすい。
4. 蛇足
ムーディは言った。
右から左へ受け流す 左から右へは受け流さない
- ムーディ勝山『右から来たものを左へ受け流すの歌』
ムーディはパイプ演算子とは逆だった。
というお話。
5. 主な改訂
更新日付 | 内容 |
---|---|
2020/1/16 |
|