R Shiny点击Highchart通过Shiny.onInputChange获取JS变量值
问题根因
无法获取country值的核心原因是hcaes映射阶段没有将country字段绑定到散点的属性上。highcharter默认只会把hcaes中显式声明的字段挂载到点击事件返回的event.point对象下,你当前的代码仅映射了lifeExp(x轴)、gdpPercap(y轴)、continent(分组)三个字段,点对象中本身不存在country相关属性,因此所有直接取值的写法都会返回空值。
修复方法
仅需要在hcaes中补充name = country的映射即可,你原本写的JS点击逻辑event.point.name是正确的,不需要调整。
修复后可直接运行的完整代码:
library(shiny) library(highcharter) library(gapminder) ui <- fluidPage( column(12, highchartOutput("hcontainer",height = "300px")), column(12, textOutput("clicked")) ) server <- function(input, output){ click_js <- JS("function(event) {Shiny.onInputChange('scatterclick', event.point.name);}") output$hcontainer <- renderHighchart({ gapminder::gapminder %>% hchart( type = "scatter", # 关键修改:新增name = country映射,将国家名称绑定到散点属性 hcaes(x = lifeExp, y = gdpPercap, group = continent, name = country), showInLegend = TRUE ) %>% hc_plotOptions(series = list(stacking = FALSE, events = list(click = click_js))) }) output$clicked <- renderText({ if(is.null(input$scatterclick)) "点击散点查看对应国家" else paste0("当前选中国家:", input$scatterclick) }) } shinyApp(ui, server)
扩展提示
如果后续需要获取数据集中其他字段(比如pop人口、year年份),只需要在hcaes中增加自定义属性映射即可,例如添加my_pop = pop后,就可以在JS点击事件中通过event.point.my_pop读取对应点的人口数据。
内容的提问来源于stack exchange,提问作者Lilou Ptk
相关产品推荐
相关产品推荐

