You need to enable JavaScript to run this app. 在Shiny中实现两个DT::dataTable输出的点击联动显示
优惠活动
大模型
产品
解决方案
定价
更多

在Shiny中实现两个DT::dataTable输出的点击联动显示

Shiny表格点击显隐联动解决方案

以下是可直接运行的修改后代码,实现点击汇总表格后才展示详情表格的效果,同时默认支持点击汇总行筛选对应类别的详情数据:

library(shiny)
library(shinydashboard)
library(DT)
library(shinyjs)

set.seed(0)
mydf <- data.frame(Type = sample(LETTERS[1:5], 30, replace = TRUE),
                   Amount = sample(10:200, 30, replace = TRUE), 
                   stringsAsFactors= FALSE, check.names = FALSE)

mydf_agg <- aggregate(list(Amount=mydf$Amount),list(Type=mydf$Type),sum)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    useShinyjs(), # 初始化shinyjs以控制元素显隐
    box(width=3,status="primary",solidHeader=T,collapsible=T, title="Summary", DT::dataTableOutput("mytable_summary")),
    # 详情表格默认隐藏,设置唯一id供显隐控制调用
    hidden(
      box(id = "detail_box", width=3,status="primary",solidHeader=T,collapsible=T, title="More Data", DT::dataTableOutput("mytable"))
    )
  )
)

server <- function(input, output) {
  output$mytable_summary <-  DT::renderDataTable({
    mydf_agg
  }, selection = "single") # 可根据需求改为"multiple"允许多选
  
  # 监听汇总表行选中事件,触发详情表格显示
  observeEvent(input$mytable_summary_rows_selected, {
    if(length(input$mytable_summary_rows_selected) > 0){
      show("detail_box")
    }
    # 若需要取消选中后隐藏详情表,补充以下逻辑即可
    # else {
    #   hide("detail_box")
    # }
  })
  
  output$mytable <-  DT::renderDataTable({
    req(input$mytable_summary_rows_selected)
    # 筛选选中类别对应的详情数据,不需要可直接返回全量mydf
    selected_type <- mydf_agg$Type[input$mytable_summary_rows_selected]
    mydf[mydf$Type == selected_type, ]
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

核心修改说明

  • 引入shinyjs包快速控制UI元素的显隐状态,UI端需先调用useShinyjs()完成初始化
  • 给详情表格容器设置唯一id,默认隐藏
  • 监听DT内置的input$<表格id>_rows_selected事件,有行选中时触发详情表格显示
  • 可选配置:支持行选中后筛选对应类别的详情数据,不需要可直接返回全量mydf

无shinyjs备选方案

如果不想额外引入依赖包,可使用Shiny原生的conditionalPanel实现,只需将UI中的详情表格部分替换为以下代码即可,无需修改server端的显隐逻辑:

conditionalPanel(
  condition = "input.mytable_summary_rows_selected.length > 0",
  box(width=3,status="primary",solidHeader=T,collapsible=T, title="More Data", DT::dataTableOutput("mytable"))
)

内容的提问来源于stack exchange,提问作者Pushkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 11:27:04