【问题标题】:R Shiny: How to add data tables to dynamically created tabsR Shiny:如何将数据表添加到动态创建的选项卡
【发布时间】:2017-01-09 14:35:38
【问题描述】:

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

我能够动态创建选项卡,但我不知道如何将数据表添加到选项卡。数据表也由用户输入确定。 因此,例如,在 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)
      })
 })

所以,我想把对应的数据集分别渲染到每个标签下的数据表中。

提前感谢您的所有帮助!

【问题讨论】:

    标签: r dynamic tabs shiny dt


    【解决方案1】:

    要做你想做的事,你需要在动态生成tabPanel的同时将dataTableOutput添加到你的tabPanel中,然后你需要动态生成对应的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 分钟才弄清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2015-09-02
    • 2019-07-16
    • 1970-01-01
    • 2021-10-23
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多