问题描述
我很难在 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()
}