Ваш observeEvent
выполняется слишком рано, потому что реактивное значение trigger_sidebar_config
обновляется в течение того же цикла , что и renderUI
. Соответственно блестящий пытается скрыть элемент пользовательского интерфейса, который еще не существует (вам нужно будет подождать, пока пользовательский интерфейс будет отображен, вместо того, чтобы запустить его расчет, чтобы это работало).
Вы можете проверить это, например:через задержку выполнения shinyjs::hide
- он работает, когда запускается actionButton
(см. мой пример ниже), или вы смотрите actlog :
Здесь вы можете видеть, что наблюдаемое событие, вызванное с помощью trigger_sidebar_config
, завершило вычисление через 3 мс, но боковая панель в это время не была готова (30 мс).
Если вы хотите, чтобы вкладка была скрытапри запуске вы можете использовать hidden()
в своем вызове renderUI
(см. Menu3
):
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)
В этом контексте также смотрите ?renderMenu()
.