Создание условных пунктов меню и пунктов меню в Shiny - PullRequest
0 голосов
/ 10 сентября 2018

Я нашел, как динамически создать меню по адресу: http://rstudio.github.io/shinydashboard/structure.html#dynamic-content-1. Но я не могу понять, как получить то, что мне нужно.

С кодом, приведенным в ссылке выше, и инструкциями if я смог создать ЦЕЛОЕ меню или нет, относящееся к другим входам в моем приложении. Но сейчас я ищу гибкость в отношении каждого элемента / подпункта. Например, для меню по умолчанию, например:

Анализирует

  1. Анализ 1
  2. Анализ 2
  3. Анализ 3

Я хотел бы найти способ показа Анализа 1 и 3 только в том случае, если на сервере отсутствуют файлы, необходимые для Анализа 2.

Поэтому, в зависимости от входных данных моего приложения (выпадающих меню) и других параметров, я хотел бы иметь возможность изменять само меню. Это возможно?

До сих пор я пытался найти способ динамического объединения элементов меню / подменю, но безуспешно.

Я также пытался обманывать и генерировать строки с правильными HTML-тегами. Но это тоже не похоже на работу. Пока не знаю почему.

После первых комментариев / ответов на мой вопрос. Я приведу ниже минимальный пример того, что я попробовал. Я ценю, что это уродливый способ сделать это, и он не работает (меню не появляется). Все это основано на минимальном примере Паскаля в первом ответе:

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 голосов
/ 10 сентября 2018

Например, вы можете использовать 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)
...