読者です 読者をやめる 読者になる 読者になる

ふんわり R-tips

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

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

Shiny

06_tabsetsは、サーバー側で分布を生成し、UI側で分布を3つの形式でタブ上に配置して表示する例です。

「06_tabsets」の実行

library(shiny)
runExample("06_tabsets")

f:id:phmpk:20161230155218p:plain

server.R

library(shiny)

# ランダムな分布を生成するサーバー側を定義
function(input, output) {
  
  # 分布を生成する
  # 入力が変化したときにreactiveに呼ばれる
  # 下部の出力関数は、ここで生成したreactiveな分布を使用する
  data <- reactive({
    dist <- switch(input$dist,
                   norm = rnorm,
                   unif = runif,
                   lnorm = rlnorm,
                   exp = rexp,
                   rnorm)
    
    dist(input$n)
  })
  
  # dataのプロットとラベルを生成
  # 入力は両方と依存関係があり、どちらかが変化したときはそれに追随して変化する
  output$plot <- renderPlot({
    dist <- input$dist
    n <- input$n
    
    hist(data(), 
         main=paste('r', dist, '(', n, ')', sep=''))
  })
  
  # データのsummaryを生成
  output$summary <- renderPrint({
    summary(data())
  })
  
  # HTMLで表記したデータの表を生成
  output$table <- renderTable({
    data.frame(x=data())
  })
  
}

Code license:MIT

  • switch()distに、分布を生成するための関数名を与える。rnorm()は正規分布を、runif()は連続一様分布、rlnorm()は対数正規分布、rexp()は指数分布である

  • 例として、input$distnorminput$nが50のとき、17行目のdist(input$n)ではrnorm(50)が実行され、以下の分布を返す

> rnorm(50)
 [1] -0.62914536 -0.73371948  0.30965080 -0.27329928 -1.18324678  1.06704008 -0.93215703
 [8] -0.73117791 -1.65166615 -0.36209932 -0.76875906  0.54347454  1.17110890  0.03704137
[15] -1.86078985  1.37193112  0.76647807  1.91547888 -1.04685644 -1.19995233 -0.13173718
[22]  1.32920123  1.19872686  0.01525256  0.33566227 -1.95291135  0.58520576  0.04062392
[29] -0.73173476  2.41503834  0.17942321  0.30430169 -1.43702559 -0.26643687 -0.09946178
[36] -1.61477804  0.65289756 -0.18279837  1.32254177  0.31122224  0.24928538 -0.91399839
[43]  0.75083835 -0.76780444  0.13232907  1.28965217  0.26054202  0.64163957  2.09648604
[50]  1.10425454
  • hist()で生成したデータのヒストグラムを生成

  • summary()でデータのsummaryを文字列として生成

  • data.frame()でデータの表を生成

ui.R

library(shiny)

# ランダムな分布を表示するUIを定義
fluidPage(
    
  # タイトル
  titlePanel("Tabsets"),
  
  # サイドバーに、ランダムな分布の種類と、データ数を選択するコントロールを配置
  # br()は、余分な垂直のスペースを作るために挿入
  sidebarLayout(
    sidebarPanel(
      radioButtons("dist", "Distribution type:",
                   c("Normal" = "norm",
                     "Uniform" = "unif",
                     "Log-normal" = "lnorm",
                     "Exponential" = "exp")),
      br(),
      
      sliderInput("n", 
                  "Number of observations:", 
                   value = 500,
                   min = 1, 
                   max = 1000)
    ),
    
    # 生成された分布のプロット、summary、HTMLの表を含むタブを表示
    mainPanel(
      tabsetPanel(type = "tabs", 
        tabPanel("Plot", plotOutput("plot")), 
        tabPanel("Summary", verbatimTextOutput("summary")), 
        tabPanel("Table", tableOutput("table"))
      )
    )
  )
)

Code license:MIT

  • サイドバーに、radioButtons()でラジオボタンを、sliderInput()でスライダーを配置

  • tabsetPanelで3つのタブtabPanel()を配置。それぞれ、plotOutput(), verbatimTextOutput(), tableOutput()でプロット、テキスト、HTML表を出力f:id:phmpk:20161230155218p:plain