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

基于selectInput实现流程地图节点间边的显示与隐藏

实现Shiny流程地图的过渡边动态筛选

需求说明

通过多选下拉框选择流程中的过渡对(节点间的连接),动态控制流程地图中对应边的显示与隐藏:选中的过渡边保留显示,取消选中则隐藏。

原代码存在的问题

  1. 未支持多选:仅处理第一个选中的过渡对,无法应对多个选项的情况
  2. 过滤逻辑反向:原函数是移除选中的过渡边,与需求(保留选中边)不符
  3. 分隔符不匹配:生成过渡对字符串用的是"-",拆分时却用" - ",导致无法正确解析选中项

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:00:39