ふんわり R-tips

ぜんぜんわからない、俺たちは雰囲気でRをやっている

Shinyサンプルアプリケーション「03_reactivity」の説明

03_reactivityは、inputとoutputがどのようにreactiveに変化するのかを説明する例。02_textと同様の変数や関数で、input$dataset, input$caption, output$caption, output$viewそれぞれの計算に依存関係がある場合に、どの変数を変えると、どの出力がreactiveに変化するのか理解できる例になっています。

「03_reactivity」の実行

library(shiny)
runExample("03_reactivity")

f:id:phmpk:20161230153325p:plain

server.R

library(shiny)
library(datasets)

# 選択されたデータセットのsummaryと全体を表示するためのサーバ側を定義
function(input, output) {

  # datasetInputをreactiveな式として宣言
  #  1) reactiveなので、入力が変化したときだけ呼ばれる
  #  2) 計算結果は、すべての関数呼び出しで共有される
  datasetInput <- reactive({
    switch(input$dataset,
           "rock" = rock,
           "pressure" = pressure,
           "cars" = cars)
  })
  
  # output$captionは、input$captionが返す値の変化に合わせてreactiveに値を変える
  # 
  # ただし、以下のoutput$summaryは、input$captionに依存しないので、input$captionを変えても
  # reactiveに変化しない
  output$caption <- renderText({
    input$caption
  })
  
  # reactiveなdatasetInputに合わせて、output$summaryの結果が変化
  # datasetInputの結果が変わるのは、input$datasetが変わったときなので、
  # 入力が変わったときに、output$summaryはreactiveに値を変化させる
  output$summary <- renderPrint({
    dataset <- datasetInput()
    summary(dataset)
  })
  
  # output$viewはdatasetInput()とinput$obs両方に依存して値が変わるので、
  # 入力のinput$datasetとinput$obsのどちらか一方でも変化した場合に、reactiveに値を変える
  output$view <- renderTable({
    head(datasetInput(), n = input$obs)
  })
}

Code license:MIT

  • datasetInputは、switch()の引数で指定したinput$datasetの値が変わると動的に値が変化

  • output$captionは、input$captionの値が変わると動的に値が変化

  • output$summaryは、datasetInput()の値が変化したとき、すなわちinput$datasetが変化したときに値が変化。input$obsを変えても変化しない

  • output$viewは、datasetInput()とinput$obsの2つのどちらか一方でも変化したときに値が変化

ui.R

library(shiny)

# データセットビューワのUIを定義
fluidPage(
  
  # タイトル
  titlePanel("Reactivity"),
  
  # サイドバーには、caption, データセット選択, 表示するデータ数入力の3つのコントロール
  # captionを変えたときには、出力が直ちに変化する
  sidebarLayout(
    sidebarPanel(
      textInput("caption", "Caption:", "Data Summary"),
      
      selectInput("dataset", "Choose a dataset:", 
                  choices = c("rock", "pressure", "cars")),
      
      numericInput("obs", "Number of observations to view:", 10)
    ),
    
    
    # captionとデータセットのsummary、入力された数のデータセットのHTML表示
    mainPanel(
      h3(textOutput("caption", container = span)),
      
      verbatimTextOutput("summary"), 
      
      tableOutput("view")
    )
  )
)

Code license:MIT

  • sideberPanel()で、3つのコントロールtextInput, selectInput, numericInputをサイドバーに配置

  • mainPalen()で、3つのコントロールh3, verbatimTextOutput, tableOutputを配置

  • h3は、h3の大きさの文字列を配置

  • verbatimTextOutput()で、summaryで指定された文字列をそのまま出力

  • tableOutput()で、viewで指定された表をHTML出力