前置き
R言語をそれなりに使えるようになり、別言語を時折思い出したかのように勉強してみるのですが、その目的が「デスクトップアプリを作成したい」からです。
WebアプリはRのShinyでそれなりに自分が作りたいものを作れるようになったので、「よし」としています。ただ、どうしてもデスクトップアプリを作りたいと思い、PythonのTcl/TkでGUIを作れないか?C#ならどうだろう等を探索してみたのですが、Rでできることを別の言語で再現するハードルが相当高く、挫折していました。(Pythonならできなくはなさそうですが、やっぱりPandasよりTidyverse愛が強く・・・)
そんな中、YoutubeでShiny+Electron1という動画をみて、「これだ!」と思いElectronを勉強して、いくつかネット上で発見したShinyアプリをElectron化する方法を試みてました。・・・ここ1年半くらい。
何度やっても
- 環境構築に失敗する
- Electronは立ち上がるもShinyはうんともすんともいわない
ということの繰り返しで、Shiny+Electronは自分には無理なんではないかと諦めかけていました。最終的には、このブログ記事を見て、諦めました。(Shiny+Electronはその労力に見合う価値がないのではないか?という記載です)。さようなら、Electron。
そのかわり、ブログ記事には、「DesktopDeployR」というWindowsユーザー限定のフレームワークについて言及されており、だめもとで利用してみたら、あっさり日本語を含んだShinyアプリがデスクトップアプリとしてインストールできたので、ここに、その試行錯誤の結果を将来の自分のためにも記録しておきます。
前置き終わります。
DesktopDeployRでの準備
githubのレポジトリをクローンする
この記事では、前提として、パスの長さを短くするために、C:/appというディレクトリにアプリを作成していくという形にします。また、アプリの名前はdesktopappということにしましょう。
まずは、DesktopDeployRをC:/appにGithubからクローン2しましょう。コマンドラインから次のように入力します。
cd C:/app git clone https://github.com/wleepang/DesktopDeployR.git desktopapp
また、作業の履歴を残すために、ブランチを作成しておきます。
cd desktopapp git checkout -b MyApplication
ここまでの手順で、アプリのフレームワークを利用する準備は完了です。
R-portableを保存する
Shinyアプリのデスクトップアプリ化をするためには、「R本体」をアプリに含んであげる必要があります。そのため、アプリの中に入れるための「R本体」、R-portableを次のリンク先から入手しておきましょう。
https://sourceforge.net/projects/rportable/
インストールファイルはexeファイルなので、保存場所を、C:/app/desktopapp/dist/R-Portableに指定したうえでインストールします。そうすると、保存場所にR-portableがインストールされます。

アプリの作成
app/shinyの中にアプリを作成
R-portableの導入まで終わったら後はアプリを作成するだけです。ここでは、以前作成したNDBオープンデータ可視化アプリを作成する際に利用したデータを利用して医薬品の処方件数を描画するアプリを作成してみました。
このレポジトリにおいてあります。
また、アプリのサーバー部分には必ず、
session$onSessionEnded(function() {
stopApp()
})
という命令をいれておかないと、起動したアプリの画面を閉じてもRが動きつづけて、意図しない挙動となったため、ブラウザを閉じたらアプリそのものを止める命令を入れておくこと、重要そうです。
app/app.Rの編集
レポジトリの指示では、ここを編集となっています。app/shinyディレクトリないにアプリを作成したのでここの部分の編集は必要なさそうと思っていたのですが、もともとが、
# app launching code, e.g.:
shiny::runApp("./app/shiny", launch.browser=TRUE)
となっています。
これは、単一フォルダにui.Rとserver.Rがある場合の書き方です。今回のアプリはapp.Rというファイルを実行してあげる必要があるので、
# app launching code, e.g.:
shiny::runApp("./app/shiny/app.R", launch.browser=TRUE)
と書き加えてあげないとうまく動きません。
必要なパッケージの指定
app/packages.txt内に、必要なパッケージを記述してあげる必要があります。また、CRANにないパッケージの指定は別途しなければならないみたいです。今回の場合はCRANにあるパッケージしか利用していないので、ここは気にしなくても良さそうです。
アプの中で利用しているパッケージを全てapp/packages.txtに記載してあげます。
# Primary package dependencies for the application that are loaded during
# startup.
#
# If not available, they will be installed into app/library. Custom source
# packages need to be installed manually.
# bare miniminum: configurations are stored in json format
jsonlite
# if deploying shiny based applications:
shiny
readr
ggplot2
DT
plotly
dplyr
stringr
アプリの説明の記載
desktopapp/app/config.cfgにJSONっぽい設定ファイルがあるので設定しておきます。今回は実験的な意味合いが高いので、最低限の設定だけ書き換えて、2行目でアプリ名を指定するだけにしておきます。
"appname": "NDBオープンデータ可視化アプリ",
あと、実行するRのパスがR-portableになっていないので、
41-43行目付近の、
"r_exec": {
"home": "C:\\Program Files\\R\\R-4.0.2\\bin"
},
を、
"r_exec": {
"home": "dist\\R-Portable\\App\\R-Portable\\bin\\"
},
と書き換えておきます。
batファイルの名前の変更
desktopapp/appname.batというファイル名を、好きな名前に変更しておきます。今回は、上の設定で利用した名前をそのまま利用してみます。なので、desktopapp/NDBオープンデータ可視化アプリ.batとしておきます。
以上でできあがりです!
あとは配布できる形にしていくだけです。
配布の準備
現時点で、配布するにしても、パッケージが含まれていません。そのため、1度、実行して、依存関係にあるパッケージをR-portable内にダウンロードしてあげる必要があります。そのためには、desktopapp/NDBオープンデータ可視化アプリ.batを実行してあげましょう。(1回目の起動には依存パッケージのインストールがあるため時間がかかります。)
パッケージのインストールがおわれば、app/libraryフォルダ内に、依存するパッケージが並んでいるはずです。
ここまで終われば、後はEXE化をするだけです。
EXE化
ここからは、ものすごく不勉強なのであまり説明できません。Exe化(インストーラー化)するために、Innoというソフトを利用します。
このサイトから、InnoSetupをダウンロードしてパソコンにインストールします。それで、インストールされたInnoSetup Compilarを起動して、
次のような手順で、InnoSetupのウィザードをすすめます。InnoSetup、まだ使い方もよくわかっていないので、とりあえず今回のサンプル実行ファイルを作成するためにとった手順を記録しておきます。(詳しい方がいらっしゃったら教えて下さい)
ウィザードで作成を選んで、

適当に設定を入力
フォルダ名の設定?
ここで、作成したbatファイルをしてしてあげます。

他のフォルダも追加しておきましょう



多分、ここの設定は間違えた気がする・・・
他の設定をいじって


とりあえず今回は日本語のみ



コンパイルをします
とそのまえに、スクリプトを保存しますかと聞かれたので保存しておきましょう

あとは待つ!(数分かかりました)


そして、出来上がったのが、
このexeファイルです。
自宅の別のPCにこのファイルを移して本当に動くかを試してみます。

無事に動きました!
まとめ
今回、desktopDeployRのフレームワークを利用して、Shinyアプリをインストール可能なデスクトップアプリとして作成する手順を追ってみました。この方法だと、相当手間取るElectron(Node.js)の環境設定がなしでアプリを作成できます。
個人的には、メリットとして
- 日本語が普通に動く
- 環境構築の手間がほぼない
があげられます。デメリットとしては、
- Windows限定
- インストーラやインストール後のファイルサイズがそれなりに大きい(数百メガバイト~1Gb?)
と感じました。
尚、動作の保証や意図せぬ動作などの保証はいたしかねますが、次のリンク先にexeファイルを置いておくので、興味がある方はインストールしてみてください。(完全に自己責任でお願いします)
400MBもインストールスペースがいるのはちょっとあれですけど・・・R-portableに含まれている使わないパッケージを消すともう少し軽量化できる気がしますが、今回はここまで!
Have a happy R life!
宣伝:Shinyアプリの作成方法について解説したオンラインコースを作成しております。もし、「Shinyについてわからないけど学んでみたい」という方で、「日本語のオンラインコースが良い」という方は購入を検討していただけると嬉しく思います。(本家、RStudioのオンラインコース(英語)もわかりやすいので、英語が大丈夫な方はそっちの方が無料で良いかもしれません。)
-
Electronは、JavaScriptでデスクトップアプリを作成するという仕組みで、GUIをHTML+CSS、ロジック部分をNode.Js(JavaScript)で動かすというものです。Shinyも、GUIはHTML+CSSでロジック部分がRなので、JavaScriptを学ぶと、実はShinyアプリの表現が広がるので、Electronを使うとか以前に、Shinyアプリ作成する場合に学んでおくと便利です。(JavaScriptのライブラリをRに入れたりするようなこともできます) ↩
-
Github、Gitなどについては、本記事の解説のスコープからはずれます。ちょっと勉強するとものすごく便利です。他の人と協同で利用しない場合はそこまで詳しく勉強する必要はないと思います。が、他の人と協同で利用するならそれなりに勉強しないと多大なご迷惑をおかけすることも・・・(過去と現在でも結構色々やらかしてそのたびに反省しています・・・) ↩
コメント