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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:21:34