Native pipeを普段使いする決意をしました
前回の記事にて、ずっと気になっていたRの新パイプ|>
を調べました。結論としてはmagrittrのパイプ%>%
よりもbase pipeは少し不便だけど、なんだかんだ困らなそうという感じでしたので、しばらく使ってみようということにしました。

とりあえず手元にあったコードをYihuiさんのBlog postを参考に[1]Yihuiさんは{knitr}パッケージを作られた方で、Rmakrdownの創造主です。既存のパイプを書き換えてみました。やり方は以下のコードを参考にしていただければ。
# 一時的にformatRを読み込む
pacman::p_temp(formatR)
# アクティブファイルのパイプがすべて置き換わる
formatR::tidy_pipe()
いろいろとコードを書き換えた結果奇跡的に私のコードはすべて問題なく動作したため、この度、|>
を普段使いする決意をいたしました。一人でRを仕事に使う分にはどっちのパイプを使おうと構わんわけですが、最近は解析コードを公開できる前提で見やすくわかりやすく書くことを心がけていたり、僭越ながらRを社内でレクチャーさせていただいたりしていますので割と重大な決心なわけです。なんなら、会社のメイン環境ではR4.2.0が入ってないから下手したら動作しないコードあるし。。
二通りのパイプに対応するために変えた設定
普段使いパイプを変えるに当たって、いろいろな設定を変更しました。GWを満喫しつつ隙間時間で進めたので三日がかりの大仕事になりましたが、ここに記録していきます📓
Rstudioの設定を変更
Rstudioは新パイプ実装直後から機能対応してました。Rstudio社の意気込みというか、やる気を感じます🌍
RstudioのTools->🔧Global Options->📓Code->✅Use native pipe operatorからCtrl
+Shift
+m
の挙動を変更することができます。通常では特段の設定変更をしなくってもCtrl
+Shift
+m
で%>%
が入力されますが、この変更により|>
が入力されるようになります。
Ctrl
+Shift
+p
でコマンドパレットを開いてから”pipe”とか入力してコマンドを検索することでも設定変更が可能です。
VScodeの設定も変更
私のRコーディングは用途に分けてエディタを変えています。データフレームの変形を通じて探索的なデータ解析を行う場合にはRstudio、パッケージ作成等のガチコーディングをする場合にはVSCode、このブログ記事のような物書きをする場合でもVScodeを・・・といった感じです。
VSCodeでRプログラミングを行うにあたって行うべき設定変更や追加しておくべき拡張機能についてはMicrosoftさんがまとめてくれています。

最新情報すぎてこのドキュメントには書かれていませんが、quarto拡張を使ってquartoファイルを編集する際、多少のキーボードショートカットが追加されます。
そして肝心のパイプですが、VSCodeではいくら拡張機能を使ったところでパイプ入力のキーボードショートカットはできませんので、自力でなんとかする必要があります。keybindings.json
に以下を入力すれば、キーボードショートカットを作成できます。
[
{
"key": "ctrl+shift+m",
"command": "type",
"args": {"text": " %>% "},
"when": "editorTextFocus"
}
]
もともとこの設定を作ってあったのですが、今回、%>%
を|>
へと変更しました。
また、ついでにVSCodeのパイプ入力をもう少し改良した自作拡張機能の作成にも取り組んでみました! ちょっと大変でしたが、javascriptの勉強ができて楽しかったです。やっぱり新しいプログラミング言語に触れるのは楽しいですよね~。こちらの模様についてはZennで記事を書きましたので、よければそちらで!

このブログの表示も2パターン出す
「自分は今日から|>
をメインに使うことにしたのでよろしく!」ってわけにもいかないので、今後はこのブログのRコードを二通りのパイプで表記することにしました。
こんな感じになります👇
pacman::p_load(tidyverse)
starwars |>
filter(height > 100) |>
group_by(species) |>
summarise(mean_mass = mean(mass))
pacman::p_load(tidyverse)
starwars %>%
filter(height > 100) %>%
group_by(species) %>%
summarise(mean_mass = mean(mass))
今後|>
が流行るかわからないかは分からりませんが、私はこのムーブメントが来るだろう・・・!と信じてこの道を歩んでみます。
地味にこれをうまくやる方法について結構悩んだ
"cssでタブ表示+コードブロック装飾"までは簡単に行けたものの、実際書いてみると山盛りショートコード+HTMLタグになってしまいました😞 しかもコード内はHTMLエンティティに変換しなければならぬという地獄。
"Base"Magrittr
<pre><code class="language-r">pacman::p_load(tidyverse)
starwars |>
filter(height > 100) |>
group_by(species) |>
summarise(mean_mass = mean(mass))</code></pre>
<pre>
<code class="language-r">pacman::p_load(tidyverse)
starwars %>%
filter(height > 100) %>%
group_by(species) %>%
summarise(mean_mass = mean(mass))</code>
</pre>
このブログはなるべくmarkdownをそのまま与えても記事になるように色々と工夫していますが、コードブロックの度にこれでは辛すぎます。ということで選択範囲のコードから上コードが自動生成されるようなVSCode拡張を作ることで対応しました。
基本的にはZennに書いた記事の延長で、所要時間は一時間くらいでした。javascriptの勉強にもなったのでいい経験だったと思います。

最後に
ということで2022年のゴールデンウィークも終わりにさしかかる中、私は時間を見つけてはパイプの検討をしたり、謎にVSCodeの拡張機能を作り始めたりでろくにインプット努力もしてなくて大丈夫かって感じでしたが、明日からはお仕事頑張っていきたいと思います。
明後日のぽんぽこ24を楽しみに、明日一日がんばるぞい💪

脚注
↑1 | Yihuiさんは{knitr}パッケージを作られた方で、Rmakrdownの創造主です。 |
---|
コメント