将流程内的结果传递到 nextflow 中的条件工作流程

问题描述 投票:0回答:1

我无法获取进程内完成的计算结果来确定在 nextflow 管道中执行哪些下游进程。下面的例子概括了我想要做得相当好的事情,尽管我当然愿意接受能够实现类似结果的替代策略。

在此示例中,有多个文件通过第一个进程“检查”运行,所有文件的行长度都不同。超过 100 行的文件被视为“长”。本质上,我希望能够根据该过程的结果来改变管道的进程。

#!/usr/bin/env nextflow
nextflow.enable.dsl=2

process check {
    input:
    path(file)

    output:
    env long_files

    script:
    """
    lines=\$(cat $file | wc -l)

    if [ \${lines} < 100 ]
    then
        long_files=0
    else
        long_files=1
    fi
    """
}

workflow {
    
    check(file)

    check
        .out
        .long_files
        .toInteger()
        .sum()
        .set { ch_number_long_files }

    if ( ch_number_long_files == 0 ) {
        println "There are zero long files!"
    } 
    else if ( ch_number_long_files > 0 ) {
        println "There are some long files!"
    }
    else {
        println "Counting long files failed!"
    }

}

当我运行实际管道时,出现以下错误,引用带有“else if”语句的行:

无法将 groovyx.gpars.dataflow.DataflowVariable 与值“DataflowVariable(value=null)”进行比较以及 java.lang.Integer 与值“0”

提前感谢您对此的任何帮助或提示!我特别困惑的是,第一个“if”语句如何正确评估,但不知何故,通过“else if”,ch_number_long_files似乎变成了空。

编辑:我的猜测是我实际上没有带有 ch_number_long_files 的值通道,因此它被消耗,但我强制 0 或 1 值可重用的努力都产生了类似的错误消息。

groovy nextflow
1个回答
0
投票

问题在于,会评估

if... else if... else
语句来决定在管道启动之前应准备哪些任务,并且 check.out
 仅在运行时可用。所以你有一个没有值的通道,默认为 null。

如果您想根据仅在运行时可用的信息调用不同的进程,请使用

channel.branch

运算符,如
Nextflow模式页面中所述。以下是从那里复制粘贴的:

workflow { ch_if = Channel.of( 1..100 ) | randomSample(1) | branch { n -> TRUE: n > 50 FALSE: n <= 50 } ch_if.TRUE | foo ch_if.FALSE | bar }
这样,任务和通道都会在启动之前初始化,但其中一个启动次数为零。

© www.soinside.com 2019 - 2024. All rights reserved.