动态生成的navbar和tabPanels在r shiny中

时间:2018-02-12 20:09:13

标签: r shiny

我尝试根据会话用户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")
              )
          )

      })

  }
)

1 个答案:

答案 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)