基于selectInput实现流程地图节点间边的显示与隐藏
实现Shiny流程地图的过渡边动态筛选
需求说明
通过多选下拉框选择流程中的过渡对(节点间的连接),动态控制流程地图中对应边的显示与隐藏:选中的过渡边保留显示,取消选中则隐藏。
原代码存在的问题
- 未支持多选:仅处理第一个选中的过渡对,无法应对多个选项的情况
- 过滤逻辑反向:原函数是移除选中的过渡边,与需求(保留选中边)不符
- 分隔符不匹配:生成过渡对字符串用的是
"-",拆分时却用" - ",导致无法正确解析选中项
修正后的完整代码
library(shiny) library(bupaR) library(svgPanZoom) library(DiagrammeRsvg) library(processmapR) library(DiagrammeR) library(dplyr) # 提取流程地图的边信息并格式化 edges <- patients %>% process_map(performance(mean, "days"), render = FALSE) %>% attr("edges") %>% rename(predecessor = from, successor = to) # 过滤函数:保留选中的过渡边 filter_edges <- function(process_map_obj, selected_transitions) { # 将选中的过渡对拆分为前驱-后继数据框 selected_pairs <- strsplit(selected_transitions, " -> ") %>% lapply(function(x) tibble(predecessor = x[1], successor = x[2])) %>% bind_rows() # 筛选出符合选中条件的边 filtered_edges <- attr(process_map_obj, "edges") %>% inner_join(selected_pairs, by = c("from" = "predecessor", "to" = "successor")) # 更新流程地图的边属性 attr(process_map_obj, "edges") <- filtered_edges return(process_map_obj) } ui <- fluidPage( selectInput( inputId = "tran", label = "transitions", choices = paste(edges$predecessor, " -> ", edges$successor), selected = paste(edges$predecessor, " -> ", edges$successor), multiple = TRUE ), svgPanZoomOutput("pmap", height = 500, width = 1600) ) server <- function(input, output) { output$pmap <- renderSvgPanZoom({ req(input$tran) # 生成基础流程地图(不直接渲染) base_map <- process_map( patients, type_nodes = frequency("absolute", color_scale = "Greys"), type_edges = frequency("absolute", color_edges = "Greys"), rankdir = "LR", render = FALSE ) # 应用边过滤逻辑 filtered_map <- filter_edges(base_map, input$tran) # 渲染为可缩放的SVG组件 filtered_map %>% generate_dot() %>% grViz(width = 1000, height = 2000) %>% export_svg() %>% svgPanZoom(height = 800, controlIconsEnabled = TRUE) }) } shinyApp(ui = ui, server = server)
关键修正点说明
- 统一过渡对格式:用
" -> "作为过渡对的分隔符,既直观又避免解析错误 - 支持多选过滤:通过
strsplit结合bind_rows将所有选中的过渡对转换为数据框,再用inner_join筛选出需要保留的边 - 基于基础地图重渲染:每次都从原始流程地图开始过滤,避免多次操作导致的状态污染
- 逻辑对齐需求:过滤函数改为保留选中的过渡边,完全匹配"选中显示、取消隐藏"的需求
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

