aotearoa
aotearoa

Reputation: 315

refresh the main panel screen in shiny using the action button

I am building a shiny app and I want to refresh the main panel screen. Here is a sample code. I have a submit button to display the data and I have a re-fresh button to clear the screen. I am not so sure how to code the re-fresh button in R and shiny since I am new to this. Thanks for looking into

library(DT)
ui <- fluidPage(
    sidebarLayout(
      sidebarPanel(
        selectInput("amountTable", "Amount Tables", 1:10),
        actionButton("submit1" ,"Submit", icon("refresh"),
                   class = "btn btn-primary"),

        actionButton("refresh1" ,"Refresh", icon("refresh"),
                   class = "btn btn-primary")

   ),
   mainPanel(
   # UI output
     uiOutput("dt")
   )
  )
)

server <-  function(input, output, session) {
   observeEvent(input$submit1, {
     lapply(1:input$amountTable, function(amtTable) {
       output[[paste0('T', amtTable)]] <- DT::renderDataTable({
       iris[1:amtTable, ]
       })
     })
   })

  output$dt <- renderUI({
    tagList(lapply(1:10, function(i) {
    dataTableOutput(paste0('T', i))
   }))
 })

}

shinyApp(ui, server)

Upvotes: 2

Views: 3103

Answers (1)

Tonio Liebrand
Tonio Liebrand

Reputation: 17699

You could add the possibility of return nothing from the renderUI() if the refresh button is used. As it is not that straightforward to reset an action button you would have to use a workaround with a reactive variable.

if(global$refresh) return()

This reactive variable you can control with the refresh and submit button E.g. if(input$refresh1) isolate(global$refresh <- TRUE) which you wrap in seperate observe functions. Full code see below:

library(DT)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("amountTable", "Amount Tables", 1:10),
      actionButton("submit1" ,"Submit", icon("refresh"),
                   class = "btn btn-primary"),

      actionButton("refresh1" ,"Refresh", icon("refresh"),
                   class = "btn btn-primary")

    ),
    mainPanel(
      # UI output
      uiOutput("dt")
    )
  )
)

server <-  function(input, output, session) {

  global <- reactiveValues(refresh = FALSE)

  observe({
    if(input$refresh1) isolate(global$refresh <- TRUE)
  })

  observe({
    if(input$submit1) isolate(global$refresh <- FALSE)
  })

  observeEvent(input$submit1, {
    lapply(1:input$amountTable, function(amtTable) {
      output[[paste0('T', amtTable)]] <- DT::renderDataTable({
        iris[1:amtTable, ]
      })
    })
  })

  output$dt <- renderUI({
    if(global$refresh) return()
    tagList(lapply(1:10, function(i) {
      dataTableOutput(paste0('T', i))
    }))
  })

}

shinyApp(ui, server)

Upvotes: 5

Related Questions