如何调用将在 Nextflow 脚本中创建的变量的值转发到值输出通道?
How to call a forward the value of a variable created in the script in Nextflow to a value output channel?
我有一个生成值的过程。我想将这个值转发到一个值输出通道中。但我似乎无法让它一次性运行 - 我总是必须为输出生成一个文件,然后从第一个开始定义一个新通道:
process calculate{
input:
file div from json_ch.collect()
path "metadata.csv" from meta_ch
output:
file "dir/file.txt" into inter_ch
script:
"""
echo ${div} > alljsons.txt
mkdir dir
python3 $baseDir/scripts/calculate.py alljsons.txt metadata.csv dir/
"""
}
ch = inter_ch.map{file(it).text}
ch.view()
我该如何解决这个问题?
谢谢!
最佳,t.
如果您的脚本执行重要的计算,那么像您所做的那样将结果写入文件绝对没问题 - 这种方法并没有什么错。但是,由于 'inter_ch' 通道已经发出文件(或路径),您可以简单地使用:
ch = inter_ch.map { it.text }
这里的 objective 是什么并不完全清楚。如果希望减少创建的频道数量,请考虑改用新的 DSL 2。这不会让您避免将计算结果写入文件,但这可能意味着您可以避免使用中间渠道。
另一方面,如果您的 Python 脚本实际上做了一些相当微不足道的事情并且可以重构,则可以分配一个(全局)变量(在 script:
关键字下方)这样它就可以在您的输出声明中引用,例如下面示例中的 x = ...
行:
Valid output
values
are value literals, input value identifiers, variables accessible in
the process scope and value expressions. For example:
process foo {
input:
file fasta from 'dummy'
output:
val x into var_channel
val 'BB11' into str_channel
val "${fasta.baseName}.out" into exp_channel
script:
x = fasta.name
"""
cat $x > file
"""
}
除此之外,您的选择是有限的。您可能已经考虑过使用 env output qualifier,但这只是在运行时向您的 shell 脚本添加了一些语法糖,这样仍然会创建一个输出文件:
test.nf
的内容:
process test {
output:
env myval into out_ch
script:
'''
myval=$(calc.py)
'''
}
out_ch.view()
bin/calc.py
的内容 (chmod +x):
#!/usr/bin/env python
print('foobarbaz')
运行 与:
$ nextflow run test.nf
N E X T F L O W ~ version 21.04.3
Launching `test.nf` [magical_bassi] - revision: ba61633d9d
executor > local (1)
[bf/48815a] process > test [100%] 1 of 1 ✔
foobarbaz
$ cat work/bf/48815aeefecdac110ef464928f0471/.command.sh
#!/bin/bash -ue
myval=$(calc.py)
# capture process environment
set +u
echo myval=$myval > .command.env
我有一个生成值的过程。我想将这个值转发到一个值输出通道中。但我似乎无法让它一次性运行 - 我总是必须为输出生成一个文件,然后从第一个开始定义一个新通道:
process calculate{
input:
file div from json_ch.collect()
path "metadata.csv" from meta_ch
output:
file "dir/file.txt" into inter_ch
script:
"""
echo ${div} > alljsons.txt
mkdir dir
python3 $baseDir/scripts/calculate.py alljsons.txt metadata.csv dir/
"""
}
ch = inter_ch.map{file(it).text}
ch.view()
我该如何解决这个问题?
谢谢!
最佳,t.
如果您的脚本执行重要的计算,那么像您所做的那样将结果写入文件绝对没问题 - 这种方法并没有什么错。但是,由于 'inter_ch' 通道已经发出文件(或路径),您可以简单地使用:
ch = inter_ch.map { it.text }
这里的 objective 是什么并不完全清楚。如果希望减少创建的频道数量,请考虑改用新的 DSL 2。这不会让您避免将计算结果写入文件,但这可能意味着您可以避免使用中间渠道。
另一方面,如果您的 Python 脚本实际上做了一些相当微不足道的事情并且可以重构,则可以分配一个(全局)变量(在 script:
关键字下方)这样它就可以在您的输出声明中引用,例如下面示例中的 x = ...
行:
Valid output values are value literals, input value identifiers, variables accessible in the process scope and value expressions. For example:
process foo { input: file fasta from 'dummy' output: val x into var_channel val 'BB11' into str_channel val "${fasta.baseName}.out" into exp_channel script: x = fasta.name """ cat $x > file """ }
除此之外,您的选择是有限的。您可能已经考虑过使用 env output qualifier,但这只是在运行时向您的 shell 脚本添加了一些语法糖,这样仍然会创建一个输出文件:
test.nf
的内容:
process test {
output:
env myval into out_ch
script:
'''
myval=$(calc.py)
'''
}
out_ch.view()
bin/calc.py
的内容 (chmod +x):
#!/usr/bin/env python
print('foobarbaz')
运行 与:
$ nextflow run test.nf
N E X T F L O W ~ version 21.04.3
Launching `test.nf` [magical_bassi] - revision: ba61633d9d
executor > local (1)
[bf/48815a] process > test [100%] 1 of 1 ✔
foobarbaz
$ cat work/bf/48815aeefecdac110ef464928f0471/.command.sh
#!/bin/bash -ue
myval=$(calc.py)
# capture process environment
set +u
echo myval=$myval > .command.env