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
相关产品推荐
相关产品推荐

