检查 nextflow 通道是否为空
check if nextflow channel is empty
我正在研究如何检查频道是否为空。
比如我有两个进程。第一个进程仅在设置 parameters/flags 的组合时运行,如果是这样,还会检查来自另一个进程的输入文件(通过通道输入)是否为空,然后它为第二个进程创建一个新的输入文件(最终替换默认的)。作为一个简化的例子:
.....
.....
// create the channel here to force nextflow to wait for the first process
_chNewInputForProcessTwo = Channel.create()
process processOne {
when:
params.conditionOne && parameters.conditionTwo
input:
file inputFile from _channelUpstreamProcess
output:
file("my.output.file") into _chNewInputForProcessTwo
script:
"""
# check if we need to produce new input for second process (i.e., input file not empty)
if [ -s ${inputFIle} ]
then
<super_command_to_generate_new_fancy_input_for_second_process> > "my.output.file"
else
echo "No need to create new input"
fi
"""
}
// and here I would like to check if new input was generated or leave the "default" one
_chInputProcessTwo = Channel.from(_chNewInputForProcessTwo).ifEmpty(Channel.value(params.defaultInputProcessTwo))
process secondProcess {
input:
file inputFile from _chInputProcessTwo
......
......
etc.
当我尝试 运行 这种方法时,它失败了,因为通道 _chNewInputForProcessTwo
包含 DataflowQueue(queue=[])
,因此实际上不是空的。
我已经尝试了几种方法来查看 google 组和 gitter 上的文档和线程。试图将其设置为空,但随后它抱怨我正在尝试使用该频道两次。放create().close()
等
有没有 clean/reasonable 方法来做到这一点?我可以使用价值通道来做到这一点,并让第一个进程在 stdout
上输出一些字符串,以供第二个进程获取和检查,但这对我来说似乎很脏。
任何 suggestions/feedback 表示赞赏。提前致谢!
马吕斯
最好避免尝试检查频道是否为空。如果您的频道 可以 为空并且您需要频道中的默认值,则可以使用 ifEmpty operator to supply one. Note that a single value is implicitly a value channel。我想你只需要:
myDefaultInputFile = file(params.defaultInputProcessTwo)
chInputProcessTwo = chNewInputForProcessTwo.ifEmpty(myDefaultInputFile)
此外,调用 Channel.create()
通常是不必要的。
我正在研究如何检查频道是否为空。
比如我有两个进程。第一个进程仅在设置 parameters/flags 的组合时运行,如果是这样,还会检查来自另一个进程的输入文件(通过通道输入)是否为空,然后它为第二个进程创建一个新的输入文件(最终替换默认的)。作为一个简化的例子:
.....
.....
// create the channel here to force nextflow to wait for the first process
_chNewInputForProcessTwo = Channel.create()
process processOne {
when:
params.conditionOne && parameters.conditionTwo
input:
file inputFile from _channelUpstreamProcess
output:
file("my.output.file") into _chNewInputForProcessTwo
script:
"""
# check if we need to produce new input for second process (i.e., input file not empty)
if [ -s ${inputFIle} ]
then
<super_command_to_generate_new_fancy_input_for_second_process> > "my.output.file"
else
echo "No need to create new input"
fi
"""
}
// and here I would like to check if new input was generated or leave the "default" one
_chInputProcessTwo = Channel.from(_chNewInputForProcessTwo).ifEmpty(Channel.value(params.defaultInputProcessTwo))
process secondProcess {
input:
file inputFile from _chInputProcessTwo
......
......
etc.
当我尝试 运行 这种方法时,它失败了,因为通道 _chNewInputForProcessTwo
包含 DataflowQueue(queue=[])
,因此实际上不是空的。
我已经尝试了几种方法来查看 google 组和 gitter 上的文档和线程。试图将其设置为空,但随后它抱怨我正在尝试使用该频道两次。放create().close()
等
有没有 clean/reasonable 方法来做到这一点?我可以使用价值通道来做到这一点,并让第一个进程在 stdout
上输出一些字符串,以供第二个进程获取和检查,但这对我来说似乎很脏。
任何 suggestions/feedback 表示赞赏。提前致谢!
马吕斯
最好避免尝试检查频道是否为空。如果您的频道 可以 为空并且您需要频道中的默认值,则可以使用 ifEmpty operator to supply one. Note that a single value is implicitly a value channel。我想你只需要:
myDefaultInputFile = file(params.defaultInputProcessTwo)
chInputProcessTwo = chNewInputForProcessTwo.ifEmpty(myDefaultInputFile)
此外,调用 Channel.create()
通常是不必要的。