R Shiny中触发plotly_click事件后如何渲染含完整原始数据的详细表格?
R Shiny + Plotly 点击柱状图返回全量原始数据解决方案
核心实现思路
- 点击plotly柱状图触发的
plotly_click事件返回数据中,x字段对应你映射到x轴的Deliv列取值 - 用该取值作为筛选条件,匹配原始数据框的
Deliv列,即可取出对应行的所有字段信息
完整可运行代码
library(shiny) library(plotly) library(DT) data <- data.frame(c(1,2,3,4,5,6,7,8,9,10), c(74, 100,74,16,16,99,16, 40, 16, 16), c(1, 10,1,8,6,2,6,4,6,6), c(0,0,0,112,0,0,0,0,96,16)) colnames(data) <- c("Deliv", "Pr", "Pro", "Disc") shinyApp( ui = fluidPage( plotlyOutput("plot"), DT::dataTableOutput('tb')), server = function(input, output) { output$plot <- renderPlotly({ plot_ly(data, x = ~Deliv, y = ~Pr, type = "bar", source = "click")}) output$tb <- renderDataTable({ event.data <- event_data("plotly_click", source = "click") # 未点击时返回提示,也可根据需求调整为返回全量数据 if(is.null(event.data)) { return(datatable(data.frame(提示 = "请点击柱状图查看对应数据"))) } # 用点击返回的x值筛选原始数据的对应行 target_data <- data[data$Deliv == event.data$x, ] datatable(target_data) }) } )
扩展说明
- 若需要支持点击多个柱子展示多条数据,可以在
plot_ly中配置点击事件的多选规则,同时调整筛选逻辑为data$Deliv %in% sapply(event.data, function(x) x$x)即可 - 如果你x轴映射的字段存在重复值,也可以自定义
key参数映射到唯一标识列,筛选时用key值匹配更稳妥,示例如下:
# plot_ly部分新增key参数 plot_ly(data, x = ~Deliv, y = ~Pr, type = "bar", source = "click", key = ~Deliv) # 这里可以替换为你的唯一标识列 # 筛选部分调整为 target_data <- data[data$Deliv == event.data$key, ]
内容的提问来源于stack exchange,提问作者umbra
相关产品推荐
相关产品推荐

