我对大量使用 Groovy 的 nextflow 很陌生。我正在学习 groovy 来学习闭包,以便可以在 nextflow 中学习和实现。我有一小段代码,我正在尝试在 groovy 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时,它不会打印
sample_id
并给我一个错误Unknown property: sample_id
“${sample_id}”
“$sample_id”
${sample_id}
$sample_id
如果我使用
(_, sample_id, sample_type, lane) = matcher[0].findAll()
,代码可以正常工作,但为什么它不能与def
一起工作?workflow
块内,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