【问题标题】:How do I dynamically add additional `sidebarMenu`s with an action button in shiny (shinydashboard) using `renderMenu`?如何使用`renderMenu`在闪亮(闪亮的仪表板)中动态添加额外的`sidebarMenu`?
【发布时间】:2021-04-09 22:46:17
【问题描述】:

这是我正在使用的代码:

library(shiny)
library(shinydashboard)

header <- dashboardHeader(),
sidebar <- dashboardSidebar(sidebarMenu(menuItem("Home", tabName = "home")),
                            sidebarMenuOutput("menu"),
                            actionButton('add_menu', 'Add Menu'))
body <- dashboardBody()

ui <- dashboardPage(header = header, body = body, sidebar = sidebar)

server <- function(input, output, session) {
  
  shinyInput <- function(name, id) paste(name, id, sep = "_")
  counter <- reactiveValues(counter_value = 0L)
  
  observeEvent(input$add_menu, {
    counter$counter_value <- counter$counter_value + 1L
  })
  
  observeEvent(input$add_menu, {
    output$menu <- renderMenu({
                        sidebarMenu(
                          menuItem(paste("Menu", counter$counter_value),
                          value = shinyInput("new_menu", counter$counter_value)
                          ))
})
     
  })


}


shinyApp(ui = ui, server = server) 

目前当您按下actionButton时,主页选项卡下会出现一个新菜单,随后每单击一次,此菜单的名称就会增加1。这是因为output$menu被每一次覆盖随后单击按钮add_menu。相反,每次点击add_menu 我都希望出现附加/新菜单,因此两次点击将有一个主页和两个菜单。三下点击将有一个主页和 3 个菜单等...我不确定如何实现这一点,我考虑使用 apply 系列功能之一,但没有成功。此处的目标是单击侧边栏中的操作按钮,并将其他菜单添加到仪表板侧边栏中。

【问题讨论】:

    标签: r shiny shinydashboard shiny-server shinyapps


    【解决方案1】:

    也许这会满足您的需求。

    library(shiny)
    library(shinydashboard)
    
    header <- dashboardHeader()
    sidebar <- dashboardSidebar(#sidebarMenu(menuItem("Home", tabName = "home")),
                                sidebarMenuOutput(outputId = "dy_menu"),
                                actionButton('add_menu', 'Add Menu'))
    body <- dashboardBody()
    
    ui <- dashboardPage(header = header, body = body, sidebar = sidebar)
    
    server <- function(input, output, session) {
      menu_vals = reactiveValues(menu_list = NULL)
      counter <- reactiveValues(counter_value = 0L)
      
      output$dy_menu <- renderMenu({
        menu_list <- list(
          menuItem("Add Menu Items", tabName = "main", selected = TRUE),
          menu_vals$menu_list)
        sidebarMenu(.list = menu_list)
      })
      
      observeEvent(eventExpr = input$add_menu,
                   handlerExpr = {
                     counter$counter_value <- counter$counter_value + 1L
                     menu_vals$menu_list[[length(menu_vals$menu_list) + 1]] <- menuItem(paste("Menu", counter$counter_value),
                                                                                        tabName = paste0("Menu", counter$counter_value)) 
                     
                   })
      
    }
    
    shinyApp(ui = ui, server = server) 
    

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      相关资源
      最近更新 更多