我尝试根据会话用户ID制作动态生成的导航栏。
我有一个数据表,将会话用户映射到该用户的客户端列表。我希望应用程序生成一个导航栏,其中每个tabPanel用于用户拥有的每个客户端。我不确定如何轻松地做到这一点,因为navbarPage()
没有采用列表参数。
以下是我的例子
library(shiny)
data <- data.frame(user=c("emily", "emily"), clients=c("client1", "client2"))
CreateCustomNavbarContent <- function(data) {
l <- lapply(data$clients, function(client) {
tabPanel(client,
h2(client))
})
renderUI({
l
})
}
shinyApp(
ui <- fluidPage(
uiOutput("custom_navbar")
),
server <- function(input, output) {
output$custom_navbar <- renderUI({
## commented below doesn't work
# navbarPage(
# CreateCustomNavbarContent(data)
# )
navbarPage("",
tabPanel("client1",
h2("client1")
),
tabPanel("client2",
h2("client2")
)
)
})
}
)
答案 0 :(得分:1)
您可以使用do.call实现所需的功能,因此我们可以将参数列表作为单独的参数传递。下面是一个工作示例,我给了emily一个名为John的伴侣,这样你就可以验证代码是否符合你的要求;)
希望这有帮助!
library(shiny)
data <- data.frame(user=c("Emily", "Emily","John","John"), clients=c("client1", "client2","client3","client4"))
ui = fluidPage(
selectInput('select_user','Select user:',unique(data$user)),
uiOutput('mytabsetpanel')
)
server = function(input, output, session){
output$mytabsetpanel = renderUI({
myTabs = lapply(data$clients[data$user==input$select_user], tabPanel)
do.call(tabsetPanel, myTabs)
})
}
shinyApp(ui,server)