読者です 読者をやめる 読者になる 読者になる

廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

パイプ(chain 演算子)は合成関数みたいだと思ったことなど

R AWK

R (dplyr) の chain

dplyr パッケージがとりあえずはやいというのでいじってみた.
しかし chain(チェイン? チェーン?)というやつになかなかなじめなかった.

例えば、hist(rnorm(100)) を rnorm(100) %>% hist() みたいに書けるのが chain.

library(dplyr)
par(mfrow=c(1,2))
set.seed(1)
hist(rnorm(100)) #1
set.seed(1)
rnorm(100) %>% hist() #2
###
#1 #2 は同じ結果になる(下図参照)

f:id:abrahamcow:20140906032233p:plain

%>% は "designed to chain these commands in a human readable way" だそうだけど(Kun Ren - Easier way to chain commands using Pipe function)ぼくは頭が固いのかもしれない, なんかピンと来なかった.

「一時的にデータフレームを作ったりしなくて良いので便利。」(RPubs - dplyr入門)というのはわかるんだけど.

でも, これ, 合成関数と考えたら理解できた気がする.
RETURN 合成関数の例題

例えば,
f(x) = x^2,
g(x) = 3x,
のとき,
(f \circ g) (2) f(g(2)) = f(6) = 36 だ.

f \circ g という記法は, 演算を行う関数どうしを演算して新しい関数をつくるような考えかただ.

上述の rnorm(100) %>% hist() は (\rm{hist} \circ \rm{rnorm})(100) なわけだ.


ところで, dplyr の %>% はバージョン 2.0 移行から導入されて, それまでは %.% だったらしい(dplyrのバージョンが0.2に上がって - 東京で尻を洗う)けど, ぼくは %>% のほうが左の結果を右に「渡す」イメージがしやすくて好きだ.

%>% という記法, 「便利」というのもあるけど, ぼくにとっては「演算子」とかいうものに対する捉え方が拡張されたような喜びがある.

シェルのパイプ(と awk

こうやって捉えるとシェルのパイプラインも読めるようになってきた.
シェルの概念と機能

コマンド1 | コマンド2
の | 記号は, 合成関数の ○ みたいなものだと思えばいいんだ.


例)
abc.txt という名前で下のようなファイルがあるとして,

a 1
b 2
c 3

一行目だけプリントする:

$ cat abc.txt | awk 'NR == 1'
a 1

"b" を含む行だけプリントする:

$ cat abc.txt | awk '/b/{print $0}'
b 2

なるべく書かないawkの使い方 - ザリガニが見ていた...。
プログラム言語 awk Linux/Unix利用者向け一行コマンド


余談だがぼくは生まれてはじめてさわったプログラミング言語awk だったので, awk には思い入れがある.

そのころは人工無能がはやっていて, 自然言語処理(という言葉は当時は知らなかったけど)みたいなことがやりたかった.

で, テキストファイルを処理する簡単そうな言語っていうことでとりあえず『プログラミング言語AWK』という本を買って速攻で挫折した.

プログラミング言語AWK

プログラミング言語AWK

いま, そこそこまともに書ける言語は R くらいしかないんだけど, 最近になって改めて, データの下処理とかに awk 使ったら便利なんじゃないかなあと思っている.

また R のはなし

これまでぼくは「R を使うコツは線形代数の基本的なところを押さえること. その上で, 統計処理に関する様々なパッケージを探そう(R site search )」と思ってたんだけど、ベースとなる関数自体をより便利に代替するようなパッケージがいっぱいあることに気づいた.

dplyr とか ggplot2 もそうだし, list オブジェクトのハンドリングに便利な rlist とか,

ファイル入出力に便利な data.table とか

文字列処理に便利な stringr とか……

「基礎基本をきちんと身につけていれば応用は後からいくらでもできる」と思いたいぼくにとっては, 「言語固有のライブラリの知識のほうが有益」っていう事実はなんとなく複雑なものがあります.