在R Shiny中使用echarts4r分组柱状图时如何通过回调实现精准筛选
解决方案
要实现点击柱子时按x1、x2、y三个维度筛选数据并弹窗显示对应表格,关键是获取时间轴当前选中的分组值和点击柱子的各项参数,同时调整触发弹窗的事件源以避免时间轴点击误触发。以下是修改后的完整代码:
library(shiny) library(echarts4r) library(DT) library(tidyr) library(dplyr) data <- tibble( x1 = c(rep(c(rep("2021", 2), rep("2022", 2)), 3)), x2 = c(rep("Junior", 4), rep("Associate", 4), rep("Senior", 4)), y = rep(c("No", "Yes"), 6), N = runif(12, min=30, max=100) ) # 获取x2的唯一值,对应时间轴的顺序 x2_levels <- unique(data$x2) ui <- fluidPage( echarts4rOutput("chart") ) server <- function(input, output) { # 监听柱子点击事件(避免时间轴误触发) observeEvent(input$chart_clicked_data,{ # 获取当前时间轴对应的x2分组值(索引从0开始,需+1) current_x2 <- x2_levels[input$chart_timeline_active + 1] output$table <- DT::renderDataTable({ data %>% filter( x1 == input$chart_clicked_data$value[[1]], # 点击的年份 x2 == current_x2, # 当前时间轴对应的职级 y == input$chart_clicked_serie # 点击的系列(No/Yes) ) %>% DT::datatable() }) showModal(modalDialog(DT::dataTableOutput("table"))) }) output$chart <- renderEcharts4r({ data %>% pivot_wider(names_from=y, values_from=N) %>% group_by(x2) %>% e_charts(x1, timeline = TRUE) %>% e_bar(No) %>% e_bar(Yes) %>% e_color(c("#2774AE","#8BB8E8")) %>% e_y_axis( name="N", min=0, max=150 ) }) } shinyApp(ui = ui, server = server)
关键修改说明:
- 时间轴分组值获取:通过
input$chart_timeline_active拿到当前时间轴的索引(从0开始),结合预定义的x2_levels得到当前选中的职级。 - 事件源调整:将监听对象改为
input$chart_clicked_data,仅在点击柱子时触发弹窗,避免点击时间轴误触发。 - 多维度精准筛选:同时匹配
x1(点击的年份)、x2(当前时间轴职级)、y(点击的系列),精准定位到数据框的目标行。
初始示例的适配修改
如果要适配初始示例(按x1和x2筛选),只需调整筛选逻辑:
observeEvent(input$chart_clicked_data,{ current_x1 <- unique(data$x1)[input$chart_timeline_active + 1] output$table <- DT::renderDataTable({ data %>% filter( x1 == current_x1, x2 == input$chart_clicked_data$value[[1]] ) %>% DT::datatable() }) showModal(modalDialog(DT::dataTableOutput("table"))) })
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

