Shiny如何将table.data数据框渲染为绘图下方的表格输出
问题原因及修正方案
两个核心错误导致表格无法正常渲染:
- 渲染函数未绑定输出插槽:所有Shiny的输出内容都必须赋值给
output对象下和UI定义的ID对应的属性,你当前UI中表格的ID为TABLE,因此不能直接写renderTable({table.data()}),必须写为output$TABLE <- renderTable({table.data()}) - 渲染函数与UI组件不匹配(仅使用
renderDataTable时存在):renderDataTable是DT扩展包提供的功能,需要先加载DT包,且UI端要将tableOutput('TABLE')替换为DT::dataTableOutput('TABLE')才能正常渲染。
以下是修正后的可运行代码(使用Shiny原生静态表格,无需额外依赖):
library(shiny) library(data.table) library(flexsurv) # 加载示例数据 data(pbc, package="randomForestSRC") data <- as.data.table(na.omit(pbc)) data[, years := days/365.25] fit <- flexsurvspline(Surv(years, status) ~ albumin, data=data, k=1, scale='hazard') ui <- fluidPage( fluidRow( column(12, h1('TITLE'), align='middle') ), hr(), sidebarLayout( sidebarPanel( sliderInput('COVAL', '协变量取值', min=1, max=5, value=3, step=1), align = 'left', ), mainPanel( plotOutput('PLOT', height = 600, width = 600), tableOutput('TABLE') ) ) ) server <- function(input, output) { table.data <- reactive({ ndata <- data.frame(albumin = input[["COVAL"]]) prob=summary(fit,type='survival',newdata=ndata, t=12) prob=as.data.frame(matrix(unlist(prob),nrow = length(prob),byrow = TRUE)) # 自定义列名提升可读性 colnames(prob) <- c("观测时间","生存概率","置信区间下限","置信区间上限") return(prob) }) output$PLOT <- renderPlot({ ndata <- data.frame(albumin = input[["COVAL"]]) plot(fit, est=FALSE, ci=FALSE, col.obs = 'white') lines(fit, newdata = ndata, ci=FALSE, col = 'green') }) # 绑定到output的TABLE插槽即可正常渲染 output$TABLE <- renderTable({table.data()}) } shinyApp(ui, server)
如果需要使用可交互的DataTable组件,仅需要做三处调整:
- 加载DT包:
library(DT) - UI端将
tableOutput('TABLE')替换为DT::dataTableOutput('TABLE') - 服务端将渲染代码替换为
output$TABLE <- DT::renderDataTable({table.data()})
内容的提问来源于stack exchange,提问作者Amer
相关产品推荐
相关产品推荐

