在Shiny中创建条件菜单项和菜单SubItem

问题描述 投票:0回答:1

我找到了如何动态创建菜单:http://rstudio.github.io/shinydashboard/structure.html#dynamic-content-1。但是,我无法弄清楚如何得到我需要的东西。

使用上面的链接和if语句中给出的代码,我能够创建或不创建与我的应用程序中的其他输入相关的整个菜单。但现在我正在寻找的是每个项目/子项目的灵活性。例如,对于这样的默认菜单:

分析

  1. 分析1
  2. 分析2
  3. 分析3

我想找到一种方法,只显示分析1和3,如果服务器上没有分析2所需的文件。

因此,依赖于我的应用程序输入(下拉菜单)和其他参数,我希望能够更改菜单本身。那可能吗?

到目前为止,我试图找到一种方法来动态连接menuItems / subMenuItems,但没有运气。

我还试图用正确的html标签作弊并生成字符串。但这似乎也不起作用。不知道为什么。

跟进我的问题的第一个评论/答案。我正在提出我尝试过的最小例子。我很欣赏这是一种丑陋的方式,它不起作用(没有菜单出现)。这完全基于Pascallv在第一个答案中的最小例子:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
 dashboardHeader(title = "Dynamic sidebar"),

  dashboardSidebar(
    sidebarMenuOutput("menu")
  ),

  dashboardBody(selectInput(inputId = "SelectFolder", label = "Select my 
  analysis folder", choices = 
                          c(".", "..", "../.."))) 
)



server <- function(input, output) {

  # whenever input$hide_tab changes through user input, output$menu adapts
  observeEvent(input$SelectFolder,{

    content<-list.files(input$SelectFolder)
    menu <- '<ul id="mymenu" class="sidebar-menu">'
    menu <-paste0(menu,menuItem("analysis 1", tabName = "a1", icon = icon("list-ul")))
   if("app.R" %in% content){
      menu <-paste0(menu,menuItem("analysis 2", tabName = "a2", icon = icon("bar-chart")))
    }
    menu <-paste0(menu,"</ul>") # end of the whole menu
    output$menu <- renderMenu(menu)
  } )  
}


shinyApp(ui, server)

Pascallv解决方案对我不起作用的原因是因为我有很多不同的情况(菜单可能很大)而且我无法通过创建50多个不同的菜单来覆盖我的文件夹中存在的所有可能的分析组合。请问现在更有意义吗?

r shiny menuitem
1个回答
0
投票

例如,您可以在服务器代码中使用observeEvent(),这样可以使菜单对您喜欢的输入中的任何更改做出反应。

我不知道你到底想做什么,因为你没有提供你到目前为止所做的最小例子。但我相信你可以将这个例子传递给你的代码:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
   dashboardHeader(title = "Dynamic sidebar"),

   dashboardSidebar(
     sidebarMenuOutput("menu")
   ),

  dashboardBody(selectInput(inputId = "hide_tab", label = "Hide a tab?", choices = 
                c("1", "2", "3"))) 
)



server <- function(input, output) {

    # whenever input$hide_tab changes through user input, output$menu adapts
    observeEvent(input$hide_tab,{

    if(input$hide_tab== "1"){
      output$menu <- renderMenu({
      sidebarMenu(
      menuItem("Menu item", menuSubItem("analysis 2"), menuSubItem("analysis 3")))}) 
    }

    if(input$hide_tab== "2"){
        output$menu <- renderMenu({
        sidebarMenu(
        menuItem("Menu item", menuSubItem("analysis 1"), menuSubItem("analysis 
3")))})
    }

    if(input$hide_tab== "3"){
        output$menu <- renderMenu({
        sidebarMenu(
        menuItem("Menu item", menuSubItem("analysis 1"), menuSubItem("analysis 
2")))})
    }

  })
}


shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.