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

基于R crosstalk实现联动筛选:部门筛选后更新医师选项

解决crosstalk中级联筛选器(科室→医师)的问题

问题描述

使用R语言的crosstalk工具(不依赖Shiny)创建科室和医师两个筛选器,期望选择科室后,医师筛选器仅显示对应科室的医师,但当前选择科室后医师筛选器仍显示全部医师,两个筛选器均可单独过滤表格。

问题原因

  1. 初始化SharedData时指定了key = ~Department,这会限制共享数据的分组逻辑,导致医师筛选器始终读取全量数据的医师列表。
  2. 默认的filter_select基于原始完整数据集生成选项,不会自动随其他筛选器的结果动态更新。

解决方案

修改代码如下:

library(tidyverse)
library(crosstalk)

data <- data.frame(
  Department = rep(c("Cardiology", "Neurology", "Pediatrics"), each = 3),
  Provider = c("Dr. A", "Dr. B", "Dr. C", "Dr. D", "Dr. E", "Dr. F", "Dr. G", "Dr. H", "Dr. I"),
  value = seq(1:9)
)

# 创建不带key的SharedData对象,保留完整数据集关联
shared_data <- SharedData$new(data)

# 科室筛选器
dept_filter <- filter_select(
  id = "department_filter",
  label = "Select Department",
  sharedData = shared_data,
  group = ~Department,
  multiple = FALSE
)

# 医师筛选器:动态依赖科室筛选结果生成选项
provider_filter <- filter_select(
  id = "provider_filter",
  label = "Select Provider",
  sharedData = shared_data,
  group = ~Provider,
  multiple = FALSE,
  # 传入函数,基于当前筛选后的数据集生成医师选项
  choices = function(filtered_data) {
    unique(filtered_data$Provider)
  }
)

# 输出布局
bscols(
  widths = c(12),
  list(dept_filter, provider_filter),
  datatable(shared_data)
)

代码说明

  • 移除SharedData的key参数,让共享数据保留完整的数据集联动逻辑。
  • 为医师筛选器添加choices参数:传入的函数会接收当前科室筛选后的数据集,返回其中唯一的医师列表,实现选项的动态更新。

修改后,选择科室时医师筛选器会自动更新为对应科室的医师,同时两个筛选器依然可以共同过滤表格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:29:59