如何在Shiny中实现多个DT表格的联动同步排序
实现方案
可以实现两个DT表格的双向排序同步,核心逻辑是监听两个表格的排序状态变化,共享同一个排序规则给两个表格渲染使用,完整可运行代码如下:
library(DT) library(shiny) ui <- basicPage( h2("mtcars数据同步排序演示"), DTOutput("mytable"), br(), DTOutput("mytable2") ) server <- function(input, output, session) { # 存储共享的排序状态,默认无排序 shared_sort <- reactiveVal(list()) # 监听第一个表格的排序变化 observeEvent(input$mytable_state, { current_order <- input$mytable_state$order if (!identical(current_order, shared_sort())) { shared_sort(current_order) } }) # 监听第二个表格的排序变化 observeEvent(input$mytable2_state, { current_order <- input$mytable2_state$order if (!identical(current_order, shared_sort())) { shared_sort(current_order) } }) output$mytable <- renderDT({ mtcars }, options = list( stateSave = TRUE, # 开启状态保存,捕获排序变更 order = shared_sort() # 绑定共享排序规则 ), server = FALSE) output$mytable2 <- renderDT({ mtcars }, options = list( stateSave = TRUE, order = shared_sort() ), server = FALSE) } shinyApp(ui, server)
关键说明
- 两个表格都需要开启
stateSave = TRUE配置,Shiny才能监听到表格的排序、分页等状态变更,变更后的状态会存在input$<表格ID>_state变量中 - 用
reactiveVal定义的shared_sort作为全局共享的排序状态,任意一个表格的排序变更都会更新这个变量,同时触发两个表格重新按照该规则渲染 - 代码中新增的
identical判断是为了避免两个表格互相触发更新导致的死循环 - 示例用
server = FALSE开启客户端排序,适合小数据集;如果是超大数据集需要服务端排序,只要把该参数改为server = TRUE即可,同步逻辑不需要修改
内容的提问来源于stack exchange,提问作者Jose Luis
相关产品推荐
相关产品推荐

