提问人:Death Metal 提问时间:8/1/2023 最后编辑:aakash250798Death Metal 更新时间:8/2/2023 访问量:70
何时使用 def - Groovy Shell
when to use def - groovy shell
问:
我是 nextflow 的新手,它大量使用 groovy。我正在学习时髦来学习闭包,以便可以在 nextflow 中学习和实现。我有一小段代码,我正在尝试打印并在时髦的 shell 中执行。
f_name="MM-265-DNA-T-01-01_L003_R1_001.fastq.gz"
matcher = f_name =~ /^(MM-\w+)-DNA-(\w+)-.*_L(\d+).*$/
def (_, sample_id, sample_type, lane) = matcher[0].findAll()
当我尝试打印无法打印并给我错误
sample_type时,我尝试了以下方法来打印示例 ID,但失败了:sample_id
Unknown property: sample_id
“${sample_id}” “$sample_id”
${sample_id}
$sample_id
如果我使用,代码可以正常工作,但为什么它不适用于?
我从我的另一篇帖子中得到这个 https://bioinformatics.stackexchange.com/a/21339/862(_, sample_id, sample_type, lane) = matcher[0].findAll()
def
答:
2赞
Steve
8/1/2023
#1
您的 Groovy 代码本身没问题,但是如果将该代码移动到工作流
块中,Nextflow 将引发错误。我有时会看到这样的错误,这可能是这里的问题:
ERROR ~ Script compilation error
- file : main.nf
- cause: Variable `matcher` already defined in the process scope @ line X, column Y.
我们可以将示例简化为:
workflow {
foo = 'foooooooo'
def bar = foo
}
结果:
ERROR ~ Script compilation error
- file : main.nf
- cause: Variable `foo` already defined in the process scope @ line 5, column 15.
我认为这与 Nextflow 如何跟踪(内部)全局变量1 的使用有关。这个错误是相当出乎意料的,但至于它是否是一个错误或功能,对于Nextflow开发人员来说将是一个问题。目前尚不清楚(至少对我而言)是否应该将赋值运算符右侧的变量添加到引用变量集中。
无论如何,解决方案是首选使用关键字的局部变量:def
workflow {
def f_name = "MM-265-DNA-T-01-01_L003_R1_001.fastq.gz"
def matcher = f_name =~ /^(MM-\w+)-DNA-(\w+)-.*_L(\d+).*$/
def (_, sample_id, sample_type, lane) = matcher[0].findAll()
println(sample_id)
println(sample_type)
println(lane)
}
结果:
MM-265
T
003
评论
0赞
Death Metal
8/1/2023
嗨,@Steve,一如既往地感谢。但是,在从正则表达式捕获输出时,我能够打印,在时髦的外壳中没有并且不起作用。_, sample_id, lane, sample_type
def
1赞
Steve
8/2/2023
完全不用担心@DeathMetal。如果仍有问题,请发布无法产生预期结果的完整代码。您提供的代码将在 Groovy shell 中运行,并按预期解压缩匹配的输出。我以为我可能已经猜到了问题所在,但看起来我错了。
评论
def
def
def
shell
nextflow console