我无法获取进程内完成的计算结果来确定在 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 值可重用的努力都产生了类似的错误消息。
问题在于,会评估
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
}
这样,任务和通道都会在启动之前初始化,但其中一个启动次数为零。