我在http://rstudio.github.io/shinydashboard/structure.html#dynamic-content-1找到了如何动态创建菜单的方法。 但是,我无法弄清楚如何获得所需的东西。
使用上面链接中的代码以及if语句,我能够创建与我的应用程序中其他输入相关的WHOLE菜单。 但是现在我要寻找的是每个项目/子项目的灵活性。 例如,对于这样的默认菜单:
分析
如果服务器上没有分析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多个不同的分析来涵盖文件夹中是否存在所有可能的分析组合菜单。 请问现在更有意义吗?
答案 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)