在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
相关产品推荐
相关产品推荐

