Nextflow如何从列表变量动态输出对应数量的文件?
解决Nextflow流程动态输出文件列表的问题
你的报错核心原因是:Nextflow的output块无法直接引用script块内部定义的变量——此时output里的filtered_fastqlist被当作字符串字面量,而非你在script中生成的Groovy列表。以下是两种无需通配符的解决方案:
方案一:将变量提升至Process级别定义
把输出路径列表的定义放在script块之外(Process作用域内),让output块可以直接访问该变量:
process filtering { input: tuple val(acc), path(fastqlist) // 在Process级别定义输出路径列表,output可直接引用 def filtered_fastqlist = fastqlist.size() == 2 ? ["fastp_${fastqlist[0]}", "fastp_${fastqlist[1]}"] : ["fastp_${fastqlist[0]}"] output: tuple val(acc), path(filtered_fastqlist) script: // 用join避免单文件场景下的索引越界问题 """ touch ${filtered_fastqlist.join(' ')} """ }
方案二:在Output块中直接生成动态路径
无需单独定义变量,直接在output块中通过Groovy的collect方法遍历输入列表,生成对应的输出路径:
process filtering { input: tuple val(acc), path(fastqlist) output: // 动态生成输出路径列表 tuple val(acc), path( fastqlist.collect { "fastp_${it}" } ) script: // 用join处理任意数量的输入文件 """ touch ${fastqlist.collect { "fastp_${it}" }.join(' ')} """ }
两种方案都能让Nextflow正确识别动态生成的输出文件列表,同时修复了原代码中单个文件时touch ${filtered_fastqlist[1]}会触发的索引越界问题。
内容的提问来源于stack exchange,提问作者Jorge Kageyama
相关产品推荐
相关产品推荐

