R脚本含if判断的嵌套for循环仅执行首轮迭代问题求解
故障原因
脚本第一轮迭代后终止和内层循环是否关联外层变量i无关,核心是两个逻辑错误:
- 绘图设备未按规则关闭:你将
dev.off()放在了外层文件遍历循环的外部,每次调用png()创建绘图文件、完成绘图后没有立刻关闭设备,第一轮迭代就会打开5个未释放的绘图设备(1张全局通路图+4张聚类图),直接导致后续迭代无法调用绘图接口,脚本中断。 - 聚类遍历缺少边界校验:内层循环固定取聚类列表的前4个元素,如果某个输入文件的基因映射结果得到的功能聚类总数不足4个,会触发R下标越界错误,直接终止整个循环。
修复后可运行代码
## 加载依赖包 library('readxl') library(STRINGdb) ## 设置工作路径 setwd("DEtables") # 获取目录下所有csv格式的差异分析结果文件 filenames = list.files(path = ".", pattern="*.csv", full.names = FALSE) ## 初始化STRINGdb数据库连接 string_db <- STRINGdb$new( version="11.5", species=9606, score_threshold=200, input_directory="") ## 批量遍历文件做通路分析 for (i in filenames) { CSVFile <-read.csv(i, na.strings=c("","NA"), header=TRUE) # 基因ID映射 example1_mapped <- string_db$map(CSVFile, "genes", removeUnmappedRows = TRUE ) hits <- example1_mapped$STRING_id[1:200] # 筛选FDR<0.05的差异基因添加表达上下调颜色 example1_mapped_pval05 <- string_db$add_diff_exp_color(subset(example1_mapped, FDR<0.05), logFcColStr="logFC" ) if(length(example1_mapped_pval05$STRING_id) > 0){ # 上传注释信息到STRING服务器 payload_id <- string_db$post_payload(example1_mapped_pval05$STRING_id, colors=example1_mapped_pval05$color ) # 绘制全局通路网络图 png(file= paste0("../PathwayOuts/",sub('\\.csv$','',i),"Pathways.png"), width = 4, height = 4, units = 'in', res=600) par(mar=c(3,3,3,3)) string_db$plot_network( hits, payload_id=payload_id ) dev.off() # 绘图完成立刻关闭设备,写入文件 # 做GO和KEGG富集分析并导出结果 enrichmentGO<- string_db$get_enrichment(hits, category = "Process") enrichmentKEGG<- string_db$get_enrichment(hits, category = "KEGG") write.csv(enrichmentGO, file = paste0("../PathwayOuts/",sub('\\.csv$','',i),"EnrichMentGO.csv"), row.names=FALSE) write.csv(enrichmentKEGG, file = paste0("../PathwayOuts/",sub('\\.csv$','',i),"EnrichMentKEGG.csv"), row.names=FALSE) # 获取功能聚类结果 clustersList = string_db$get_clusters(example1_mapped$STRING_id[1:600]) # 边界校验:聚类数不足4个时按实际数量绘制,避免下标越界 plot_cluster_count <- min(4, length(clustersList)) # 循环绘制聚类图 for(a in 1:plot_cluster_count){ png(file= paste0("../PathwayOuts/",sub('\\.csv$','',i),"Cluster",a,".png"), width = 4, height =4, units = 'in', res=600) string_db$plot_network(clustersList[[a]], payload_id=payload_id) dev.off() # 单张聚类图绘制完成立刻关闭设备 } } }
修改说明
- 所有
png()绘图语句后紧跟dev.off():R的绘图设备为独占模式,打开设备后必须主动关闭才能将缓存的图像写入磁盘、释放资源,否则后续绘图操作会直接失败。原代码将设备关闭语句放在所有循环外部,是导致第一轮迭代后脚本终止的核心原因。 - 新增聚类数量判断逻辑:不同输入文件的基因映射率存在差异,得到的功能聚类数量可能不足4个,固定遍历1-4位会触发下标越界错误,取实际聚类数和4的最小值作为遍历上限,可兼容所有输入情况。
- 原代码内层循环的文件名拼接逻辑已经正确关联了外层迭代变量
i,生成的聚类图会自动匹配当前处理的文件名前缀,这部分不需要额外修改。
内容的提问来源于stack exchange,提问作者Genetics
相关产品推荐
相关产品推荐

