微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nextflow (groovy) 检查频道列表中的项目

如何解决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 举报,一经查实,本站将立刻删除。