如何解决nextflow (groovy) 检查频道列表中的项目
我很难在 containsAll()
语句中使用 if/else。使用 true
测试时,它返回正确的 false
println()
值,但是当放入 if
语句时,它似乎总是评估为真 - 见下文。
def examine_phenotype(pheno){
condition_values = \
Channel
.fromPath(pheno)
.splitCsv(header: true,sep: ',')
.map{ row ->
def condition = row.condition
return condition
}
.toList().view()
println(condition_values.containsAll('control'))
if(condition_values.containsAll('control')){
exit 1,"eval true"
}else{
exit 1,"eval false"
}
}
两个不同文件的控制台输出,一个有'control',一个没有'condition'列中的'control',这是函数的重点。
[normal,normal,tumor,tumor]
DataflowInvocationExpression(value=false)
eval true
[control,control,tumor]
DataflowInvocationExpression(value=true)
eval true
使用 collect()
而不是 toList()
,其中 condition_values
中的每个项目都用单引号括起来也不能解决问题。线索可能在 DataflowInvocationExpression
中,但我还没有跟上 Groovy 的速度,也不确定如何继续。
解决方法
在函数内测试条件不起作用,但应用 filter{}
和 ifEmpty{}
能够产生所需的检查:
ch_phenotype = Channel.empty()
if(pheno_path){
pheno_file = file(pheno_path)
ch_phenotype = examine_phenotype(pheno_file)
ch_phenotype.filter{ it =~/control/ }
.ifEmpty{ exit 1,"no control values in condition column"}
}
def examine_phenotype(pheno){
Channel
.fromPath(pheno)
.splitCsv(header: true,sep: ',')
.map{ row ->
def condition = row.condition
return condition
}
.toList()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。