Shiny dashboard - скрыть пункт меню в пользовательском интерфейсе боковой панели - PullRequest
0 голосов
/ 17 октября 2019

У меня есть сгенерированная сервером боковая панель. После его создания я хочу скрыть его первый элемент. Наблюдатель, выполняющий сокрытие, выполняется, однако пункт меню не скрыт. Я пытаюсь выяснить, почему это не работает. есть идеи?

PS. Селектор 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)

1 Ответ

1 голос
/ 17 октября 2019

Ваш observeEvent выполняется слишком рано, потому что реактивное значение trigger_sidebar_config обновляется в течение того же цикла , что и renderUI. Соответственно блестящий пытается скрыть элемент пользовательского интерфейса, который еще не существует (вам нужно будет подождать, пока пользовательский интерфейс будет отображен, вместо того, чтобы запустить его расчет, чтобы это работало).

Вы можете проверить это, например:через задержку выполнения shinyjs::hide - он работает, когда запускается actionButton (см. мой пример ниже), или вы смотрите actlog :

reactlog Здесь вы можете видеть, что наблюдаемое событие, вызванное с помощью 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().

...