2016-08-28 1 views
0

Вот это существующий примерВ Rshiny, Как заменить старые вкладки с новым путем selectInpout

library(shiny) 
runExample("06_tabsets") 

И вы увидите, вы можете выбрать тип распределения в радиокнопках и есть три вкладки «земля», «Резюме »и« Таблица ».

Мой вопрос в том, как я могу добавить selectInput под sliderInput (количество наблюдений) с двумя значениями. По умолчанию используется значение «NULL», второе - «1». После того, как пользователи выбрали «1», предыдущие три вкладки исчезли. Вместо этого новая вкладка будет отображать все содержимое.

+1

Что вам нужно сделать, это создать вкладки динамически с помощью 'renderUI' на стороне сервера. Таким образом, вы можете заставить его зависящим от 'selectInput' отображать различные пользовательские интерфейсы в соответствии с вводом. –

ответ

1

Это модифицированные «06_tabsets». Добавляется вход выбора, и пользовательский интерфейс создается в зависимости от выбора. Единственное различие заключается в том, что не используется NULL, а два варианта. Я мог бы запустить его с помощью 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

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

Хороший ответ. Я понял это. Кстати, я думаю, что самым важным кодом является функция observEvent(), можете ли вы дать мне некоторую интуицию, что в какой ситуации нам нужно использовать функцию observEvent? –

+0

наблюдать в целом создает побочные эффекты, в отличие от реактивного (или реактивного), который можно рассматривать как функцию и возвращает значение. Таким образом, чтобы создать побочный эффект (печать на консоль, загрузка файла, визуализация ui ...), вы будете использовать наблюдение. Функция observEvent обычно используется, когда вы хотите создать побочный эффект, но запускаемый одним конкретным событием, если если в теле наблюдения есть другие реакции. Я предполагаю, что типичным примером будет actionButton. Проверьте видео от @JoeCheng от RStudio: [Реактивное программирование] (https://www.rstudio.com/resources/webinars/shiny-developer-conference/) –

+0

Нужно ли использовать функцию registerEvent? Я думаю, если я удалю функцию registerEvent. Только если (input $ contentSelect == "1") { output $ content <- renderUI ({...... Это тоже должно работать –

Смежные вопросы