代码之家  ›  专栏  ›  技术社区  ›  thothal

shinydashboard中带有conditionalPanel的动态菜单

  •  4
  • thothal  · 技术社区  · 8 年前

    出身背景

    我正在尝试开发一个应用程序,它有一个登录屏幕,并根据用户的权限显示不同的菜单。

    Read + Write 用户应具有与 Read 用户加上一些附加权限。

    我现在正在努力创建这个动态菜单。我读过 this document on dynamic UIs conditionalPanel

    在下面的代码中,您可以看到有很多重复。最糟糕的是,我必须为 tabs 即使他们在不同的(互斥)面板中( a1 a2 )但它们的作用是完全相同的。

    条件面板 sidebarMenu tabItems 但是我得到了一个错误,因为 条件面板

    预期结果

    最后,我希望代码的重复最少。也就是说,我想为 Do A Do B 一旦 做一个 对于两个用户。

    我有哪些选择?我必须回到动态渲染吗( renderUI renderMenu )或者有没有一种方法可以让我达到想要的行为/ 条件面板 只有

    library(shiny)
    library(shinydashboard)
    
    ui <- dashboardPage(
       dashboardHeader(),
       dashboardSidebar(
          selectInput("userrights", label = "User Rights:", 
                       choices = c("Read + Write", "Read")),
          conditionalPanel("input.userrights == 'Read'",
                           sidebarMenu(
                              menuItem("Do A", tabName = "a1")
                           )
          ),
          conditionalPanel("input.userrights == 'Read + Write'",
                           sidebarMenu(
                              ## unnecessary duplication + I need yet another tab 'a2'
                              menuItem("Do A", tabName = "a2"),
                              menuItem("Do B", tabName = "b2")
                           )
          )
       ),
       dashboardBody(
          conditionalPanel("input.userrights == 'Read'",
                           tabItems(
                              tabItem("a1", h1("A was done"))
                           )
          ),
          conditionalPanel("input.userrights == 'Read + Write'",
                           tabItems(
                              tabItem("a2", h1("A was done")),
                              tabItem("b2", h1("B was done"))
                           )
          )
       )
    )
    
    server <- function(input, output) {}
    
    runApp(shinyApp(ui, server))
    

    代码段:不工作,但至少没有重复

    sidebarMenu(
       menuItem("Do A", tabName = "a")
       conditionalPanel("input.userrights == 'Read + Write'",
          menuItem("Do B", tabName = "b")
       )
    )
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Florian    8 年前

    您可以根据用户输入或其他条件在服务器中呈现菜单,并将其输出到UI。工作示例如下:

    library(shiny)
    library(shinydashboard)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(
        selectInput("userrights", label = "User Rights:", 
                    choices = c("Read + Write", "Read")),
        sidebarMenuOutput("menu")
      ),
      dashboardBody(
        tabItems(
          tabItem("a", h1("A was done")),
          tabItem("b", h1("B was done"))
        )
      )
    )
    
    server <- function(input, output) {
    
    
      output$menu <- renderMenu({
    
        my_list = list(menuItem("a", tabName="a"))
    
        if(input$userrights=="Read + Write")
           my_list[[2]] = menuItem("b", tabName="b")
    
        sidebarMenu(my_list)
    
      })
    
    }
    
    runApp(shinyApp(ui, server))
    

    希望这有帮助!