Shiny应用中基于selectInput筛选process_map的流转边
解决方案:通过选中流转对筛选流程地图的边
要实现通过selectInput勾选/取消勾选流转对来显示/隐藏流程地图的边,核心思路是解析选中的流转对,过滤流程地图的边集合后重新渲染,具体步骤及代码如下:
1. 核心逻辑说明
- 先解析
selectInput中选中的流转字符串,拆分为前置/后置节点的对应关系 - 生成完整的流程地图对象后,提取其内置的边集合,保留匹配选中流转对的边
- 将过滤后的边替换回原地图对象,重新渲染为可缩放的SVG
2. 修改后的完整代码
library(shiny) library(bupaR) library(svgPanZoom) library(DiagrammeR) library(DiagrammeRsvg) library(processmapR) library(dplyr) # 预提取所有流转关系,用于生成selectInput选项 edges <- patients %>% process_map(performance(mean, "days")) %>% attr("edges") %>% rename(predecessor = from, successor = to) ui <- fluidPage( selectInput("tran", "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) { # 响应式解析选中的流转对 selected_trans <- reactive({ req(input$tran) t(sapply(input$tran, function(x) strsplit(x, " - ")[[1]])) %>% as.data.frame(stringsAsFactors = FALSE) %>% setNames(c("predecessor", "successor")) }) output$pmap <- renderSvgPanZoom({ # 生成完整的流程地图对象 full_process_map <- process_map(patients, type_nodes = frequency("absolute", color_scale = "Greys"), type_edges = frequency("absolute", color_edges = "Greys"), rankdir = "LR", render = FALSE) # 过滤边:未选中任何流转则保留全部,否则只保留选中的流转 filtered_edges <- if (length(input$tran) == 0) { attr(full_process_map, "edges") } else { attr(full_process_map, "edges") %>% inner_join(selected_trans(), by = c("from" = "predecessor", "to" = "successor")) } # 替换过滤后的边到地图对象 attr(full_process_map, "edges") <- filtered_edges # 渲染为可缩放SVG full_process_map %>% generate_dot() %>% grViz(width = 1000, height = 2000) %>% export_svg() %>% svgPanZoom(height = 800, controlIconsEnabled = TRUE) }) } shinyApp(ui = ui, server = server)
3. 关键细节
- 流转对解析:通过
strsplit拆分选中的字符串,转换为标准化的节点对应数据集,确保能和流程地图的边集合精准匹配 - 容错处理:添加了空选中的判断,若未勾选任何流转对则默认显示全部边,避免出现空白地图
- 高效修改:直接修改
process_map返回对象的edges属性,无需重新从事件日志生成地图,提升渲染效率
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

