Tech Sketch Bucket of Technical Chips by TIS Inc.

Shiny を使ってR言語のプログラムをWeb アプリ化する

Pocket

R は統計解析向けのプログラミング言語で、お手軽にデータ分析を行うことができます。そして、R での分析結果は、Shiny というR のパッケージを使うことで、簡単にWeb アプリ化することができます。今回はR プログラムを簡単にWeb アプリ化するShiny パッケージと、Web アプリとして公開することができるShiny Server について紹介します。

What's Shiny?

shiny.png

Shiny とはR のIDE である RStudio の開発元のRStudio Inc. が開発しているプロダクトです。Shiny を使うとR のプログラムを簡単にWeb アプリにすることができます。

Shiny で作成したWeb アプリはブラウザからのユーザー入力などをトリガーに、インタラクティブにR のプログラムを即時実行し、その実行結果を動的に確認できます。見た目に関しては、Shiny が内部的に Twitter Bootstrap を利用しているため、その恩恵を受けてそこそこのUI がお手軽に実装できます。

Shiny にはR のコンソールからロードして起動することができるパッケージ版と、単独でアプリケーションサーバーとして起動できるShiny Server があります。今回の記事では、パッケージ版のShiny と、Shiny Server の両方を順番に紹介します。

Shiny パッケージとShiny Server の動作環境

Shiny パッケージはR のパッケージとして提供されています。原則的には、R が動作する環境であれば、Linux でも、Windows でも、Mac でも install.packages() することでインストールでき、どの環境でも動作します。
ただし、Windows 上のShiny では、R のコード中に日本語が含まれている場合、文字コードの問題でWeb アプリを起動できなかったりとハマりやすいので、日本語で本格的に開発したい場合はWindows 以外のOS を選択することをオススメします。

続いて、 Shiny Server は執筆時点でLinux 向けとして、 「Ubuntu 12.04 」 版、 「Red Hat/CentOS 5 and 6」 版が提供されています。今回はShiny Server をUbuntu12.04 がセットアップされたAmazon AWS のEC2 インスタンスにインストールし、その上でWeb アプリを動作させます。手元にUbuntu マシンを用意できる場合も、基本的に手順は同じです。

環境構成は以下の通りです。

  • クライアントマシン環境構成とバージョン情報
    • Mac OSX Mavericks 10.9.2
    • RStudio 0.98.490
    • R 3.0.2
    • shiny 0.8.0
  • サーバーマシン環境構成とバージョン情報
    • Amazon EC2 micro instance
    • OS Ubuntu 12.04 64bit
    • R 3.0.2
    • shiny 0.8.0
    • shiny-server shiny-server-1.0.0.42-amd64

Shiny を使ったWeb アプリの始め方

RStudio を既にインストールされている方は、RStudio から直ぐにShiny を始められます。以下でShiny を使ったWeb アプリの始め方について説明します。

Shiny Web プロジェクトの作成

どちらも同じRStudio, Inc. が開発しているということもあり、Shiny はRStudio に統合されています。そのため、RStudio を既にインストールされている方は、RStudio から「Shiny Web アプリケーション」として新規プロジェクトを作成するだけでShiny を始められます。

RStudio のメニューの「New Project」 を選択し、Create project from: が表示されたら「New Directory」 を選び、「Shiny Web アプリケーション」を作りましょう。

rstudio-select-shiny.png

新規プロジェクトを作成すると、「Shiny Web アプリケーション」用のテンプレートファイルが用意されているので、そのままShiny をインストールしさえすれば、サンプルWeb アプリを起動できます。

Shiny のインストール & Shiny の起動

インストールと起動は簡単です。以下のコマンドをコンソールから入力するだけです。

上記の runApp() コマンドを実行すると、ブラウザが起動し以下のようなページが表示されたのではないでしょうか。あとは、テンプレートファイルを参考にカスタマイズすることで、あなただけのR のWeb アプリを作成することができます。

first-shiny-web.png

試しに、画面左のサイドバーパネルのスライダーを動かしてみてください。すると、画面右のメインパネルのヒストグラムが、リアルタイムに変化します。内部的にはR の hist() 関数が実行された結果が描画されています。

Shiny アプリの構成(ui.R と server.R)

Shiny アプリは、基本的にはView の役割を担う ui.R と、Controller の役割を担う server.R の2ファイルから構成されます。少ないファイル数で非常にシンプルな構成になっています。実際に、RStudio のテンプレートとして自動生成されたファイルを見ていくことにします。

  • ui.R

ui.R のそれぞれのパネルは以下の図のように対応しています。

first-shiny-web-with-panel-name.png

  • server.R

server.R 側の大まかな動きは、 ui.R から input$(変数名) を入力として受け取り、何らかの処理を行い、その結果 output$(変数名) を出力として ui.R へ返すという流れになります。

その他のサンプルShiny アプリについて

なお、Shiny に用意されている以下のコマンドを実行すると、サンプルに用意されているShiny のデモを見ることができます。

「01_hello」 以外にも、サンプルは多数用意されています。全てのサンプルの一覧は以下のコマンドで取得でします。

もし、実際にR を実行する環境が用意出来ない方は、以下のShiny の公式サイトのデモを見ていただくと、Shiny で実現できることがイメージできるかと思います。

Shiny のリアクティブ・プログラミングについて

デモアプリで見られるようなリアルタイムで動的な結果反映については、Shiny の特徴の一つであるリアクティブ・プログラミング(反応的プログラミング)が実現しています。リアクティブ・プログラミングは、入力値の変更を自動的かつ反応的に伝播させることのできるプログラミングです。Shiny アプリを開発する人はShiny のお作法にのっとってプログラミングするだけで、リアクティブプログラミングの恩恵を受けられます。Excel のセルに埋め込んだ関数式が逐一、参照しているセルの結果が変わる度にリアルタイム変更を反映させるのと近い感覚で、ダイナミックなWeb アプリを作成することができます。

リアクティブプログラミングの雰囲気を掴んでいただくには、以下の公式サイトのShiny Lesson (英語) を試していただくのがよいでしょう。Shiny Lesson は英語ですが、Lesson 1 〜 10 のプログラムを実行してみれば特につまずく点も少ないかと思います。

Shiny Server の始め方 (Ubuntu 12.04)

ところで、Shiny パッケージ版だとWeb アプリ運用には向いていません。Webアプリを利用して本格的に解析結果などを公開する場合には、Shiny Serverを利用しましょう。Shiny Server とはnode.js で作られているサーバーアプリケーションです。このShiny Server へR で作ったShiny アプリをデプロイする形で、複数ユーザーの利用に対応することができます。

Ubuntu on AWS の環境のセットアップと接続

AWS でEC2 インスタンスを作成します。AWS を利用する際の詳細な説明は割愛しますので、EC2 インスタンスの作成方法については、以下の記事など、公開されている情報を適宜参考にしてください。

インスタンスを作成するにあたって注意するポイントが2点あります。

1点目は、選択するAMI は以下の通り Shiny Server が正式に対応しているOS である Ubuntu 12.04 を選択して下さい。
select-AMI-ubuntu.png

2点目は、Security Group は以下の通り、 3838 への接続を許可するようにしておきましょう。もちろん、設定でポート変更できますが、Shiny Server はデフォルトで 3838 ポートを使います。許可する接続元 IPアドレスも必要に応じて制限して下さい。
ec2-setting-sg.png

インスタンスの作成と起動が完了したらssh でubnutu ユーザーで接続します。

接続ができたら次は、R と Shiny Server のインストールを行います。

Ubuntu へR のインストール

R のインストールは、 ubuntu 12.04へのRインストール手順 の記事の手順を参考にし、以下の通り実行しました。

  • apt-get を最新へupgrade

事前設定として、最新の3. 系のR を取得できるよう、パッケージを取得するミラーサイトに筑波大学のURL を追加します。以下の作業を行わないと、執筆時点では2. 系のR がインストールされてしまいます。

deb http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu precise/

公開鍵の設定を行い、R とパッケージのインストールを行います。

以下の通り、R がインストールされているか確認します。

R version 3.0.2 (2013-09-25) -- "Frisbee Sailing"
Copyright © 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

正常にR 3.0.2 がインストールされていることが確認できました。

Ubuntu へのShiny Server のインストール

Shiny Server にはOpen Source Edition (以下、OSS 版) とProfessional Edition がありますが、今回は、無償で利用できるOSS 版を利用しました。OSS 版のインストール手順は こちら にあります。実際に、手順に沿って実施してみます。まずは、Shiny Server のインストールにはShiny パッケージが必要になりますので、Shiny をR のパッケージとして install.packages() します。

続いて、Shiny Server のインストールです。Shiny Server は一度ローカルにダウンロードしてから、 gdebi-core でインストールします。

Setting up shiny-server (1.0.0.42) ...
Creating user shiny
shiny-server start/running, process 15174

インストールが正常に完了すれば、上記に表示されるように shiny ユーザーが作られ、 Shiny Server が自動的に起動します。その結果、以下ようなURLでアクセスできることが出来ます。ただし、まだアプリを作っていないので、空のインデックスが見えるだけです。ここに、Shiny アプリを作っていきます。

http://ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com:3838/
(XXX-XXX-XXX-XXX は自身の環境に合わせて読み替える。)

上記でアプリが見えるようにするためには、Shiny Server の /srv/shiny-server/ にアプリを配置していくことになります。

Shiny Server へのアプリの配置(デプロイ)

今回は、Shiny パッケージ版で動作確認してみたサンプルアプリ "01_hello" をShiny Server に配置してみることにします。サンプルアプリ "01_hello" はShiny パッケージがインストールされた場所にあるので、以下のコマンドでコピーします。

もし、Shiny が上記の場所以外にインストールされていれば、以下のコマンドで確認してください。

どうでしょうか、以下のURL で、再度アプリが表示されたでしょうか?

http://ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com:3838/

Shiny Server の設定

Shiny Server の設定は default.config ファイルで行います。例えば、 3838 以外のポートで起動させたい場合は default.config ファイルを以下のコマンドでリネーム&コピーした上で、リネームした shiny-server.conf ファイルを編集して、 listen 3838; の値を listen 80; などに変えてみましょう。
(AWS のSecurity Group で許可するポートの追加も忘れないようにしましょう。)

その他のShiny Server の設定変更は Administrator's Guide(英語) を参考にして下さい。なお、Shiny Server の停止、起動、再起動のコマンドは以下の通りになります。設定を変更した場合、忘れずに再起動しましょう。

これで、R のプログラムをShiny として公開する準備が整いました。 あとは、あなたのShiny アプリを用意するだけです。 Shiny Tutorial(英語) などを参考にあなたのアプリを作り、早速公開してみましょう。

Shiny まとめ

筆者が上記のサンプルとは別に、実際にShiny アプリを作ってみた感想としては、Shiny アプリはこんなシーンでオススメです。

  • 限られたメンバー間でR の動的な分析レポートを常に最新の状態で共有したい
  • 単ページで完結するシンプルな構成のアプリを作りたい
  • Webアプリ開発に関する知識・開発経験が少ない場合

限られたメンバー間でR の動的な分析レポートを常に最新の状態で共有したい

R で分析したレポートの配布方法(公開方法)については、R ユーザーの関心事のひとつではないでしょうか。R には RMarkdownknitr の組み合わせで静的レポートを生成し、配布するという選択肢もありますが、基本的には静的なレポートなのでレポートの魅力が最大限発揮できないかもしれません。公開用のサーバーを用意できなければ、配布したバージョンの管理も煩雑になります。その点、Shiny Server を利用することで、動的な最新の分析レポートがエンドユーザーへ提供できます。

一方、不特定多数の大規模での利用はパフォーマンス的に厳しいです。もちろん、サーバースペック&処理内容にもよりますが、数人が同時にアクセスしただけで役に立たなくなることもあります。IP アドレスなどでアクセス数を制限できる範囲内で利用するのが良い気がします。ただし、複数サーバーでR のプロセスを起動させて分散処理させることも可能です。具体的には wdkz 氏の資料 Shiny-Serverあれこれ が詳しいです。興味がある方はぜひ参照してみてください。

単ページで完結するシンプルな構成のアプリを作りたい

Shiny で作るWeb アプリは、画面からの入力を受けてR の関数に投げて結果を表示するだけのような、分析手法的には複雑であっても、処理内容的には簡潔なシーンに向いています。 server.Rui.R と+α のファイルで書ける程度の構成であれば、簡単にWeb アプリ化できます。

一方、ログイン認証や、画面遷移などを行う分析以外の役割を持たせた多機能なWeb アプリとしては向いていません。他の言語のWeb アプリのフレームワークであれば簡単にライブラリをインストールすることで導入できるようなことも、自前で作成する必要があったりします。このあたりは、Shiny のバージョンアップによって今後状況が変わって行くかもしれません。

Webアプリ開発に関する知識・開発経験が少ない場合

Shiny は基本的なR の知識と、Shiny をインストールするためのちょっとしたOS の知識さえあればShiny アプリとして簡単に公開できます。R プログラマの中には他の言語には詳しくない方や、Web アプリの開発経験が無い方もいると思いますが、Shiny がある程度吸収してくれるので、RStudio のみで ui.Rserver.R を作成すればWeb アプリを開発できます。リアクティブ・プログラミングのサポートもあり開発者は関心事を最大限に分析へフォーカスできます。

最後に

R での分析結果のWeb 公開という点においては、上記のShiny という選択肢以外にも、いくつか別のアプローチも考えられます。

例えば、Python だと、Python & Django で作ったWeb アプリからPython の分析系ライブラリを呼び出したりすることでWeb アプリ化することが出来ます。Ruby の場合だと、Ruby からR を呼び出せる RSRuby を使って、Ruby on Rails で作ったWeb アプリから分析部分だけRを呼び出すということが出来ます。もし事前にR で分析作業を済ましてすべてのデータをあらかじめ用意できる場合であれば、D3.js や rCharts などを使ってJavaScript で動的なWeb アプリを作ることも出来ます。

要件と、自身の得意な言語や技術に応じて、Web アプリ化のアプローチを検討するのがよいでしょう。

参考にした情報

エンジニア採用中!私たちと一緒に働いてみませんか?