戯言日記

Rの話だと思ったら唐突にサバゲーが混じってくる何か。

【R-bloggers翻訳】Python DashとR Shinyのどっちを選ぶべきか

R-bloggersを眺めていたら面白い記事が入っていた。

www.r-bloggers.com

「ShinyとDashのどっちが今後もWebアプリを作っていくのに良いの?」って内容。
Rを使っている人からすると「Shinyから乗り換えるべきか否か」で読む感じか。
記事の流れとしては「それぞれの紹介」→「各ポイントにおける評価」→「全体のまとめ」となっている。

自分の場合、周囲にPythonを使う人が多いので、人とWebアプリを共有するならShinyよりDashがいいのかなとか思うことも結構ある。
そういう人の判断材料にもなりそうな記事なので、自分用のメモも兼ねて簡単に要点だけ纏めておく。

Pythonは初心者に毛が生えた程度の人間なので、変な記述等あればご指摘ください。


R Shiny

Rのヘビーユーザーにはお馴染みのアレ。
個人的な最大のメリットは「Rの知識だけでも書ける」こと。

Python Dash

PythonでWebアプリケーションを作るためのフレームワーク
Pythonだけでなく、もう少し広い範囲の知識が必要。

ShinyとDashの比較

6項目で比較しているので、順番に見ていく。

1. ツールとしての有用性

判定:引き分け
「どっちも十分にWebアプリを作ることができる」

性質は違うが、Webアプリの作成自体には差はないとのこと。
これは今回の議論の前提だと思うので、「ですよね」としか。


2. ボイラープレートコード(boilerplate code)

判定:R Shinyの勝利
「最小構成ならShinyがほんの少しだけ優位だけど、アプリが複雑になるほどDashは記述が複雑になるから差が開く」

ボイラープレートコードとは、いわゆる「絶対に書かないといけないコード」。Shinyなら「library(shiny)」とか「server <- function(input, output){}」などが該当する。
Shinyだとパッケージの読込コードが増える程度なので、確かにシンプルな構成かも。


UIのデザイン

判定:R Shinyの勝利
「ShinyのselectInput()やradioButtons()などは特に設定しなくても最初からデザインがいい感じになっているのに、Dashだと個別にやらないといけないから面倒」

サバゲーマー風に言うと「Shinyの方が箱出し性能(straight out of the box)はいい」ので、初期設定だけでそれっぽい見た目になるしコードも短く済む。
そのまま行ける東京マルイと、調整した方が使いやすい海外製みたいなものか(適当)。
でも初期設定のまま使ったりはしないでしょ?ということで、次の項目に進む。


CSSを利用したUIの変更

判定:Python Dashの勝利
「Shinyは初期設定でデザインがしっかりしている分、CSSで追加しようとすると少々手間がかかる」

上の項目で初期設定が貧弱と言われたDashだけど、それは裏を返せばCSSでの設定をやりやすいということになる。
そのためCSSを利用してデザインを変更する場合はDashに軍配が上がる。


Bootstrapを利用したUIの変更

判定:Python Dashの勝利
「ShinyだとBootstrapをまともに使えない、よって明らかにDashの勝ち」

Bootstrapとはフロントエンドのフレームワークの一種。Twitter社が作ったらしい。
あとトップページのアイコンがどう見ても座布団3枚。

getbootstrap.jp

詳しくないのでwikiで調べたら、GitHubで4位とかなり人気とのこと。

Dashだと「dash_bootstrap_components」ライブラリをインストールするだけで使えるが、Rだと対応していない(無いこともないのだが、最新版には対応できていない)。使うとしてもHTMLをまるっと記述するレベルで手間がかかる。
そのため、Bootstrapを利用したUIデザインを作りたい場合はほぼDash一択。


"reactive"性

判定:R Shinyの勝利
「Shinyの方が少ないコードで記述できる」

未だに「reactive」の綺麗な日本語訳が思いつけないShinyユーザーが大半を占めていると思うの自分だけだろうか。
「interactive」に近いんだけど、「双方向」とか「対話型」とかはまた少し違う感じだしなぁという。

Dashと比較すると、Shinyの方が少ないコードで書ける。実際、同じようなアプリを組むために必要なコードの行数はだいぶ異なる。

でもこの項目、reactivityについてはあんまり言及していないような……。
コード量について言及してるくらいだし、ここだけ展開に何となく違和感がある。
インタラクティブなグラフを描くのが楽なのはどっち?」ってことなら明らかにShinyだけど、この項目はそういう解釈でいいのか……?


まとめ

結果:

  • R Shiny……3点
  • Python Dash……2点
  • 引き分け……1点

Q.じゃあR Shinyを使えばいいの?
A.いや、状況とかによって違うんじゃない?


じゃあここまでの話はなんだったのか。

所属する組織がRメインならShinyを採用とか、Bootstrapをどうしても使いたいならDash一択とか、文脈的にはたぶんそういう話だと思うけど。

その上で、Shinyが優れているポイントを挙げていたので、抜粋。

  • コード量が少ない
  • React.jsの知識が不要(これってreactivityの項目で言及すべきでは?)
  • 「intermediate reactive variables」がDashにはない

3つめの「intermediate reactive variables」について、Pythonに慣れ親しんでいる訳ではないのでちょっとよく分かっていない。
直訳すると「中間反応変数」なので、Shinyのreactive()のことか?

上の認識で合ってるなら、UIでの動きに対応して変化する変数を設定できないのがネックって意味合いになるので、reactivityの項目に書かれていた「1つのcallback内に必要なものをなるべく全部詰め込まないといけない」って部分の説明になりそう。
確かにこれならreactivityが低いってことになるので、この推測で合っててほしい(?)。


結論:
「パワフルで、カスタマイズできて、インタラクティブで、見た目がよくて、ユーザーの入力にちゃんと応答するダッシュボードを作りたければ、Shinyは最適」

コーディングの知識は必要だけど、R自体が複雑な言語じゃないから、2日~2週間もあればできちゃうよ!とのこと。
R独特の表現とか考えるとむしろ知識ない方が混乱しないレベルなので、むべなるかな。

個人的なまとめ

全体の印象は、「既にRまたはPythonを使っている人は慣れている方でやればいい」っていうのと、「これからWebアプリを作るためにどちらかを採用したいって人にはShinyがオススメ」ってところか。
初心者に勧めるならもっと他にあるんじゃないの?って疑問はさておき。

少なくとも、(デザイン面の自由度に多少の妥協ができるなら)RユーザーがわざわざPython Dashに切り替える必要はなさそう。


Enjoy!!