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

FlowSOM聚类随机因consensus.pdf缺失报错求助

FlowSOM随机报错无法打开consensus.pdf的解决方法

问题原因

批量处理患者数据时,调用GetMetaclusters(..., nClus=i)会触发FlowSOM内部调用ConsensusClusterPlus生成共识聚类PDF。多个并行任务同时读写系统临时目录的文件,容易引发随机的文件锁冲突或资源竞争,导致无法打开consensus.pdf的报错——这就是问题无规律、难复现的核心原因。

解决办法

1. 禁用PDF生成(最直接有效)

在GetMetaclusters调用中添加plot = FALSE参数,彻底跳过PDF文件生成,从根源避免文件冲突:
修改calculate_median_ss函数中的关键行:

Cluster_ = as.numeric(GetMetaclusters(FlowSOM(input = flowFrame(dat), nClus=i, seed = 1), plot = FALSE))

2. 为每个任务分配独立临时目录(如需保留可视化)

如果需要查看共识聚类结果,给每个患者的聚类任务单独创建临时目录,避免文件重名冲突:
在parameter_optimization_simple函数开头加入:

# 创建专属临时目录
temp_dir <- tempfile(pattern = paste0(nam, "_"))
dir.create(temp_dir)
# 指定ConsensusClusterPlus的输出目录
options(ConsensusClusterPlus.tempdir = temp_dir)

函数末尾添加清理代码:

# 任务完成后删除临时目录
unlink(temp_dir, recursive = TRUE)

3. 临时改用串行处理

如果并行处理的资源竞争仍无法解决,暂时用循环替代purrr::map2,串行执行任务:

opt_param_list <- list()
for (file_name in names(df.list)) {
  opt_param_list[[file_name]] <- parameter_optimization_simple(
    df.list[[file_name]], channels, nam = file_name, smoothing = TRUE, seq_x
  )
}

4. 检查临时目录权限

确保R对系统临时目录有读写权限,可手动指定可靠目录:

# 查看当前临时目录
tempdir()
# 手动设置有读写权限的目录
options(tempdir = "/your/custom/writable/directory")

修改后的完整验证代码

library(flowCore)
library(FlowSOM)
library(purrr)
library(ggplot2)
library(smerc)

df.list <- replicate(40, as.data.frame(matrix(rnorm(2700, mean = 3, sd = 4), ncol = 9)), simplify = F )
df.list <- map(df.list, function(.y) { colnames(.y) <- paste0("C", 1:9); return(.y) } )
names(df.list) <- paste0("File",1:40)

mean_ss <- function(x) {centroid <- colMeans(x); mean(sapply(1:nrow(x), function(i) dist(rbind(x[i,], centroid))))}

calculate_median_ss <- function(dat, i, mode) {
  # 禁用ConsensusClusterPlus的PDF输出
  Cluster_ = as.numeric(GetMetaclusters(FlowSOM(input = flowFrame(dat), nClus=i, seed = 1), plot = FALSE)) 

  dfds <- data.frame(dat, Cluster_)

  clust <- table(dfds[["Cluster_"]])
  ds <- split(dfds, dfds[["Cluster_"]])
  ds <- lapply(ds, as.matrix)
  ds <- lapply(ds, mean_ss)
  ds <- unlist(ds)
  ds <- switch(mode, "median" = median(ds), "mean" = mean(ds))
  return(list(susq = ds, tab = clust))
}

parameter_optimization_simple <- function(dat, channels, nam, smoothing, seq_x) {

  opt_plot <- map(seq_x, ~ calculate_median_ss(as.matrix(dat[channels]), .x, "mean"))

  plot.df <- data.frame( nClus = seq_x, median_ss = unlist(map(opt_plot, ~ .x[[1]])) )
  colnames(plot.df)[1] <- "nClus"

  p <- ggplot(plot.df, aes(plot.df[[1]], plot.df[[2]])) +
    labs(x = "nClus", y = "mean_ss")
  p <- switch(smoothing, "Y" = {p + geom_smooth()}, "N" = { p + geom_point() + geom_line() } )
  p <- ggplot_build(p)[[1]][[1]]

  elbow <- elbow_point(p[["x"]], p[["y"]])$x

  cat(paste("Clustering for", nam,"optimized! \n"))

  return(elbow) 
}

channels <- paste0("C", 1:9)
seq_x <- seq(4,34,2)

set.seed(5)
opt_param_list = map2(.x = df.list, .y = names(df.list), ~ parameter_optimization_simple(.x, channels, nam = .y, smoothing = TRUE, seq_x)) 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:34:52