How to use updateTabItems with eventReactive

I found my mistakes:

  • I use updateTabItems instead of updateTabsetPanel
  • I have to use this in an observeEvent not in eventReactive

Here is the correct version:

library(shiny)

# Define UI for random distribution app ----
ui <- fluidPage(
  
  # App title ----
  titlePanel("Tabsets"),
  
  # Output: Tabset w/ plot, summary, and table ----
  tabsetPanel(id = "inTabset", type = "tabs",
              tabPanel("Conf",value="tab1", 
                       # Input: Select the random distribution type ----
                       radioButtons("dist", "Distribution type:",
                                    c("Normal" = "norm",
                                      "Uniform" = "unif",
                                      "Log-normal" = "lnorm",
                                      "Exponential" = "exp")),
                       
                       # br() element to introduce extra vertical spacing ----
                       br(),
                       
                       # Input: Slider for the number of observations to generate ----
                       sliderInput("n",
                                   "Number of observations:",
                                   value = 500,
                                   min = 1,
                                   max = 1000),
                       actionButton("submit","Submit")
              ),
              tabPanel("Plot", value="tab2", plotOutput("plot")),
              tabPanel("Summary", value="tab3", verbatimTextOutput("summary")),
              tabPanel("Table", value="tab4", tableOutput("table"))
  )
)

# Define server logic for random distribution app ----
server <- function(session, input, output) {
  
  # Reactive expression to generate the requested distribution ----
  # This is called whenever the inputs change. The output functions
  # defined below then use the value computed from this expression
  d <- eventReactive(input$submit,{
    dist <- switch(input$dist,
                   norm = rnorm,
                   unif = runif,
                   lnorm = rlnorm,
                   exp = rexp,
                   rnorm)
    
    dist(input$n)
  })
  
  observeEvent(input$submit,{
    updateTabsetPanel(session, "inTabset", selected = "tab2")
  })
  
  # Generate a plot of the data ----
  # Also uses the inputs to build the plot label. Note that the
  # dependencies on 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(d(),
         main = paste("r", dist, "(", n, ")", sep = ""),
         col = "#75AADB", border = "white")
  })
  
  # Generate a summary of the data ----
  output$summary <- renderPrint({
    summary(d())
  })
  
  # Generate an HTML table view of the data ----
  output$table <- renderTable({
    d()
  })
  
}

shinyApp(ui, server)
1 Like