医療職からデータサイエンティストへ

統計学、機械学習に関する記事をまとめています。

Rでwebアプリを作る~初めてのshinyとshinydashbord~

Rでの実行結果や分析結果をインタラクティブなwebアプリにできたら、、そんな風に思ったことはありませんか?今回は、そんな願いを叶えるべくshiniyshinydashbordを使って簡単にwebアプリを作ってみたいと思います。なお、今回の内容は入門編ですので、より深く学びたい方はこちらを参考にされるよいと思います!

RとShinyで作るWebアプリケーション

RとShinyで作るWebアプリケーション

shiniyshinydashbord

shiniyはRで簡単にwebアプリが作れるパッケージです。shinydashbordは、shiniyを元にしたアプリをダッシュボード的に作成できるパッケージになります。この二つを使うと以下のようなアプリも簡単に作ることができます。

Twin Cities Buses

引用:Shiny Dashboard

簡単なGUIの統計ソフトや可視化BIツールなども作れそうですね。それでは早速作ってみましょう!

事前準備と動作確認

まずはRstudioを立ち上げて、shiniyshinydashbordをインストールします。

install.packages("shiny")
install.packages("shinydashboard")

そして以下のコードをコピペして、app.Rとして保存します。

library(shiny)
library(shinydashboard)
ui <- fluidPage(
  dashboardPage(
    dashboardHeader(title = 'My app'),
    dashboardSidebar(),
    dashboardBody() 
  ) 
)
server <- function(input, output) {
}

shinyApp(ui = ui, server = server)

最後にapp.Rを保存した同じディレクトリ 内でrunAPP("ディレクトリ 名")として実行してみましょう。私は"tutorial"という名前のディレクトリ 名で保存しています。

runApp('tutorial')

または、Rstudio内の右上にあるRun Appでも起動します。新しい画面が立ち上がれば成功です。

shiny

アプリの構成

上記のコードは、uiのなかにはアプリの見た目を決めるためのコードを、serverの中にはアプリのインタラクティブな動作を決めるためのコードを書きます。先ほどの例では、serverには何も書いていませんが、上記が基本的な骨組みなり、肉付けをしていくことになります。uiのコードと実際の表示は以下のような対応関係になります。

shiny

また、uiserverを、ui.Rserver.Rと二つのファイルに分けて管理することもできます。その際は、shinyApp(ui = ui, server = server)のコードは必要ありません。アプリの規模が大きくなった場合は、分けて管理した方が良いかもしれませんね。

簡単なwebアプリを作ってみよう

それでは、簡単なwebアプリを作ってみましょう。作るアプリは正規分布の平均と分散をいじって分布の形を変化させて遊べるアプリです。先ほどのコードに肉付けをしてみましょう。

library(shiny)
library(shinydashboard)
ui <- fluidPage(
  dashboardPage(
    dashboardHeader(title = 'My app'),
    dashboardSidebar(),
    dashboardBody(
      fluidRow(
        box(
          title = "norm",
          plotOutput("plot_norm")
        ),
        box(title = "param",
            sliderInput(inputId = 'mean',label='Mean',min=-10,max=10,value=0),
            sliderInput('sd','SD',min=1,max=10,value=1))
        )
    ) 
  )
)
server <- function(input, output) {
  output$plot_norm <- renderPlot(
    curve(dnorm(x,mean=input$mean, sd=input$sd),
          -20,20,
          ylab = "",xlab = "")
  )
}

shinyApp(ui = ui, server = server)

bodyの部分とseverの部分にコードを書き加えました。それぞれの対応関係は以下のようなイメージです。

shiny:420

shinydashbordではboxを使うことで、表示をさせる部品を作ることができます。今回は2つのboxを作り、一つは図形表示、もう一つは正規分布パラメーターの表示をさせています。さらに、boxの中では、図をプロットするplotOutputと、スライダーを表示するsliderInputを使っています。fluidRowはboxをきれいに並べてくれるものです。これで、複数のboxを並べたときの横幅などを調整できます。

ここで重要なのは表示させたいものによって、"fogefogeOutput"と"renderhogehoge"を対応させることです。uiserverの対応は、inputidと"fogefogeOutput"、"renderhogehoge"で紐付けます。

ui server
plotOutput() renderPlot()
tableOutput() renderTable()
dataTableOutput() renderDataTable()
textOutput() renderText()

試しにインタラクティブなデータ表示ができるdataTableは使ってみましょう。fluidRowを追加し、dataTableOutput("my_table")を加えました。columnでは、横幅の調整をしています。

library(shiny)
library(shinydashboard)
ui <- fluidPage(
  dashboardPage(
    dashboardHeader(title = 'My app'),
    dashboardSidebar(),
    dashboardBody(
      fluidRow(
        box(
          title = "norm",
          plotOutput("plot_norm")
        ),
        box(title = "param",
            sliderInput(inputId = 'mean',label='Mean',min=-10,max=10,value=0),
            sliderInput('sd','SD',min=1,max=10,value=1))
        ),
      fluidRow(
        column(width = 12,
        box(
          title = "My Table",
          dataTableOutput("my_table"),
          width = NULL
        )
        )
      )
    ) 
  )
)
server <- function(input, output) {
  output$plot_norm <- renderPlot(
    curve(dnorm(x,mean=input$mean, sd=input$sd),
          -20,20,
          ylab = "",xlab = "")
  )
  output$my_table <- renderDataTable(
    iris,options = list(lengthMenu = c(5, 30, 50), pageLength = 5)
  )
}
shinyApp(ui = ui, server = server)

このようにアプリの中にテーブルを加えることもできます。

shiny

確率密度関数で遊んでみよう

さて、基本的な機能をご紹介したところで、最後に確率密度関数のパラーメータをいじって遊ぶアプリを作ってみました。下記のアプリでは、tab機能を使っています。コードはこちら GitHub - kojiro0208/Shinyのapp_distにあります。

まとめ

データを分析して結果を伝える際に、ダッシュボードのようにインタラクティブに結果を確認できると嬉しいですよね。基本さえおさえてしまえば、あとはブロックの組み立てのように作れます。今回ご紹介した機能他にも様々なことができるので、是非とも機会があれば使ってみてください(^^)

※本記事は筆者が個人的に学んだこと感じたことをまとめた記事になります。所属する組織の意見・見解とは無関係です。

参考

RとShinyで作るWebアプリケーション

RとShinyで作るWebアプリケーション

Shiny

Shiny Dashboard