2024年1月1日月曜日

[R] admiralで使われているpipe演算子の紹介

せっかく各所でadmiralの話を聞いたので時流に乗っていくとします。また直近の仕事で使いもしないものに手を出すのか。よくないですね。どんな関数がadmiralにあるかを見る前に、pipe演算子について紹介します。これはpowershellとかではよく見かけるのですが、そういえばsasにはないですね…

rを触るのは実に久しぶりです。正直全く覚えていないので初学者と全く同じです。pythonよりは慣れている感がありますが…

紹介に際してパッケージをパソコンにインストールしないと話が始まらないので、まずはinstall.packages("admiral")でadmiralをパソコンにインストールしてください。2回目以降はパソコンの中にパッケージはもう存在するので、require("admiral")でokです。

pipe演算子とは左辺の出力を右辺の関数の第一引数に格納するものです。admiralではtidyverseで定義されている%>%が使われています。tidyverseのmagrittrライブラリですね。admiralをインストールしたら一緒についてくるのであまり意識することはありませんが。左辺を右辺の第一引数に格納すると書きましたが、それは何も指定しない場合です。どこに格納するかを指定すれば第一引数以外にも左辺の結果を格納することはできます。

例えばRには標準でirisというデータセットが入っていて、これの中身を確認するときにhead()を使います。

head(iris)
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
こうするとirisデータセットの最初から5obsまでがログに表示されます。irisデータセットの全部を表示したいときには、dim()でirisデータの行数を調べて、それをhead()の第二引数に格納すればokです。通常は以下のように書く必要があります。実行すると150行もデータがログにドバドバ出るので気を付けてください。お勧めしません

a <- dim(iris)
head(iris, a)

これと同じものをpipe演算子を使うと以下のように書けます。実行すると上記の2行を実行したときと同じ結果が得られます。さっきはdim()の結果を変数aに入れていましたが、今回は左辺に置いています。これを右辺に格納するためにパイプ演算子を使用します。標準だと右辺の第一引数に格納されると先ほど書きましたが、今回はhead()の第二引数に[.]を指定しています。この右辺の関数の引数の[.]に左辺の結果が格納されます。便利ですね。中間変数なりをあまり作らなくてもよいのは助かります。head()の第二引数は本来表示させたい行数を整数で記載するのですが、今回はここに左辺のdim()の結果を入れています。

dim(iris) %>% head(iris , .)

パイプ演算子は結構便利なのですが、慣れない間は左辺の結果を右辺のどこに格納しているかを見落としたり、そもそも何してるかがわからなかったりするので要注意です。あと勢いで何でもかんでもpipeで渡すと、ここに格納してる途中のやつは何?みたいになるので適度なマナーをもって使うのが良いと思っています。

昔私がrを触っていた時にはpipe演算子(どころかtidyverseそのものが)無かったので、ついにrにもパイプ演算子が入ったのかと驚いています。進歩ってすごいですね。最近だとrの組み込みでパイプ演算子があるらしいですが、tidyverseのパイプと微妙に挙動が違うらしいです。違いは正直わかりませんが、admiralでは%>%が使用されているのでtidyverseのものだけ紹介すればいいかということにしています。

記事カテゴリをその他にしましたが、流石に別カテゴリを作ったほうがいい気がしています。Rとかになるかな…admiralカテゴリはちょっと狭いか?などと…