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

时间:2018-09-10 13:41:42

标签: r shiny menuitem

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

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

分析

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

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

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

到目前为止,我一直试图找到一种动态连接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多个不同的分析来涵盖文件夹中是否存在所有可能的分析组合菜单。 请问现在更有意义吗?

1 个答案:

答案 0 :(得分: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)