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

Вот существующий пример

library(shiny)
runExample("06_tabsets")

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

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


person Bratt Swan    schedule 28.08.2016    source источник
comment
Что вам нужно сделать, так это динамически создавать вкладки, используя renderUI на стороне сервера. Таким образом, вы можете зависеть от selectInput для отображения другого пользовательского интерфейса в соответствии с вводом.   -  person Xiongbing Jin    schedule 29.08.2016


Ответы (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")
                    )
            )
    ))

сервер.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"))
                                    )
                            })       
                    }
            })


    })
person Valter Beaković    schedule 29.08.2016
comment
Хороший ответ. Я понял это. Кстати, я думаю, что наиболее важным кодом является функцияObservEvent(), не могли бы вы дать мне некоторое представление о том, в какой ситуации нам нужно использоватьObservEvent? - person Bratt Swan; 31.08.2016
comment
наблюдение в целом создает побочные эффекты, в отличие от реактивного (или реактивного события), которое можно рассматривать как функцию и возвращающее значение. Таким образом, для создания побочного эффекта (печать на консоль, загрузка файла, визуализация пользовательского интерфейса...) вы должны использовать наблюдение. visibleEvent обычно используется, когда вы хотите создать побочный эффект, но запускается одним конкретным событием, если в теле события наблюдения у вас есть другие реактивы. Я предполагаю, что типичным примером будет actionButton. Посмотрите видео @JoeCheng из RStudio: Реактивное программирование - person Valter Beaković; 31.08.2016
comment
Обязательно ли использовать наблюдениеEvent? Я думаю, если я удалю функцию наблюдатьEvent. Только если (input$contentSelect == 1) { output$content ‹- renderUI({...... Это также должно работать - person Bratt Swan; 06.09.2016