R 闪亮的仪表板-在服务器生成的侧边栏UI中隐藏菜单项

R 闪亮的仪表板-在服务器生成的侧边栏UI中隐藏菜单项,r,shiny,shinydashboard,R,Shiny,Shinydashboard,我有一个服务器生成的边栏。创建后,我想隐藏它的第一个元素。执行隐藏操作的观察者将被执行,但菜单项不会被隐藏。我试图弄明白,为什么它不起作用。有什么想法吗 另外,CSS选择器似乎是正确的,因为当用户界面没有在服务器上创建时,所有这些都可以工作 library(shiny) library(shinyjs) library(shinydashboard) ui <- dashboardPage( dashboardHeader(), dashboardSidebar(

我有一个服务器生成的边栏。创建后,我想隐藏它的第一个元素。执行隐藏操作的观察者将被执行,但菜单项不会被隐藏。我试图弄明白,为什么它不起作用。有什么想法吗

另外,CSS选择器似乎是正确的,因为当用户界面没有在服务器上创建时,所有这些都可以工作

library(shiny)
library(shinyjs)
library(shinydashboard)


ui <- dashboardPage(
    dashboardHeader(),
    dashboardSidebar(
      uiOutput("sidebar_ui")
    ),
    dashboardBody(
      shinyjs::useShinyjs()
    )
   )


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

  output$sidebar_ui <- renderUI({
    rv$trigger_sidebar_config <- 0
    cat("\nSidebar create")
    sidebarMenu(id = "sidebar",
                menuItem("Menu1", tabName = "tab_menu_1"),  # to be hidden
                menuItem("Menu2", tabName = "tab_menu_2") )
  })


  observeEvent(rv$trigger_sidebar_config, {
    cat("\nSidebar config")
    shinyjs::hide(selector = '[data-value="tab_menu_1"]')  # hide menuitem
  })
}

shinyApp(ui, server)
库(闪亮)
图书馆(shinyjs)
图书馆(shinydashboard)

ui您的
observeEvent
执行得太早,因为在与
renderUI
相同的过程中,会更新反应值
trigger\u sidebar\u config
。因此,shiny试图隐藏一个还不存在的UI元素(您必须等待UI渲染,而不是它的计算触发,才能工作)

您可以通过延迟执行
shinyjs::hide
来测试这一点-它在被
操作按钮触发时工作(请参见下面的示例),或者您可以查看:

在这里您可以看到,通过
trigger\u sidebar\u config
触发的observeEvent在3ms后完成了计算,但此时(30ms)侧边栏尚未准备就绪

如果希望在启动时隐藏选项卡,可以在
renderUI
调用中使用
hidden()
(请参见
Menu3
):

库(闪亮)
图书馆(shinyjs)
图书馆(shinydashboard)

ui目标是在会话期间显示/添加
menuItem
?或者为什么要开始隐藏它?我想在会话期间隐藏它。这只是一个更复杂用例的简化示例。当然,只是询问,因为有
renderMenu
函数可以动态添加/删除
menuItem
s。您可以在
renderUI
调用中使用
shinyjs::hidden
启动隐藏。谢谢!。我怀疑执行令是原因。我怎样才能知道是这样的呢。你能详细说明一下吗?例如,一个人怎么能看到它是同一个周期?
library(shiny)
library(shinyjs)
library(shinydashboard)


ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    uiOutput("sidebar_ui")
  ),
  dashboardBody(
    shinyjs::useShinyjs(),
    actionButton("hide", "hide tab")
  )
)


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

  output$sidebar_ui <- renderUI({
    rv$trigger_sidebar_config <- 0
    cat("\nSidebar create")
    sidebarMenu(id = "sidebar",
                menuItem("Menu1", tabName = "tab_menu_1"),  # to be hidden
                menuItem("Menu2", tabName = "tab_menu_2"),
                shinyjs::hidden(menuItem("Menu3", tabName = "tab_menu_3")))
  })


  observeEvent(input$hide, {
    cat("\nSidebar config")
    shinyjs::hide(selector = '[data-value="tab_menu_1"]')  # hide menuitem
  })
}

shinyApp(ui, server)