RstudioとShinyでWebアプリケーションを作成してみた【チュートリアル】

Rのパッケージの一つであるShinyを使うことで、Rで分析した結果をWebアプリケーションとして表示させることができます。



また、パラメータを動的に変更しながらグラフの描画を行い、データの理解や分析結果を眺めることも出来ます。



今回はShinyを使ってWebアプリケーションを作成する方法を書いていきたいと思います。


Shinyアプリケーションでヒストグラムを表示する

まずはヒストグラムを表示させるShinyアプリケーションを作成してみましょう!
Shinyのパッケージをまだインストールされていない方はインストールしてください。

install.packages('Shiny')

次に左上にあるプラスマークのアイコンを選択し[Shiny Web App...]を選択
f:id:yunosuke1107:20180226004357p:plain

「Application name:」には任意の名前を入力してください。ここでは「ShinyApp」を入力しています。
そして、「Application type」は「Multiple File(ui.R/server.R)」にチェックを入れます。これは、サーバー側の処理を書くファイルとUI側の処理を書くファイルを分けることになります。「Single File(app.R)」だと一つのファイルにサーバー側の処理とUI側の処理を書くことになります。コードがややこしくなるので、今回はUIとサーバーを分けておきます。(おすすめ)
アプリケーション名とアプリケーションタイプを選択できたらCreateボタンを押してShinyアプリケーションを作成しましょう!
f:id:yunosuke1107:20180226004739p:plain

そうすると以下の2つのファイルができたと思います。

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")
    )
  )
))


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')
    
  })
  
})

それでは、まずは何もいじらずに[Run App]を押してShinyアプリケーションを起動させてみましょう。
そうすると以下のようなWebアプリケーションが立ち上がるはずです。
これだけでクライアント側から受け取ったパラメータを元に動的にヒストグラムを出力させることができます。
f:id:yunosuke1107:20180226010009p:plain

ユーザーインターフェース(ui.R)

ui.Rはアプリケーションの外観とレイアウトを制御するソースファイルです。

titlePanel("Old Faithful Geyser Data")

titlePanelはそのままの通り、Webで表示されているタイトルの部分です。

sidebarPanel(
   sliderInput("bins",
               "Number of bins:",
               min = 1,
               max = 50,
               value = 30)
)

sidebarPanelは今回の場合、ヒストグラムのbinの数を制御するためのものです。
minにはbinの最小値を、maxにはbinの最大値を指定します。また、valueにはデフォルトのbinの数を指定することができます。

mainPanel(
   plotOutput("distPlot")
)

mainPanelはヒストグラムをプロットしている部分のことです。plotOutputと言う関数を使用して、server.R側で定義した変数名を指定し、グラフをプロットしています。

server.R

server.Rにはサーバー側で処理するコードを書くためのファイルです。このファイルに分析するための処理を書いたり、データを読み込んだりします。

output$distPlot <- renderPlot({
    x    <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    hist(x, breaks = bins, col = 'darkgray', border = 'white')
})

先ほどui.RでplotOutput("distPlot")と書いていました。server.RにdistPlotと言う変数にグラフをプロットする処理を書いていきます。
プロットする処理については、Rを普段使っている人からすれば、簡単にできると思います。


次回は、アプリケーションにいろいろなグラフを表示させたり、ダッシュボードを作成したりする方法を紹介していきたいと思います。
その他のサンプルコードについてはShinyの公式サイトにたくさん掲載されているので、そちらを参考にしてみると良いかもしれません。
https://shiny.rstudio.com/gallery/