簡體   English   中英

帶有conditionalPanel的shinydashboard中的動態菜單

[英]Dynamic menu in shinydashboard with conditionalPanel

背景

我正在嘗試開發一個應用程序,它有一個登錄屏幕,根據用戶的權限顯示不同的菜單。

用戶權限是分層的,這意味着Read + Write用戶應具有與Read用戶相同的權限以及一些其他權限。

我現在正在努力創建這個動態菜單。 在動態UI上閱讀了這篇文章 ,我希望我可以完全通過使用conditionalPanel調用實現我的目標。

在下面的代碼中,您會看到存在大量重復。 最糟糕的是,我必須為tabs分配唯一的名稱,即使它們位於不同的(互斥)面板( a1a2 )中,但它們的目的是完全相同。

到目前為止嘗試的事情

我試圖將conditionalPanel移動到sidebarMenu (和分別是tabItems ),但后來我得到一個錯誤,因為conditionalPanel的返回類型與期望的類型不匹配。

預期結果

最后,我希望最小化代碼重復。 也就是說,我想定義的UI Do ADo B正好一次 ,但再利用 Do A為用戶。

我有哪些選擇? 我是否必須回退到動態渲染( renderUI / renderMenu )或者是否有一種方法可以實現只有conditionalPanel的所需行為?

具有重復的工作代碼

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")
   )
)

您可以根據用戶輸入或其他條件在服務器中呈現菜單,並將其輸出到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))

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM