niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(R) Rmd専用に書いた関数はパッケージ化し、ドキュメントもテンプレート化する。

ドキュメント大量生成する場合のお話。

毎日Rをドキュメントの作成に使うようになり、色々と書いては消しまた書いて…ということを繰り返すことで知見が溜まってきました。
結果として、Rmdでドキュメントを書く場合であってもパッケージ化はした方が良い、という結論です。そらそうよ…って感じかもしれませんが。

Rのコードがある程度以上の複雑さになってくると、Rでは基本的にパッケージで管理しないとその複雑さを管理できなくなってしまいます。

パッケージ化、難しくない…?

いや、最小構成でやればそんなに難しくないという話で、 詳しくは↓のrstudioconf2018のビデオと資料を参照…なのですが、

  • DESCRIPTION
  • R/
  • tests/

があればよいということです。実際、今はこれらとNAMESPACEくらいしかない、パッケージを作って使っています。単に関数を管理するという目的ならばこれで十分、ということです。

www.rstudio.com

github.com

資料のリンク先にも色々あるけど、日本語だと現状この本一択だろうか?

www.oreilly.co.jp

この本、パッケージ作るときは必須本で、昔読んだっきりだったんですが、最近読み直して当時良く分かってなかったことに気づいたりしたので、事前に読むことと、必要なタイミングで読むことの両方が僕には必要なんだなぁ、と再確認しました。usethisなどの新しいパッケージはあるものの、基本はこの本に書いてある通り(usethisはお便利ツール)なので、読んだり手を動かしたりで理解を深めていくぞ。

usethisも便利で、結構使っているものの全容が把握できていない…。使う機能しか覚えられない、というのはある。

Automate Package and Project Setup • usethis

github.com

ドキュメントのテンプレートを作成する

↑のとおり、Rのコードを全部パッケージの中に押し込みました。しかし、そうなってくるとRmdのテンプレートもパッケージで作成してほしいという気持ちになってきますよね。
実際、usethisとか、knitrとかはテンプレートを表示してくるわけで、そういう仕組みを使えれば、パッケージでドキュメントテンプレート自体も管理できるということになります…よね?

で、これはwhiskerパッケージを使うと良いです。

github.com

これはmustacheのR実装ですよーと書かれていて、mustacheは下記のページで仕様が見れます。

{{ mustache }}

テンプレートを作成する場合、特定の数字や文字列を埋め込むような形で運用すると思いますので、そういうレベルであればこのパッケージで全部賄えます。
実際これで作成するようになって、ドキュメント大量生成がかなり楽になりました。ただ、テンプレートを更新するたびにパッケージのビルドが必要となりますが…。

testの書き方がわからない

今のところ、ソフトウェアテスト自体の書き方がイマイチわかっていないのと、それをRでやる方法がわかっていないのと2つ問題を抱えています。
ソフトウェアテストについては本を何冊か持っているのでそれを読みつつ、Rでのそれは下記の資料を読み漁るのかな。Rパッケージ開発入門にもテストの章があるので、それも読み直せば以前は分からなかったことも分かるかもしれない?

Unit Testing for R • testthat

Testing · R packages

そして、hoxo_m親分から教えていただきましたが、ggplot2で作成した画像のテストも出来るんですねぇ。こちらも使いはじめました。が、windows環境のせいか、1回のテストで14個warningが出ます。たぶん文字コード由来。が、そのエラーメッセージが化けているのでわからないっていう。まぁ画像を差し替えたらエラーになるし、ちゃんと動作しているということで現状は無視の一択です。

qiita.com

あと、testthisというパッケージがあって、ざっくり言えばusethisっぽいtestthatです。usethisのtest版ですね。これも使いこなせればかなりテスト周りが楽になるのでは…と思っています(現在はとりあえず使い始めたレベル)

github.com

Readme辺りに書かれているように、ショートカットキーにあてておくと便利ですね。

まだ半分くらいしかテスト書いてないので、もうちょっと頑張る。テスト書くとデータ構造(プログラム的な意味で)を意識したり、テストしやすい見通しの良い関数を書こうという気になる(書けるとは言っていない)ので、書くべし。

管理する

先日、drakeというパッケージがCRAN入りしました。

CRAN - Package drake

ropensci.github.io

The drake package is a general-purpose workflow manager for data-driven tasks in R.

ということなのですが、まぁワタシが使っても問題なかろう、と。テストまわりの、生成したデータの管理とかも出来るんだろうか。本来の目的とは違うかもしれないが。

他が片付き次第...

ここに至るまで

ここに至るまでには下記の記事を経由しています。つまりコレが最終形とも限らないのですね、というかこの記事を書いた当時と現時点で既に変わっているので。これは日記です。これは日記です1niszet.hatenablog.com

niszet.hatenablog.com

ドキュメントの規模や内容、使いまわしの有無や管理の方法等々で、色々な閾値が変わってくると思います。なので、状況に応じてどこにどの程度力を入れるのか?を考えておかねばならないと思います。

まぁ、そらそうか。普通だな。。。

が、テストを作っておくことや再現可能である環境の作成は別にこれに限らず必要なので、やっていく💪

Enjoy!!


  1. 大事。2回。