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

Posted

技术标签:

【中文标题】R Shiny:如何将数据表添加到动态创建的选项卡【英文标题】:R Shiny: How to add data tables to dynamically created tabs 【发布时间】: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)
      )
 )

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

提前感谢您的所有帮助!

【问题讨论】:

【参考方案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 分钟才弄清楚。

以上是关于R Shiny:如何将数据表添加到动态创建的选项卡的主要内容,如果未能解决你的问题,请参考以下文章

在 R Shiny 中使用 ActionButton 跳转到选项卡项

如何将选项卡“ALL”动态添加到菜单选项卡

选项卡面板的动态高度调整不适用于信息框

如何使选项卡和选项卡栏视图在颤动中动态化,以便它能够响应来自 api 的响应?

R Shiny - 将tabPanel动态添加到tabsetPanel(使用renderUI)

R Highcharter:Shiny on the fly 中的动态钻取