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