以闪亮的方式输出IN表,其中N取决于数据

时间:2014-04-03 15:32:31

标签: r shiny

我有一个shiny应用,我想在其中打印多个表格。问题是,我不知道我将提前有多少桌子 - 这取决于数据。例如。如果变量" X"有5个级别,我想输出5个表 - 每个级别的变量一个。

要生成表格,我在renderTable()中的server.R内调用一个函数,并将其分配到output这样的插槽:

output$tablePyramid <- renderTable ({
          tableGeneratingFunction(argument1, argument2, ...)
})

如果我放了多个&#34; tableGeneratingFunction&#34;在renderTable()内,它只返回生成的最后一个表。所以它似乎每output个插槽只有一个表。我想我可以在server.R文件中处理这个问题,根据需要动态分配多个output个插槽。

但我还必须列出ui.R文件中的所有输出。两个表的示例摘录:

mainPanel(
tabsetPanel(
... some code

  tabPanel(title="Proportions",
           tableOutput("tablePyramid"),
           tableOutput("tablePyramid2")
           ),
  ... some more code

我是否必须在自己的tableOutput函数中列出每个表格,或者是否有更优雅的方式继续进行,因为我事先并不知道我需要多少tableOutput个?

1 个答案:

答案 0 :(得分:2)

我从评论开始,将Dieter链接到我的问题(R Shiny - add tabPanel to tabsetPanel dynamically (with the use of renderUI))。原理是相同的 - 使用Server.R中的所有表生成HTML,然后在uiOutput()中使用Ui.R显示它。不同的是,我在shiny包中找不到与tabPanel()类似的函数,它在给定的示例中生成HTML。

但我能够使用xtable()生成HTML并为表格传递一些额外的参数,以便在呈现时在shiny框架中看起来像预期的那样。

为任意数量的表生成HTML的函数示例:

tabelize <- function(variables, arg2, ...) {

  tables <- list() # create a list to hold all tables

  for (variable in variables) { # go through all possible values of variables
    table <- function_that_returns_a_data_frame(variable, arg2, ...)
    tables[[as.character(variable)]] <- 
      # save table into slot in created list
      # print table as HTML with additional formatting options
      print(xtable(table, caption=paste("Variable:", variable)),
            type="html",
            html.table.attributes='class="data table table-bordered table-condensed"',
            caption.placement="top")
  }
  return(lapply(tables, paste)) # return HTML tables pasted together
}

Server.R中调用此功能(带有一些其他选项)并分配到output$广告位:

output$tables <- renderUI({
  out <- tabelize(variables, arg2, ...) 
  # additional options to make rendering possible
  return(div(HTML(out),class="shiny-html-output"))
 })

uiOutput()中执行Ui.R

    ... code        
    uiOutput("tables")
    ... code

如果有更好的方式,请发表评论。