R Shiny:如何将数据表添加到动态创建的选项卡中

10

我目前正在尝试创建动态生成的数据表,每个表都有自己的选项卡。选项卡的数量由用户确定。我使用了此帖子中的代码作为框架。

我能够动态创建选项卡,但我无法弄清如何将数据表添加到选项卡中。数据表也是由用户输入确定的。比如说,在ui.R中,用户可以选择他们想要看的数据集:

ui.R

 library(shiny)
 shinyUI(fluidPage(
      titlePanel("Example"),
      sidebarLayout(
           sidebarPanel(
                selectInput("decision", label = "Choose Dataset", 
                            choices = list("mtcars" = "mtcars", 
                                           "iris" = "iris", 
                                           "precip" = "precip", 
                                           "quakes" = "quakes"), 
                            selected = NULL, multiple = TRUE)
           ),
           mainPanel(
                uiOutput('mytabs')
           )
      )
 ))

服务器.R

 library(shiny)
 library(ggplot2)

 shinyServer(function(input, output, session) {
      output$mytabs <- renderUI({
           nTabs = length(input$decision)
           myTabs = lapply(paste('dataset', 1:nTabs), tabPanel)
           do.call(tabsetPanel, myTabs)
      })
 })

因此,我希望相应的数据集在每个选项卡下单独呈现为数据表。

提前感谢您所有的帮助!

1个回答

16
为了实现您想要的功能,您需要在动态生成的tabPanel中添加dataTableOutput,然后动态生成相应的renderDataTable。请在服务器端执行以下操作:
library(DT) # need datatables package
server <- shinyServer(function(input, output, session) {

  output$mytabs <- renderUI({
    nTabs = length(input$decision)
    # create tabPanel with datatable in it
    myTabs = lapply(seq_len(nTabs), function(i) {
      tabPanel(paste0("dataset_",i),
        DT::dataTableOutput(paste0("datatable_",i))       
               )
      })

    do.call(tabsetPanel, myTabs)
  })

  # create datatables
  observe(
    lapply(seq_len(length(input$decision)), function(i) {
      output[[paste0("datatable_",i)]] <- DT::renderDataTable({
        as.data.frame(get(input$decision[i]))
      })
    })  
  )  
})

很好的解决方案。如果数据是在服务器上定义的,而不是全局或内置数据,那么只需要在get外面添加必要的()就可以了。例如get(input$decision[i])()。我花了15分钟才搞明白。 - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接