R Shiny:ObserveEvent中更新DT代理表列表头的实现方法咨询
R Shiny DT代理表动态更新列名实现方案
原代码修改列名无效的核心原因:replaceData()方法仅更新表格的单元格数据,不会修改初始化阶段渲染完成的表头结构,表头属于表格的元配置项,需要调用DT专门的表头更新方法修改。
DT 0.20及以上版本提供了setColnames()代理方法,可实现和updateCaption()类似的无刷新更新列表头效果,修改后的完整代码如下:
library(shiny) library(DT) ui <- fluidPage( fluidRow( actionButton( "updatebutton", label = "Update Table", style = "margin-right: 5px;" ), DT::dataTableOutput("myplot") ) ) server <- function(input, output) { mycolumnnames <- c("Do","Re","Mi","Fa","So") myothercolumnnames <- c("y1","y2","y3","y4","y5") output$myplot <- DT::renderDataTable({ DF <- data.frame(replicate(5, sample(rnorm(5), 10, rep = TRUE))) datatable(DF, colnames = mycolumnnames, caption="Original caption") }) proxy <- DT::dataTableProxy("myplot") observeEvent(input$updatebutton, { # 更新表格标题 updateCaption(proxy, caption="Look, I am a NEW caption!") # 生成新的表格数据 DF <- data.frame(replicate(5, sample(rnorm(5), 10, rep = TRUE))) # 动态更新列表头 proxy %>% setColnames(myothercolumnnames) # 更新表格数据,可选添加resetPaging = FALSE参数保留当前分页位置 proxy %>% replaceData(DF) }) } shinyApp(ui = ui, server = server)
补充说明:
- 该方案不会触发整个表格的重渲染,仅更新表头文本,符合你要求的类似
updateCaption()的更新体验 - 如果你使用的DT版本低于0.20没有
setColnames()方法,可以将列名存为响应式变量,触发renderDataTable重渲染实现效果,仅会有轻微的表格刷新感
内容的提问来源于stack exchange,提问作者D I
相关产品推荐
相关产品推荐

