基于R crosstalk实现联动筛选:部门筛选后更新医师选项
解决crosstalk中级联筛选器(科室→医师)的问题
问题描述
使用R语言的crosstalk工具(不依赖Shiny)创建科室和医师两个筛选器,期望选择科室后,医师筛选器仅显示对应科室的医师,但当前选择科室后医师筛选器仍显示全部医师,两个筛选器均可单独过滤表格。
问题原因
- 初始化
SharedData时指定了key = ~Department,这会限制共享数据的分组逻辑,导致医师筛选器始终读取全量数据的医师列表。 - 默认的
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
相关产品推荐
相关产品推荐

