Rでの実行結果や分析結果をインタラクティブなwebアプリにできたら、、そんな風に思ったことはありませんか?今回は、そんな願いを叶えるべくshiniy
とshinydashbord
を使って簡単にwebアプリを作ってみたいと思います。なお、今回の内容は入門編ですので、より深く学びたい方はこちらを参考にされるよいと思います!
shiniy
とshinydashbord
shiniy
はRで簡単にwebアプリが作れるパッケージです。shinydashbord
は、shiniy
を元にしたアプリをダッシュボード的に作成できるパッケージになります。この二つを使うと以下のようなアプリも簡単に作ることができます。
簡単なGUIの統計ソフトや可視化BIツールなども作れそうですね。それでは早速作ってみましょう!
事前準備と動作確認
まずはRstudioを立ち上げて、shiniy
とshinydashbord
をインストールします。
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でも起動します。新しい画面が立ち上がれば成功です。
アプリの構成
上記のコードは、ui
のなかにはアプリの見た目を決めるためのコードを、server
の中にはアプリのインタラクティブな動作を決めるためのコードを書きます。先ほどの例では、server
には何も書いていませんが、上記が基本的な骨組みなり、肉付けをしていくことになります。ui
のコードと実際の表示は以下のような対応関係になります。
また、ui
とserver
を、ui.R
とserver.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の部分にコードを書き加えました。それぞれの対応関係は以下のようなイメージです。
shinydashbord
ではboxを使うことで、表示をさせる部品を作ることができます。今回は2つのboxを作り、一つは図形表示、もう一つは正規分布パラメーターの表示をさせています。さらに、boxの中では、図をプロットするplotOutput
と、スライダーを表示するsliderInput
を使っています。fluidRow
はboxをきれいに並べてくれるものです。これで、複数のboxを並べたときの横幅などを調整できます。
ここで重要なのは表示させたいものによって、"fogefogeOutput"と"renderhogehoge"を対応させることです。ui
とserver
の対応は、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)
このようにアプリの中にテーブルを加えることもできます。
確率密度関数で遊んでみよう
さて、基本的な機能をご紹介したところで、最後に確率密度関数のパラーメータをいじって遊ぶアプリを作ってみました。下記のアプリでは、tab
機能を使っています。コードはこちら
GitHub - kojiro0208/Shinyのapp_distにあります。
まとめ
データを分析して結果を伝える際に、ダッシュボードのようにインタラクティブに結果を確認できると嬉しいですよね。基本さえおさえてしまえば、あとはブロックの組み立てのように作れます。今回ご紹介した機能他にも様々なことができるので、是非とも機会があれば使ってみてください(^^)
※本記事は筆者が個人的に学んだこと感じたことをまとめた記事になります。所属する組織の意見・見解とは無関係です。