R运行pvclust直接绘图不返回结果列表 无法批量导出文件
问题根因
你的代码存在两个核心问题,直接导致返回列表为空、绘图提前打印:
pvrect()是绘图标注函数,仅作用于当前已存在的绘图画布,用来给显著性聚类加矩形边框,本身没有有效返回值(返回隐式NULL),你将它的返回值存入列表,最终得到的自然是无有效内容的空列表。- 你在模型计算的循环内直接调用
plot(hm),R会默认将图形输出到当前激活的交互绘图设备(如RStudio的Plot面板),不会生成可存储、可后续重复调用的绘图对象,因此函数运行时图直接显示,没有留存到返回结果里。 - 你后续导出代码用的
draw()是grid绘图体系(比如ComplexHeatmap对象)的渲染函数,pvclust的树状图是base R绘图体系,不存在对应的draw()方法,调用会报错。
修正方案
核心逻辑是把模型计算和绘图导出两步拆分:计算函数里只跑pvclust算法、存模型结果,所有绘图操作放到批量导出PDF的环节执行。
修正后的模型计算函数
移除循环内的所有绘图操作,仅存储pvclust生成的模型对象:
list_of_files <- list.files('Model_pvclust/',pattern = '\\.txt$', full.names = TRUE) cmplx_ht<-function(file_list){ start_time <- Sys.time() pv_model_list<-list() require(pvclust) for(f in file_list){ message(paste0("Making pvclust for: ",f)) df <- read.csv(f, header = TRUE, sep = "\t", check.names = FALSE) mat <- t(scale(t(as.matrix(df[,grepl("TCGA-",colnames(df))])))) rownames(mat)<-df$Symbol # 仅计算pvclust聚类模型,不执行绘图 hm <- pvclust(as.data.frame(t(mat)), method.hclust="complete", method.dist="euclidian",nboot = 10, parallel=T) pv_model_list[[f]]<-hm message("Done") } end_time <- Sys.time() time_taken<- end_time-start_time message(paste0("Total time used: ",time_taken)) return(pv_model_list) } hm_lst<-cmplx_ht(list_of_files)
修正后的批量导出代码
打开PDF设备后,依次执行画树状图、加显著性矩形框的操作,最后关闭设备完成导出:
for (i in seq_along(hm_lst)) { # 清洗文件名,避免全路径导致PDF存储位置错误、文件名非法 raw_name <- gsub("\\.txt$", "", basename(names(hm_lst)[[i]])) file_name = paste0(raw_name,".pdf") pdf(file_name,width = 15,height = 10) # 先绘制pvclust树状图 plot(hm_lst[[i]]) # 再叠加标注显著性聚类的矩形框 pvrect(hm_lst[[i]], alpha=.95) dev.off() }
提示:如果需要调整树状图的标题、配色、标签大小等参数,直接在
plot()调用里加对应参数即可,所有绘图相关的调整都放在PDF设备打开、关闭的代码段之间生效。
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

