【问题标题】:How to call a forward the value of a variable created in the script in Nextflow to a value output channel?如何将在 Nextflow 中的脚本中创建的变量的值调用转发到值输出通道?
【发布时间】:2022-01-13 08:36:00
【问题描述】:

我有产生价值的过程。我想将此值转发到值输出通道。但我似乎无法让它在一次“开始”中工作 - 我总是必须为输出生成一个文件,然后从第一个开始定义一个新通道:

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。

【问题讨论】:

    标签: groovy nextflow


    【解决方案1】:

    如果您的脚本执行非平凡的计算,则像您所做的那样将结果写入文件绝对没问题 - 这种方法并没有什么问题。但是,由于“inter_ch”通道已经发出文件(或路径),您可以简单地使用:

    ch = inter_ch.map { it.text }
    

    这里的目标并不完全清楚。如果希望减少创建的频道数量,请考虑改用新的DSL 2。这不会让您避免将计算结果写入文件,但可能意味着您可以避免中间通道。

    另一方面,如果您的 Python 脚本实际上做了一些相当微不足道的事情并且可以重构掉,则可以分配一个(全局)变量(在 script: 关键字下方),以便可以在您的输出声明,如下例中的x = ... 行:

    有效output values 是值文字、输入值标识符、可在 过程范围和值表达式。例如:

    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
    

    【讨论】:

    • 非常感谢您的详尽回答!我的管道有效 - 但我这样做的方式感觉非常非最佳实践 -> 因此问题。谢谢 - 我会玩 env 输出限定符!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2021-10-15
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多