You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R Shiny中关联两个独立DT表格的分页功能?

实现Shiny中两个DT表格的分页同步

要实现两个DT表格的分页同步,同时隐藏第二个表格的分页控件,可以通过监听第一个表格的状态变化,同步控制两个表格的显示页面,具体实现如下:

核心逻辑

  1. 用响应式变量跟踪当前页码,基于第一个表格的分页状态更新该值
  2. 两个表格都根据这个页码值设置初始显示的起始行
  3. 隐藏第二个表格的分页控件,只保留第一个表格作为分页交互入口

完整代码

library(shiny)
library(DT)

ui <- fluidPage(
  h5("Table 1"),
  DTOutput("table1"),
  h5("Table 2"),
  DTOutput("table2")
)

server <- function(input, output, session) {
  # 统一设置每页行数,确保两个表格分页逻辑一致
  page_len <- 6
  # 初始化当前页码的响应式变量
  current_page <- reactiveVal(1)
  
  # 监听第一个表格的状态变化,实时更新当前页码
  observeEvent(input$table1_state, {
    req(input$table1_state)
    # 通过起始行索引计算当前页码:(起始行 / 每页行数) + 1
    new_page <- (input$table1_state$start / page_len) + 1
    current_page(new_page)
  })
  
  output$table1 <- renderDT({
    datatable(
      iris[iris$Species == "setosa", ],
      options = list(
        dom = '<"top" p>',
        pageLength = page_len,
        # 开启状态保存,确保表格分页状态能被正确捕获
        stateSave = TRUE
      )
    )
  })
  
  output$table2 <- renderDT({
    datatable(
      iris[iris$Species == "virginica", ],
      options = list(
        dom = 't', # 仅显示表格内容,隐藏分页控件
        pageLength = page_len,
        # 根据当前页码计算起始行索引,实现页面同步
        displayStart = (current_page() - 1) * page_len
      )
    )
  })
}

shinyApp(ui = ui, server = server)

关键细节说明

  • input$table1_state:DT表格内置的状态输入,包含start(当前页起始行索引)、length(每页行数)等信息,开启stateSave = TRUE才能正常捕获分页状态变化
  • displayStart:DT的配置选项,用于指定表格初始显示的起始行索引,通过(current_page()-1)*page_len完成页码到起始行的转换
  • 第二个表格设置dom = 't',只保留表格主体,隐藏分页控件,所有分页操作仅通过第一个表格完成

内容的提问来源于stack exchange,提问作者Michael S Taylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:17:19