Showing multiple modalDialog outputs with tables in shiny app depending on data

Hi, is there a way to have multiple modalDialog show up? At the moment, only one will.

The real-life use case is for users uploading data via a template with the popups showing if there are data issues. This is a simplified example though without any data uploads. The popups will show if 'C' is selected, with a table also showing (which would represent the data issue). If 'C' is selected in both though, only the second table shows.

I had a look at this, and I don't know how it might work with tables. only last modal shows when multiple modals are triggered by the same event · Issue #3835 · rstudio/shiny

Any ideas?

library(shiny)
library(DT)

shinyApp(
  ui = basicPage(
    selectInput("a",
                label = "a",
                choices = c("A", "B", "C"),
                selected = "A"),
    selectInput("b",
                label = "b",
                choices = c("A", "B", "C"),
                selected = "B"),
    actionButton("click",
                 label = "click")
  ), # end ui
  
  server = function(input, output, session) {
    
    # observe the click - show modal depending on what is selected -----------------
    observeEvent(input$click,{
      
      if(input$a == "C"){
        showModal(
          modalDialog(
            p("test1"),
            dataTableOutput("aa")
            
          )
        )
      }
      
      if(input$b == "C"){
        showModal(
          modalDialog(
            p("test2"),
            dataTableOutput("bb")
          )
        )
      }
    }, ignoreInit = TRUE)
    
    # tables ------------------------------------------------------------------------
    output$aa <- renderDataTable(datatable(iris))
    output$bb <- renderDataTable(datatable(mtcars))

  } # end server
)

And an attempt that doesn't work:

library(shiny)
library(DT)

shinyApp(
  ui = basicPage(
    selectInput("a",
                label = "a",
                choices = c("A", "B", "C"),
                selected = "A"),
    selectInput("b",
                label = "b",
                choices = c("A", "B", "C"),
                selected = "B"),
    actionButton("click",
                 label = "click")
  ), # end ui
  
  server = function(input, output, session) {
    
    # store values
    rv <- reactiveValues()
    rv$warning_list <- list()
    
    # observe the click - show modal depending on what is selected -----------------
    observeEvent(input$click,{
      
      if(input$a == "C"){
        
        rv$warning_list <- list(rv$warning_list, list("test1", iris))
      }
      
      if(input$b == "C"){
        
        rv$warning_list <- list(rv$warning_list, list("test2", mtcars))
      }
      
      if(length(rv$warning_list) > 0){
        showModal(
          modalDialog(
            p(rv$warning_list[[1]][[1]]),
            dataTableOutput(
              renderDataTable(
                datatable(rv$warning_list[[1]][[2]])
                )
              )
            )
          )
      }
      
      
    }, ignoreInit = TRUE)


  } # end server
)

Something like this might work:

library(shiny)
library(tidyverse)
library(tableHTML)


# app -------------------------------------------------------------
if (interactive()) {
  # Display an important message that can be dismissed only by clicking the
  # dismiss button.
  shinyApp(
    ui = basicPage(
      actionButton("show", "Show modal dialog")
    ),
    server = function(input, output) {
      
      rv <- reactiveValues()
      rv$message_holder <- c() # intial vector - empty at start
      
      
      observeEvent(input$show, {
        rv$message_holder <- c(rv$message_holder, "a!")
        rv$message_holder <- c(rv$message_holder, tableHTML(slice(iris, 1:5)))
        rv$message_holder <- c(rv$message_holder, "b")
        msg <- paste(rv$message_holder, collapse = "<br><br>")
        
        if(length(rv$message_holder) > 0){
          showModal(modalDialog(
            title = "Important message",
            HTML(msg)
          ))
        }
      })
    }
  )
}