餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

Rによる解析結果をShinyでインタラクティブにプレゼンテーションしよう

数理モデルの数値解析や統計解析では、パラメーターを色々といじったり、変数や分析期間を変えたりして計算をやり直したり、結果の一部分を切り取って参照したいときがあります。プログラムをぽちぽちと変えていけば実現できるわけですが、ぱっと見ではそのコードを書いている人以外は何をしているのか理解できないので、それは説明には向いていないやり方です。

文章に結果をまとめる都合もあり、あらかじめ多種多様な分析結果を用意しておくことが多いと思いますが、GUIのフォームに入力したパラメーターに応じてリアルタイムに表示を変えて見せるのも有効な手段です。RはGUIアプリケーションの構築に向かないツールですが、RStudio社が出しているShinyパッケージで手早く入力フォームの構築と処理を書くことができます*1

1. Shinyの使い方

やり方を説明しようと思ったのですが、公式ページからたどれるドキュメントが十分によく整備されているので説明すべきことが残されていません。英語が苦手な人でも、

install.packages("shiny")

をした後に、

library(shiny)
# CTRL+CかSTOPボタンで中断
runExample("01_hello")

と例を表示させると、そこに例のコードも表示されているので、何となく使い方が分かることでしょう。なお、例はインストールされたshinyパッケージのフォルダーの中のexamplesフォルダーに格納されていて、01_hello, 02_text, 03_reactivity, 04_mpg, 05_sliders, 06_tabsets, 07_widgets, 08_html, 09_upload, 10_download, 11_timerの11種類があります。

2. 実例

例も豊富なので無用感もあるのですが「Rでエッジワース・ボックスを描こう」で使ったコードを関数化して、Shinyを通してプロットする(ローカルで動かす)ウェブ・アプリケーションを作成してみました。ソースコードの全体はMercurialのリポジトリにして公開しているので、そちらを参照してください。

そこそこそれっぽく動くと思いますが、Shinyのための作業は

  • コード例01_helloにスライドバーとチェックボックスを追加
  • グラフィックス・デバイスの指定部分を含まないプロット部分を、スライドバーやチェックボックスからの入力に対応した引数を持つ関数化
  • コントロール(フォーム)に変更があった場合に呼ばれる関数serverの中のrenderPlotの中のhist関数を、前段の作業でつくったdrawEdgeworthBox関数に置換

したぐらいです。統計解析とちがって見栄えが全てだけに、習うより慣れろ系のツールですね。

3. RADとして使う分には便利

迅速開発ツール(RAD)なので、楽をする範囲では*2レイアウトに制約が大きく、独自仕様のコントロールをつくったりはできないですが、数値解析のパラメーターを変えて見るのには十分な機能だと思います。
なお、スライドバーやチェックボックスなどの配置するコントロールを規程する関数の引数themeにBootstrap theme objectを与えると、色調や利用フォントを変えられます。例えば、

ui <- fluidPage(
    theme = bslib::bs_theme(bootswatch = "minty"),

というようにすると、テーマmintyが適応されて全体の色合いが調整されます。利用できるパッケージ内蔵テーマは

bootswatch_themes()

で一覧することができ、内蔵していないのは、

ui <- fluidPage(
    theme = "path/to/bootstrap.css",

というような感じで、ファイル参照して利用することができるようです。
さらに、入力フォームの定義にも結果の出力にもwithMathJax関数でTeX記法が使えるので、見栄えはそこそこの説明資料としては十分に機能するはずです。

4. C拡張やFortran呼び出しとあわせると効果が高い

特に微分方程式モデルの説明に凄くよさそうなのですが*3、応答までの時間は数秒ぐらいにしておかないと、見ている人はストレスを感じます。ところが微分方程式モデルはその解法から繰り返し計算の山なので、Rでの処理に向きません。数理モデル次第ですが、CやFortranと比較して30倍ぐらい遅くなります。逆に言うとFortranあたりで書いた数値解析をRから呼び出し*4、Shinyでインタラクティブにプレゼンテーションするのは、高速性と使い勝手の相乗効果が出て良さそうです。

*1:外部プログラムからRをコントロールする術は色々とあるのですが、本格的にウィンドウ・アプリケーションを書ける言語は煩雑なことが多いです。

*2: htmlを埋め込むこともできるので、頑張ったら色々できると思います。

*3:連続的に変化するパラメーターの無い計量分析結果の説明は、何かの方法で提示するモデルを絞って、静的なプロットを何枚か用意する方針の方が分かりやすい。

*4: Fortran and R – Speed Things Up | R-bloggers