r shiny - uiOutput not rendering inside menuItem

前端 未结 1 1849
盖世英雄少女心
盖世英雄少女心 2021-01-03 12:32

Question

Why does a sliderInput() that\'s generated on the server, and rendered on the ui with uiOutput

相关标签:
1条回答
  • 2021-01-03 13:13

    At first, I'd change uiOutput("sli_val1") into uiOutput("out_sli_val1"), to prevent duplicated Ids.

    Concerning your problem: This is an odd thing going on when Shiny runs through the document and renders/binds all possible outputs. The default action is to ignore all hidden output elements - that means not ignore completely (output "sli_val1" is bound alright), but their function is suspended, letting no children to be rendered.

    So the problem is, that on initiation, this output is hidden in the subitem tree and from there on ignored.

    The fix can be done by unsetting this supension behaviour by calling

    outputOptions(output, "out_sli_val1", suspendWhenHidden = FALSE)
    

    But how and where? This option has to be set before you run your "data loading". But it will throw errors, if output$out_sli_val1 has nothing assigned to it (is NULL). To avoid that, one can initialize an empty UI-chunk, which gets overridden on "data load".

    Here is your minimal fix with 2 extra lines of code (and modified output Id):

    library(shiny)
    library(shinydashboard)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(
        sidebarMenu(
          menuItem(text = "data options", 
            checkboxGroupInput(inputId = "cbg_group1", label = "group 1", 
                               choices = c("some","check","boxes","to","choose","from") ),
            uiOutput("out_sli_val1"),
            checkboxGroupInput(inputId = "cbg_group2", label = "group 2", 
                               choices = c("another","set","of","check","boxes") )
          ),
          menuItem(text = "another tab")
        )
      ),
      dashboardBody()
    )
    
    server <- function(input, output, session){
      output$out_sli_val1 <- renderUI({})
      outputOptions(output, "out_sli_val1", suspendWhenHidden = FALSE)
    
      withProgress(message = "loading page", value=0.1, {
        ## simulate loading some data
        Sys.sleep(3)
    
        ## slider input
        output$out_sli_val1 <- renderUI({
          sliderInput(inputId = "sli_val1", label = "values", min = 0, max = 100, value = c(25, 75) )
        })
    
        setProgress(value=1, detail="Complete")
      })
    }
    
    shinyApp(ui = ui, server = server)
    
    0 讨论(0)
提交回复
热议问题