2016-08-28 12 views
0

によって新しいものと古いのタブを置き換えるためには、既存の例、どのようにここでselectInpout

library(shiny) 
runExample("06_tabsets") 

であり、あなたは、あなたがラジオボタンで配信タイプを選択することができます表示され、3つのタブが「プロット」、「要約があります"、"テーブル "を含む。

私の質問は、sliderInput(観測数)の下にselectInputを2つの値で追加する方法です。デフォルトのものは "NULL"で、2番目のものは "1"です。ユーザーが「1」を選択すると、前の3つのタブが消えます。代わりに、新しいタブにはコンテンツの内容が表示されます。

+1

。そうすれば、入力に応じて異なるUIをレンダリングする 'selectInput'に依存させることができます。 –

答えて

1

これは変更された "06_tabsets"です。選択入力が追加され、選択に応じてUIが生成されます。唯一の違いは、NULLを使用していないことですが、2つのオプションがあります。私はそれがNULLで実行することができます。これが役に立ったら教えてください。

ui.R

library(shiny) 

    # Define UI for random distribution application 
    shinyUI(fluidPage(

      # Application title 
      titlePanel("Tabsets"), 

      # Sidebar with controls to select the random distribution type 
      # and number of observations to generate. Note the use of the 
      # br() element to introduce extra vertical spacing 
      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), 
          selectInput("contentSelect", "Select content to dislay:", choices = c("1", "2"), selected = 1) 
        ), 

        # Show a tabset that includes a plot, summary, and table view 
        # of the generated distribution 
        mainPanel(
          uiOutput("content") 
        ) 
      ) 
    )) 

server.R

動的にサーバ側で `renderUI`を使用してタブを作成することです何をする必要
library(shiny) 

    # Define server logic for random distribution application 
    shinyServer(function(input, output) { 

      # Reactive expression to generate the requested distribution. 
      # This is called whenever the inputs change. The output 
      # functions defined below then all use the value computed from 
      # this expression 
      data <- reactive({ 
        dist <- switch(input$dist, 
            norm = rnorm, 
            unif = runif, 
            lnorm = rlnorm, 
            exp = rexp, 
            rnorm) 

        dist(input$n) 
      }) 

      # Generate a plot of the data. Also uses the inputs to build 
      # the plot label. Note that the dependencies on both the inputs 
      # and the data reactive expression are both tracked, and 
      # all expressions are called in the sequence implied by the 
      # dependency graph 

      output$plot <- renderPlot({ 
        dist <- input$dist 
        n <- input$n 

        hist(data(), 
         main=paste('r', dist, '(', n, ')', sep='')) 
      }) 

      # Generate a summary of the data 
      output$summary <- renderPrint({ 
        summary(data()) 
      }) 

      # Generate an HTML table view of the data 
      output$table <- renderTable({ 
        data.frame(x=data()) 
      }) 
      output$textA <- renderText({ 
        paste(input$contentSelect, " A") 
      }) 

      observeEvent(input$contentSelect, { 
        if (input$contentSelect == "1") { 
          output$content <- renderUI({ 
            tabsetPanel(type = "tabs", 
               tabPanel("Plot", plotOutput("plot")), 
               tabPanel("Summary", verbatimTextOutput("summary")), 
               tabPanel("Table", tableOutput("table")) 
            ) 
          })  
        } else { 
          output$content <- renderUI({ 
            tabsetPanel(type = "tabs", 
               tabPanel("A", textOutput("textA")) 
            ) 
          })  
        } 
      }) 


    }) 
+0

良い答え。私はそれを理解した。ところで、私は最も重要なコードはobserveEvent()関数だと思います、私には、あなたがobserveEventを使用する必要がある状況があるという直感を私に与えることができますか? –

+0

は一般に、関数とみなされ、値を返すリアクティブ(またはreactiveEvent)とは異なり、副作用を作成します。だから、副作用(コンソールに印刷し、ファイルをダウンロードし、uiをレンダリングする)を作成するには、observeを使用します。 observeEventは、通常、副作用を作成したいが、observeイベントの本体に他の反応がある場合、特定のイベントによってトリガーされるときに使用されます。私は典型的な例がactionButtonだろうと思います。 RStudioの@JoeChengによるビデオをチェックしてください:[Reactive programming](https://www.rstudio.com/resources/webinars/shiny-developer-conference/) –

+0

observeEventを使用する必要がありますか?私はobserveEvent関数を削除すると思います。場合によってのみ(入力$ contentSelect == "1"){ 出力$コンテンツ< - renderUI({......それも動作するはずです –