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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:45:08