非DSL2模式下Nextflow实现类似dplyr unnest的通道嵌套列表展开方法
Nextflow DSL1 嵌套列表通道展开方案
你需要的展开操作可以直接用flatMap通道操作符实现,该方案原生兼容DSL1,无需开启DSL2特性,完整实现代码如下:
// 原始数据和通道定义 data = [ [1, 'a', ['a1', 'a2']], [2, 'b', ['b1', 'b2', 'b3']], [3, 'c', ['c1']] ] ch = Channel.from(data) // 核心展开逻辑 ch_unnested = ch.flatMap { id, name, value_list -> // 遍历嵌套列表,每个元素与前两个固定字段拼接为新元组 value_list.collect { item -> [id, name, item] } } // 测试输出验证结果 ch_unnested.view()
逻辑说明
flatMap是Nextflow通道内置操作符,会对每个输入元素执行自定义逻辑后,自动将返回的列表拆分为独立的通道元素- 对每个输入的三元组,我们先通过
collect方法遍历第三个位置的嵌套列表,把每个子元素和前两个固定字段拼接为新的三元组,返回一个包含所有新元组的列表 - 最终得到的
ch_unnested就是包含6条记录的目标通道,输出完全符合预期格式
替代写法(map + flatten 两步实现)
如果更习惯分步处理,也可以用map加flatten组合实现,效果完全一致:
ch_unnested = ch .map { id, name, value_list -> value_list.collect { [id, name, it] } } .flatten()
边界处理说明
如果你的数据中可能存在第三个字段为空、或者不是列表的情况,可以增加判断逻辑避免运行报错,示例:
ch_unnested = ch.flatMap { id, name, value_list -> // 校验第三个字段是列表,非列表/空值时返回空列表跳过该元素 (value_list instanceof List ? value_list : []).collect { [id, name, it] } }
内容的提问来源于stack exchange,提问作者meow
相关产品推荐
相关产品推荐

