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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:54:26