2018-09-15

R Shiny を使ってみる

Shiny は R のパッケージの一つで、 このパッケージを使うと R を用いて対話的に操作する Web アプリケーションを作成することができます。Web 上のユーザーインタフェース部分を司る ui.R と、内部動作を司る server.R の二つの R 言語スクリプトで、サーバーサイドのコンテンツを作成できることが大きな特徴です。

参考サイト [1] より引用

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 を選択します。

RStudio 上で Shiny による Web App の作成

Shiny パッケージがインストールされていない場合、以下のようなダイアログが表示されますので Yes ボタンをクリックして Shiny パッケージをインストールします。

RStudio 上での Shiny パッケージのインストールを確認するダイアログ

すると、パッケージのダウンロードと(コンパイルおよび)インストールが始まります。

RSTudio 上での Shiny パッケージのインストール

Shiny パッケージのインストールが終わると、Shiny の Web アプリケーションを作成するダイアログが表示されます。

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 」をクリックします。

生成された ui.R と server.R

RStudioのブラウザのウィンドウがあらわれ Web App である test が実行されます。

Web App test の実行例

Number of bins: と表示されたスライダーをマウスでドラッグしてずらすと、右側のヒストグラムの bin の数(ヒストグラムのバーの数)がそれに応じて動的に変化します。

なお、「  Run App 」の横にプルダウンメニューがあり、Web App の出力先を、専用のブラウザウィンドウ、RStudio の内部の Viewer パネル、および外部のブラウザから選択できるようになっています。

Web App の出力先の選択

ui.R と server.R

まず ui.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 の値を取得

パネルなどのレイアウトの様子を図示したものを下記に示しました。

ui.R によるレイアウト

次に server.R を下記に示しました。最初の shinyServer 関数は、ui.R の shinyUI 関数と同様に Shiny 0.1 より前のバージョンとの互換性確保のために残している関数で省略出来ます。

リスト:server.R 
#
# 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 より前に使われていた書式との互換性を保持する必要は無いように思います。

参考サイト

  1. Shiny - RjpWiki
  2. Shiny クックブック: Shiny app 開発のための日本語リファレンス

 

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: