循环在Shiny中的tabsetPanel中创建选项卡

时间:2017-03-01 19:05:10

标签: r shiny

我正在尝试使用lapply根据此示例在Shiny的tabsetPanel中创建多个标签:http://shiny.rstudio.com/gallery/creating-a-ui-from-a-loop.html。以下是我的app.R代码。当我运行它时,它不会创建5个选项卡,也不会打印每个选项卡的名称。我究竟做错了什么?

library(shiny)

ui <- pageWithSidebar(
  headerPanel("xxx"),
  sidebarPanel(),
  mainPanel(
    tabsetPanel(id='t',
      lapply(1:5, function(i) {
        tabPanel(
          title=paste0('tab', i), 
          textOutput(paste0('a',i))
        )
      }) 
    )
  )
)

server <- function(input, output) {
  observe({
    print(input$t)
  })

  lapply(1:5, function(j) {
    output[[paste0('a',j)]] <- renderPrint({
      input$t
    })
  })
}

shinyApp(ui, server)

2 个答案:

答案 0 :(得分:4)

这有点棘手,因为tabsetPanel不接受tabset列表作为参数。您可以使用do.call来&#34;取消列表&#34;参数:

mainPanel(
    do.call(tabsetPanel, c(id='t',lapply(1:5, function(i) {
                  tabPanel(
                    title=paste0('tab', i), 
                    textOutput(paste0('a',i))
                  )
                })))
    )

答案 1 :(得分:1)

stack.app <- function(n = 5){

  library(shiny)

  ui <- pageWithSidebar(
    headerPanel("xxx"),
    sidebarPanel(
      verbatimTextOutput("show_selected")
    ),
    mainPanel(
      uiOutput('my_tabs')
    )
  )

  server <- function(input, output, session) {

   output$my_tabs <- renderUI({
     ### Had to hicjack this from shiny to get it to work...
     shiny:::buildTabset(
       id = "t",
       lapply(1:n, function(i){
         tabPanel(title = sprintf("tt_%s",i),
                  HTML(sprintf("This is tab %s content", i))
         )
       }), paste0("nav nav-","tabs")) %>% (function(x){
         tags$div(class = "tabbable", x[[1]], x[[2]])
       })
   })

   output$show_selected <- renderPrint({
     sprintf("SELECTED TAB IS : %s", input$t)
   })


  }

  shinyApp(ui, server)

}

结果如下:

Here's the output