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

Nextflow跨脚本传递reads变量至process失败求助

问题分析与解决方案

你遇到的No such variable: fqpairs_ch错误,根源是被包含的脚本无法直接访问主脚本的变量。fastp.nf里的process硬编码了输入来源from fqpairs_ch,但这个channel是在主脚本script1.nf中定义的,Nextflow不允许跨脚本直接引用外部变量。下面是分步修正方案和关键概念解释:


1. 修正fastp.nf的Process定义

移除input块里的from fqpairs_ch,改为仅定义输入结构;同时规范输出定义、脚本路径和日志标记:

params.outdir = "./results"

process fastp() {
    // 用样本名标记日志,方便追踪不同样本的任务
    tag "$sample_id"

    input:
    // 定义输入结构:tuple包含样本名(值类型,不落地)和配对文件列表(文件类型)
    tuple val(sample_id), file(reads)

    output:
    // 输出修剪后的文件,发布到指定目录
    path "fastp_trimmed/*" into fastp_out_ch
    // 可选:输出样本名,供后续流程使用
    val(sample_id) into sample_id_ch

    script:
    """
    mkdir -p fastp_trimmed

    fastp \\
        --correction \\
        --cut_tail \\
        --disable_trim_poly_g \\
        --length_required 50 \\
        --qualified_quality_phred 20 \\
        --thread 12 \\
        --trim_poly_x \\
        --unqualified_percent_limit 20 \\
        -i ${reads[0]} -I ${reads[1]} \\
        -o fastp_trimmed/${sample_id}_R1_trimmed.fastq.gz \\
        -O fastp_trimmed/${sample_id}_R2_trimmed.fastq.gz
    """
}

2. 修正主脚本script1.nf的工作流调用

在workflow中直接将主脚本的channel传入fastp流程,无需在process内部指定来源:

params.outdir = 'results'
params.reads_dir = "/Users/name/Downloads/tiny/normal/"
params.reads_pattern = "*_R{1,2}_xxx.fastq.gz"

// 打印参数确认路径正确性
println "Reads pattern: ${params.reads_dir}${params.reads_pattern}"

// 创建配对reads的channel:每个元素是(样本名, [R1文件, R2文件])
fqpairs_ch = channel.fromFilePairs("${params.reads_dir}${params.reads_pattern}", checkIfExists: true)
// 查看channel内容,确认配对是否正确
fqpairs_ch.view()

// 包含fastp流程
include { fastp } from '/Users/name/Documents/name/nextflow_scripts/fastp.nf'

process check {
    output: 
    stdout

    script:
    """
    echo "hello from command line"
    """
}

workflow {
    // 测试流程(正常运行)
    check().view()

    // 将配对reads的channel传入fastp流程
    fastp(fqpairs_ch)

    // 查看fastp的输出结果
    fastp.out.fastp_out_ch.view()
    fastp.out.sample_id_ch.view()
}

关键概念解释

val() vs file()

  • val(sample_id):值类型输入,仅传递字符串/数字等数据,不会将其当作文件拷贝到工作目录,这里用来传递样本名。
  • file(reads):文件类型输入,Nextflow会自动将指定文件拷贝到当前process的工作目录,脚本中可直接用变量名引用。fromFilePairs生成的channel每个元素是[样本名, [R1文件, R2文件]],因此reads是包含两个文件的列表。

tag

tag "$sample_id"会给每个process实例添加标签,运行日志中会显示该标签(如[sample1]),方便区分不同样本的任务,快速定位问题。

流程间变量传递

被包含的process(如fastp)不能直接访问主脚本的变量,必须通过workflow调用时传入(如fastp(fqpairs_ch))。process的input块仅定义输入结构,来源由workflow传入的channel决定。

fromFilePairs

自动根据配对模式(如*_R{1,2}_xxx.fastq.gz)将R1、R2文件配对,每个配对生成一个tuple:第一个元素是自动提取的样本名(去掉_R1/_R2后缀),第二个元素是包含两个文件的列表。


内容的提问来源于stack exchange,提问作者Death Metal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:40:36