2

我无法弄清楚如何根据输入数据框动态创建行并将行填充到引导样式表中。

示例...使用下面的表(dt),我想在我的 ui 中创建一个表,其中包含 4 行包含表中的数据。

我知道如何通过明确定义每一行来做到这一点,就像我在下面的第一行中所做的那样,但我真的希望能够动态地做到这一点,因为行数并不总是相同的。

感谢您的任何帮助或建议!

## app.R ##
library(shiny)
library(shinydashboard)

dt <- data.frame(1:4,1:4,1:4,1:4)
colnames(dt) <- c("Letter1","Letter2","Type1","Type2")

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    box(width = NULL,title = "simple table", uiOutput("lettertypetable"))
  )
)

server <- function(input, output, session) {
  output$lettertypetable <- renderUI({
    tags$table(class = "table",
               tags$thead(tags$tr(
                 tags$th("Letter1"),
                 tags$th("letter2"),
                 tags$th("Type1"),
                 tags$th("Type2")
               )),
               tags$tbody(
                 tags$tr(
                   tags$td("alpha"),
                   tags$td("beta"),
                   tags$td("yello"),
                   tags$td("orange")
                 )
               )
    )
  })

}

shinyApp(ui, server)
4

2 回答 2

0

嗯,第一步,我推荐DT包,

服务器:

output$letterTypeTable <- DT::renderDataTable({dt})

用户界面:

DT::dataTableOutput('letterTypeTable')

基本上会完成所有繁重的工作。


如果确实需要简单的表格,您可以尝试一些荒谬的黑客行为,如下所示:

tags$table(class = "table",
    tags$thead(tags$tr(
        eval(parse(text = paste0('list(',paste0(paste0('tags$th("',names(dt),'")'),collapse=","),')'))))
    ),

    tags$tbody(as.list(apply(dt,1,function(x) tags$tr(eval(parse(text = paste0('list(',paste0(paste0('tags$th("',x,'")'),collapse=","),')')))))))
)
于 2015-10-12T03:08:35.180 回答
0

为了完整起见,@Shape 的提议有一个更简单的解决方案:

ToothGrowth数据框为例:

dt=ToothGrowth

我们可以保留lapply但删除不需要的eval(parse(...))

ui <- fluidPage( 
    tags$table(class = "table",
        tags$thead(tags$tr(
            lapply(names(dt), tags$th)
            )
        ),
        tags$tbody(
            apply(dt,1, function(...) tags$tr(lapply(..., tags$td)) )
        )
    ) 
)
server <- function(input, output) { }
shinyApp(ui = ui, server = server)
于 2021-06-24T22:39:05.640 回答