Rで解析:Shinyの導入と覚書

Rの解析に役に立つ記事

Shinyの導入と覚書です。ShinyはブラウザとRを組み合わせインタラクティブなアプリケーションの開発を可能にするライブラリです。

今回はShinyの導入と覚書としてファイル構成、簡単な例を紹介します。

スポンサーリンク
スポンサーリンク

環境構築とShinyライブラリの導入

  • 環境構築:RとRStudioのインストール

Shinyの利用はRだけでも可能ですが、効率を考えるとRStudioを利用することが望ましいです。自身の環境に合わせてRをインストール後にRStudioをインストールして下さい。

Rのダウンロード:https://cran.r-project.org/

RStudioのダウンロード:https://www.rstudio.com/products/rstudio/download/#download

以降の実行コマンドはRStudioのRStudio Desktop 2021.09.2+382、windows 11のR version 4.1.2で確認しています。

  • Shinyライブラリの導入

RStudioから下記コマンドを実行してください。shinyに依存するライブラリも同時に導入されます。

#dependenciesをTRUEに設定しshinyと同時に依存ライブラリを導入
install.packages("shiny", dependencies = TRUE)

#導入されるライブラリ
package ‘globals’ successfully unpacked and MD5 sums checked
package ‘listenv’ successfully unpacked and MD5 sums checked
package ‘parallelly’ successfully unpacked and MD5 sums checked
package ‘xts’ successfully unpacked and MD5 sums checked
package ‘systemfonts’ successfully unpacked and MD5 sums checked
package ‘textshaping’ successfully unpacked and MD5 sums checked
package ‘sysfonts’ successfully unpacked and MD5 sums checked
package ‘showtextdb’ successfully unpacked and MD5 sums checked
package ‘reactlog’ successfully unpacked and MD5 sums checked
package ‘future’ successfully unpacked and MD5 sums checked
package ‘dygraphs’ successfully unpacked and MD5 sums checked
package ‘ragg’ successfully unpacked and MD5 sums checked
package ‘showtext’ successfully unpacked and MD5 sums checked
package ‘shiny’ successfully unpacked and MD5 sums checked

これで、環境構築とShinyライブラリの導入が完了です。

RStudioからShinyライブラリを使う

RStudioを起動し、New Fileアイコンをクリック後にShiny Web Appを選択する。

RStudioの中央にNew Shiny Web Applicationダイアログが表示されるのでApplication nameにTest、Application typeにMultiple File、Create within directoryにデスクトップを入力、選択しCreateをクリックする。

Shinyの設定

そうすると、RStudio内にui.Rとsever.Rファイルが作成されます。このままRun AppをクリックするとRStudioの右下のViewerにサンプルアプリケーションが表示されます。

Run Appをクリック
RStudioの右下のViewerに表示される。

ここまでで、RStudioからShinyライブラリを使う基本操作を紹介しました。

Shinyのデータ受け渡し

ui.Rとsever.Rの2ファイルおよびapp.Rの単独ファイルでも基本は同じです。入力・表示のUIはui.Rファイルもしくはapp.Rへ「fluidPage」コマンドと組み合わせ記述します。

入力UIは「radioButtons」「actionButton」コマンド以外は「機能名Input」コマンドと直感でUIを示すコマンド名となっています。ですので、例えばファイルを選択するUIであれば「fileInput」コマンドとなります。

表示UIは「textOutput」「verbatimTextOutput」「tableOutput」「dataTableOutput」「plotOutput」コマンドがあります。

そして、表示UIへのデータ受け渡しはsever.Rファイルの場合は「shinyServer」コマンドと組み合わせ、もしくはapp.Rへ「function」コマンドと組み合わせ記述します。

データ受け渡しコマンドには「renderText」「renderPrint」「renderTable」「renderDataTable」「renderPlot」コマンドがあります。

Shinyのファイル構成

ここまでの作業でデスクトップにTestフォルダが作成され、中にはui.Rとsever.Rファイルが保存されています。なお、Shinyはapp.Rファイルでも動作しますが、ui.Rとsever.Rに分けることでコード内容が理解しやすいです。ui.Rとsever.Rの性質は次の通りです。各参考コマンドを紹介します。

  • ui.Rの性質

ブラウザで表示するwidgetの内容を記述します。例えばチェックボックスやテキストフォーム、グラフ表示などです。ui.Rは自身からsever.Rへ情報を伝えるwidgetコマンドとsever.Rとの連動で動的に表示を変化するOutput, renderコマンドがあります。参考にいくつか紹介します。例はui.Rの記述です。inputIdに指定した名前をsever.Rで指定することでデータを受け取ることができます。widgetコマンドは「,(カンマ)」で区切ります。なお、コマンド例のinputIdは理解しやすくコマンド名にしています。適時、可読性良く変更ください。

Shinyは初期設定でページ幅を12グリッドで分割されています。sidebarPanelコマンドとmaimPanelコマンドでグリット幅を指定します。以下はui.Rへのコマンド記述例です。sever.Rへのコマンドが記述されていないので各出力には選択内容は表示されません。

library("shiny")

shinyUI(fluidPage(
  #sidebarPanelコマンドで入力widgetの表示領域を設定
  sidebarPanel(
  #日付を選択:weekstart:日曜が0、土曜が6
  dateInput(inputId = "dateInput", label = "dateInput",
            startview = "month", weekstart = 0),
  #ファイルを選択:multiple:複数ファイルを選択:TRUE
  fileInput(inputId = "fileInput", label = "fileInput",
            multiple = TRUE),
  #複数選択のチェックボックス
  checkboxGroupInput(inputId = "checkboxGroupInput",
                     label = "checkboxGroupInput",
                     inline = TRUE,
                     choiceNames = c("karada", "いいもの"),
                     choiceValues = c(3, 1)),
  #単一選択のチェックボックス:初期チェックの設定:value:TRUE/FALSE
  checkboxInput(inputId = "checkboxInput",
                label = "からだにいいもの",
                value = FALSE),
  #ラジオボタン:複数項目から選択
  radioButtons(inputId = "radioButtons",
               label = "radioButtons",
               inline = TRUE,
               choiceNames = c("karada", "いいもの"),
               choiceValues = c(3, 1)),
  #スライダーで値を取得
  sliderInput(inputId = "sliderInput",
              label = "sliderInput",
              min = 0, max = 200, value = 100),
  #リストから選択
  selectInput(inputId = "selectInput",
              label = "selectInput",
              choice = list("karada" = 1,
                            "いいもの" = 100),
              multiple = TRUE),
  #テキスト入力
  textInput(inputId = "textInput",
            label = "textInput", value = "初期値"),
  #表示グリッド幅を指定
  width = 3),
  
  #mainPanelコマンドで出力の表示領域を設定
  mainPanel(
    #dateInputを出力
    titlePanel("dateInputを出力"),
    textOutput(outputId = "dateOutput"),
    #fileInputを出力
    titlePanel("fileInputを出力"),
    textOutput(outputId = "fileOutput"),
    #checkboxGroupInputを出力
    titlePanel("checkboxGroupInputを出力"),
    textOutput(outputId = "checkboxGroupOutput"),
    #checkboxInputを出力
    titlePanel("checkboxInputを出力"),
    textOutput(outputId = "checkboxOutput"),
    #radioButtonsを出力
    titlePanel("radioButtonsを出力"),
    textOutput(outputId = "radioButtonsOutput"),
    #sliderInputを出力
    titlePanel("sliderInputを出力"),
    textOutput(outputId = "sliderOutput"),
    #selectInputを出力
    titlePanel("selectInputを出力"),
    textOutput(outputId = "selectOutput"), 
    #textInputを出力
    titlePanel("textOutputを出力"),
    textOutput(outputId = "textOutput"), 
    #表示グリッド幅を指定
    width = 9
  )
  ))

上記コマンドを実行すると下記のようなUIが表示されます。

  • sever.Rの性質

ui.Rで表示する情報を処理するコードを記述します。例えばui.Rから取得したデータの処理や読み込みデータの処理、データからグラフ作成するなどです。前述のui.Rから取得したデータを表示するコマンド例を紹介します。ui.Rのwidgetから取得したデータは「output$outputId」に対しrenderText()、renderPrint()、renderTable()などのコマンド内で「input$inputId」と記述することで値を取得し処理します。なお、「render####」コマンドは値の変化ごとにリアルタイムで処理が行われます。今回は使用しませんが無駄な処理を行わないreactive()コマンドがありますのでhelpで内容を確認することをお勧めします。

shinyServer(function(input, output) {
    #dateInput:日付はas.characterコマンドを使用すると出力が可能です
    output$dateOutput <- renderText({as.character(input$dateInput)})
    #fileOutput:$datapath:ファイルパスを取得,$name:ファイル名を取得
    #ファイルパスはtempファイルに移動後のパス
    output$fileOutput <- renderText({input$fileInput$datapath})
    #checkboxGroupInput
    output$checkboxGroupOutput <- renderText({input$checkboxGroupInput})
    #checkboxOutput
    output$checkboxOutput <- renderText({input$checkboxInput})
    #radioButtonsOutput
    output$radioButtonsOutput <- renderText({input$radioButtons})
    #sliderOutput
    output$sliderOutput <- renderText({input$sliderInput})
    #sliderOutput
    output$selectOutput <- renderText({input$selectInput})
    #textOutput
    output$textOutput <- renderText({input$textInput})
})

上記コマンドをsever.Rに記述すると下記画像のようにデータを取得することができます。


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました