[英]Dynamic menu in shinydashboard with conditionalPanel
背景
我正在嘗試開發一個應用程序,它有一個登錄屏幕,根據用戶的權限顯示不同的菜單。
用戶權限是分層的,這意味着Read + Write
用戶應具有與Read
用戶相同的權限以及一些其他權限。
我現在正在努力創建這個動態菜單。 我在動態UI上閱讀了這篇文章 ,我希望我可以完全通過使用conditionalPanel
調用實現我的目標。
在下面的代碼中,您會看到存在大量重復。 最糟糕的是,我必須為tabs
分配唯一的名稱,即使它們位於不同的(互斥)面板( a1
和a2
)中,但它們的目的是完全相同。
到目前為止嘗試的事情
我試圖將conditionalPanel
移動到sidebarMenu
(和分別是tabItems
),但后來我得到一個錯誤,因為conditionalPanel
的返回類型與期望的類型不匹配。
預期結果
最后,我希望最小化代碼重復。 也就是說,我想定義的UI Do A
和Do 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.