2022年11月6日日曜日

R Markdownによる効率のよいレポート作成法を試したら

このエントリーをはてなブックマークに追加
Pocket

統計解析で用いられるR言語から定型処理でHTMLやPDFのレポートを作成するツールR Markdownがぼちぼちと一部界隈で流行っている。

データセットの更新や追加、パラメーターの変更で数値や図表が変化することはよくあるのだが、レポートの関連箇所を手作業で書き替えていくのは、手間のかかる上に見落としなどが入りやすい雑用だ。

R Markdownでレポートを適切に書いておけば、データ更新をしたら一つの命令でレポートの再作成が可能になり、効率がぐっと良くなる*1

1. インターネット・ミームのマッシュアップ

R Markdownは、テキストファイルに簡素でよくSNSで利用されているマークダウン記法なるものを書いて、Rのパッケージで変換するとhtmlやpdfやdocxやpptxやodtのファイルが出来上がる仕組みのRのパッケージだ。マークダウン記法はxmlはもちろんhtmlと比較しても圧倒的に簡素である一方、R MarkdownではTeX記法の数式の表示*2や、Rのコード*3が実行でき*4、計算結果やプロットを埋め込むことが容易にできる。マークダウン記法のファイルはテキスト形式なので編集が用意だし、gitなどの分散バージョン管理システムでの管理や共有も容易に行なえる。そして技術的にはオープンソースの便利ツールを統合した存在だ。

2. R Markdownでプレゼン資料をつくってみた

マークダウン記法がインターネット・ミームの一つであったので、 2012年に誕生したときは一瞬流行って消えるツールかなと思っていたのだが、根強い愛用者が10年間ほど支えてきた*5。もっとも愛用者の謳い文句通りに便利と言えるかというと自信が無い*6。統合開発環境RStudioを使うことを前提にした説明が多いし、プレゼン資料の作成をしてみたいと思っているのだが、実需にあった官公庁パワポのような例はなかった。どれぐらい使えるかR Markdownの人気プレゼン用テンプレートR Markdown Format for reveal.js Presentationsを試してみよう。

結果、官公庁パワポに近づくのは一筋縄にいかなかった。追いつかなくて良いといわれるが、追いつくことは無理そうだ。「R Markdownで作るベタなプレゼン資料」に試した範囲のことはまとめたのだが、ネガティブな話をかいつまむと、

1. 表紙がつけられない
プレゼン用JavaScriptフレームワークreveal.jsをR Markdownから使うテンプレートなのだが、reveal.jsではできるのに、表紙の背景画像だけを変えることができない。RでR Markdownが生成したファイルを書き換えれば済むかと思ったが、RのUnicode処理がemoji非対応なために、バイナリファイルとして処理することになった*7。解決はしたのだが、普通のRユーザーはファイル操作をしないし、ましてやバイナリファイルは扱わない。表紙をつける難易度が高すぎる。
2. 作図は天国だと思ったら
Rには便利な作図用のJavaScriptフレームワークGraphvizとMermaid.jsを呼び出せるパッケージDiagrammeRがある。これらはテキストでグラフの特徴を指定するとそれに沿って作図してくれる優れもので、Graphvizは有向グラフを、Mermaid.jsはより実務的なフローチャートやER図やシーケンス図を描くことができる優れものだ。もしかして天国かと思ったのだが、Mermaid.jsがreveal.jsと相性が悪い。解決はしたのだが、パッケージの関数をフックして、それが生成するファイルに一歩間違うとサーバーに負荷がかかるJavaScriptを仕込むことになってしまった*8。最頻値的なRユーザーは関数のフックはしないと思うのだが、21世紀は違うのであろうか。
3. 文字の色と大きさを変えるのにもCSS
スタイルシートの編集と言っても、文字の色と大きさを変える程度のことは難しいことではないのだが、reveal.jsのクラス名やタグの構造がどこに書いてあるのかが分からない。ブラウザーの「選択した部分のソースを表示」でタグを見ながら設定していって特段の支障はなかったが、htmlの作成に慣れていない人にはスタイルシートの編集はハードルが高いかも知れない。スライドの部分はsectionタグの下にhタグが入る程度の簡素な構造で、マークダウン記法の方でsectionのクラス名を指定できるので、親子セレクタを上手く使えたら特段の支障は無いのだが。
4. ヘッダーとフッターをつけるのにdiv入れ籠のposition指定CSS
日常的に行なっていることなので何の迷いも無くできるわけだが最初はそこそこ大変だった気がするし、Rユーザーのほとんどはウェブページ製作業者ではない。
5. DT::datatableをどう装飾すればいいかわからない
いかにも汎用的に使えますみたいな雰囲気があるのに、idを指定してimportant!をつけないとスタイルシートが変わらないのはどういう事なのか。プレゼンテーションで使う必要はないので、諦める事にしたが。

と言った苦難があった。(1)から(4)は解決はしたのだが、他の皆さんがどうしのいでいるのか。reveal.jsは動作がかっこいいのだが、自由度がかなり低いように感じるのでは無いであろうか。

ポジティブな話としては、慣れてしまったら生産性は高いので、最近、更新を続けている「AV新法成立後のポルノ発売状況」にとりあえず応用してみた。通販サイトの発売日カレンダーの情報をダウンロードしてきて集計し、グラフを2枚出力しつつ今月途中までの状況を一つ本文に書き出す作業がほとんど自動で行なえる。解釈の部分が大きく変われば、そこは手で書き替えないといけないが。

3. まとめ

普通のhtmlの文書は謳い文句どおりにいけそうだし*9、PDFの出力の方は愛用者がノウハウをまとめて公開してくれている。プレゼンテーション資料もどうすればよいか把握できていれば、労力自体は大したことは無かった。そう、やり方が把握できていれば大したことはない。そしてやり方は上述のプレゼン資料に記しておいたので、きっとR使いであれば皆さんにとっても大したことは無いと思う。レポート生成の半自動化に興味があれば、試してみられたし(;´Д`)ハァハァ

*11990年からあるMS-WindowsのMS-Officeなどの製品で使えるOLEドキュメントも動的更新が行なえるが、OLEはデータセットのファイルと最終的なドキュメントが分離できなかったりと、密結合過ぎて使い勝手が悪い面がある。

*2R Markdownというより、R Markdownが呼び出しているドキュメント・コンバータPandocが利用しているツールの機能である。

*3PythonやJuliaのコードもサポートされる。

*4R Markdownというより、knitrパッケージの機能である。

*5Rへの依存度を減らして、設定などで混乱している部分を整理したQuartoという新しいソリューションが出ているが、ほとんど同じように使えるから、今後も残っていく技術だと思われる。

*6GitHubにアップロードする前に.mdファイルの見た目を確認するのに使った事ぐらいしかなかった。

*7Rでバイナリファイルを置換 - 餡子付゛録゛

*8DiagrammeR/Mermaid.jsで描いた図をreveal.jsに何とか埋め込む方法 - 餡子付゛録゛

*9かっこいい見栄えのJavaScriptフレームワークreveal.jsやMermaid.jsの挙動が問題の根本原因なので、簡素なデザインになる場合は問題がおきづらい。

0 コメント:

コメントを投稿