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()
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...