我有一个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
个?
答案 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
如果有更好的方式,请发表评论。