r 闪亮 - uiOutput 不在 menuItem 内呈现

Sym*_*xAU 3 r shiny shinydashboard

为什么在sliderInput()上生成server并在uiwith上呈现的uiOutput()a 没有显示在 a 中menuItem()

例子

在这个简单的应用程序,我产生sliderInputserver(注意menuItem是故意注释掉),它按预期工作

library(shiny)
library(shinydashboard)

rm(ui, server)

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("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){

    withProgress(message = "loading page", value=0.1, {
        ## simulate loading some data
        Sys.sleep(3)

        ## slider input
        output$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)
Run Code Online (Sandbox Code Playgroud)

但是,当我移动uiOutput内部 a 时menuItem( ),输出不再呈现:

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("sli_val1"),
                     checkboxGroupInput(inputId = "cbg_group2", label = "group 2", 
                                        choices = c("another","set","of","check","boxes") )
                             ),
            menuItem(text = "another tab")
            )
    ),
    dashboardBody()
)
Run Code Online (Sandbox Code Playgroud)

K. *_*hde 7

起初,我会改变uiOutput("sli_val1")uiOutput("out_sli_val1"),以防止重复的ID。

关于您的问题:当 Shiny 遍历文档并渲染/绑定所有可能的输出时,这是一件奇怪的事情。默认操作是忽略所有隐藏的输出元素 - 这意味着不完全忽略(输出“sli_val1”绑定正常),但它们的功能被暂停,不让任何子元素被渲染。

所以问题是,在启动时,这个输出隐藏在子项树中,并从那里被忽略。

可以通过调用取消设置此暂停行为来完成修复

outputOptions(output, "out_sli_val1", suspendWhenHidden = FALSE)
Run Code Online (Sandbox Code Playgroud)

但是如何以及在哪里?必须在运行“数据加载”之前设置此选项。但它会抛出错误,如果output$out_sli_val1没有分配给它(是NULL)。为了避免这种情况,可以初始化一个空的 UI 块,它会在“数据加载”时被覆盖。

这是您使用 2 行额外代码(和修改后的输出 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)
Run Code Online (Sandbox Code Playgroud)

  • @MikaelJumppanen 我以为我在某处读到了那个隐藏的问题。因此,我开始尝试手动解除/绑定输出(costom 消息处理程序 + 操作按钮)并查看 HTML,如果输出 div 会做出反应。令人惊讶的是,一旦子菜单可见,它就会这样做。我尝试将 unbind/bind 链接到这种可见性(本来会很潮),但发现这种更简单的方法。空的 renderUI init 是一种预感。 (3认同)