Shiny は R のパッケージの一つで、 このパッケージを使うと R を用いて対話的に操作する Web アプリケーションを作成することができます。Web 上のユーザーインタフェース部分を司る ui.Rと、内部動作を司る server.Rの二つの R 言語スクリプトで、サーバーサイドのコンテンツを作成できることが大きな特徴です。
RStudio 上で Shiny による Web アプリケーションを作り始めたので、理解したことを備忘録としてまとめました。
本記事で使用している動作環境は次の通りです。
- OS: Fedora 28 (x86_64)
- R: R-core-3.5.0-4.fc28.x86_64, R-core-devel-3.5.0-4.fc28.x86_64
- RStudio: rstudio-1.1.456-1.x86_64
はじめての Shiny による Web App の作成
RStudio を起動して、メニューから File→ New File→ Shiny Web Appを選択します。
Shiny パッケージがインストールされていない場合、以下のようなダイアログが表示されますので Yesボタンをクリックして Shiny パッケージをインストールします。
すると、パッケージのダウンロードと(コンパイルおよび)インストールが始まります。
Shiny パッケージのインストールが終わると、Shiny の Web アプリケーションを作成するダイアログが表示されます。
ここでは Application name:(アプリケーション名)の入力欄に testと入力し、Application type:(アプリケーションタイプ)のラジオボタンの選択で Multiple Files (ui.R/server.R) を選択しました。単一ファイル (app.R) にも対応しているようですが、これは別の機会に試して見ることにします。
Create within directory: に、この Web アプリケーションを保存するディレクトリを指定して Createボタンをクリックします。
すると ui.Rと server.Rの二つのスクリプトファイルが生成されて RStudio 上に表示されます。生成されたファイルはブランクではなく簡単なサンプルが記載されているので、とりあえずこれを実行してみます。Web App の実行は、通常のスクリプトと異なり、RStudio のエディタペイン右上に表示されている「 Run App 」をクリックします。
RStudioのブラウザのウィンドウがあらわれ Web App である test が実行されます。
Number of bins: と表示されたスライダーをマウスでドラッグしてずらすと、右側のヒストグラムの bin の数(ヒストグラムのバーの数)がそれに応じて動的に変化します。
なお、「 Run App 」の横にプルダウンメニューがあり、Web App の出力先を、専用のブラウザウィンドウ、RStudio の内部の Viewer パネル、および外部のブラウザから選択できるようになっています。
ui.Rと server.R
まず ui.Rの内容を見てみます。
#
# This is the user-interface definition of a Shiny web application. You can
# run the application by clicking 'Run App' above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
# Define UI for application that draws a histogram
shinyUI(fluidPage(
# Application title
titlePanel("Old Faithful Geyser Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30)
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
))
ui.Rの構造と役割を、書式を無視して整理すると以下のようになります。
shinyUI ← Shiny 0.1 より前のバージョンとの互換性確保のために残している関数。省略可
│
└ fluidPage ← 可変ページレイアウトを生成
│ fluidPage は縦方向に行パネルを配置して、ブラウザの幅いっぱいになるように行の内容を表示
│
├ titlePanel("Old Faithful Geyser Data") ← アプリケーションのタイトルを表示するパネル
│
└ sidebarLayout ← サイドバーとメインの領域を持つレイアウトを生成
│
├ sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30) ← slider ウィジェットのコンストラクタ
│ ※ server.R の input$binsの値に反映
│
└ mainPanel ← sidebarLayout に渡されるメインパネル
│
└ plotOutput("distPlot") ← パネルに含まれるプロットまたは画像出力要素
※ server.R の output$distPlotの値を取得
パネルなどのレイアウトの様子を図示したものを下記に示しました。
次に server.Rを下記に示しました。最初の shinyServer関数は、ui.Rの shinyUI関数と同様に Shiny 0.1 より前のバージョンとの互換性確保のために残している関数で省略出来ます。
#
# This is the server logic of a Shiny web application. You can run the
# application by clicking 'Run App' above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
# Define server logic required to draw a histogram
shinyServer(function(input, output) {
output$distPlot<- renderPlot({
# generate bins based on input$bins from ui.R
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
# draw the histogram with the specified number of bins
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
})
function関数の引数 inputは server.Rへ渡す値、outputは server.Rから ui.Rへ出力する値になります。server.R内では input$bins、output$distPlotのように $でつなげてそれぞれの引数の要素にします。
まとめ
以上、Shiny で Web アプリケーションにすることによって、R の出力を動的に確認することができるようになります。これはいろいろな用途に有効に活用出来そうです。
使いはじめにインストールされた Shiny のバージョンは 1.1.0 でした。今から Shiny を利用して Web アプリケーションを作るのであれば、Shiny 0.1 より前に使われていた書式との互換性を保持する必要は無いように思います。
参考サイト
- Shiny - RjpWiki
- Shiny クックブック: Shiny app 開発のための日本語リファレンス

にほんブログ村