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

R中reactable与leaflet联动失效:点击表格行地图点未过滤

解决Reactable与Leaflet联动点击过滤问题

问题原因

你创建了两个独立的SharedData对象,虽同属一个分组,但数据源经过列筛选后,行关联关系出现偏差。同时Reactable默认选择事件不会自动触发Crosstalk的过滤同步,需明确配置联动逻辑。

修正后的代码

library(leaflet)
library(htmltools)
library(crosstalk)
library(reactable)
library(dplyr)

# 生成随机字符串的函数
myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}

# 构建完整数据集
id <- 1:1000
long <- 2.2945 + rnorm(1000, 0.1085246, 0.1)
lat <- 48.8584 + rnorm(1000, 0.009036273, 0.1)
my_data_1 <- data.frame(id, lat, long, var1 = myFun(1000), var2 = myFun(1000), var3 = myFun(1000))

# 仅创建一个SharedData对象,确保表格与地图数据完全关联
brew_shared <- SharedData$new(my_data_1, group = "breweries")

# 构建Leaflet地图,直接绑定SharedData
map <- leaflet(brew_shared) %>%
  addTiles() %>%
  addMarkers(clusterOptions = markerClusterOptions())

# 构建Reactable表格,使用同一SharedData,隐藏不需要展示的列
tbl <- reactable(
  brew_shared,
  columns = list(
    id = colDef(show = FALSE),
    lat = colDef(show = FALSE),
    long = colDef(show = FALSE)
  ),
  selection = "multiple",
  filterable = TRUE,
  searchable = TRUE,
  onClick = "select",
  rowStyle = list(cursor = "pointer"),
  minRows = 10,
  # 开启Crosstalk选择同步,让表格选择事件触发地图过滤
  crosstalk = list(selectionId = "brewery-selection")
)

# 组合并保存结果
final_file <- htmltools::browsable(htmltools::tagList(map, tbl))
htmltools::save_html(final_file, file = "sample.html")

关键修正点

  • 统一SharedData对象:不再拆分数据源,使用包含所有列的SharedData,确保表格与地图的行一一对应。
  • 按需隐藏列:通过Reactable的columns参数隐藏经纬度、ID等无需展示的列,只保留业务字段。
  • 开启选择同步:配置crosstalk参数,让Reactable的行选择事件自动同步到Crosstalk分组,触发Leaflet地图的点过滤逻辑。

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:40:22