Aggregation
列表推导式
input
字段可以是逐一声明的文件列表:
input:
"fq/{sample}.{index}-1.fq",
"fq/{sample}.{index}-2.fq",
也可以是一个列表推导式:
input:
[f'fq/{{sample}}.{{index}}-{k}.fq' for k in [1,2]]
有几点需要注意的:
f''
语法仍然是有效的,当然''.format()
也可以。%s
形式的不支持{{...}}
表示通配符
expand 函数
对于多层的循环生成列表,Snakemake 提供了 expand
函数。例如上面的例子用 expand
表示为:
input:
expand('fq/{{sample}}.{{index}}-{k}.fq', k=[1,2])
与列表推导式类似,{}
表示格式占位符,{{}}
表示通配符。
与 Python 字符串格式化类似,{}
填充的数据可以是任意的 Python 基础数据类型。
多规则
expand
函数的第一个 位置参数 可以是单个规则,也可以是规则列表。
当指定规则列表时,expand 默认将分别处理每一个规则,然后使用 reduce 方法合并所有规则分别生成的文件列表。
expand(["{ds}-1.{ext}", "{ds}-2.{ext}"], ds=["a","b"], ext=["csv", "txt"])
上面的例子指定了两个规则,先处理第一个规则:
a-1.csv a-1.txt b-1.csv b-1.txt
再处理第二个规则:
a-2.csv a-2.txt b-2.csv b-2.txt
然后合并:
a-1.csv a-1.txt b-1.csv b-1.txt a-2.csv a-2.txt b-2.csv b-2.txt
将第二个 位置参数 设为 "zip"
可以在每次循环时同时处理所有规则,其行为与 Python 的 zip
函数类似。
expand(["{ds}-1.{ext}", "{ds}-2.{ext}"], zip, ds=["a","b"], ext=["csv", "txt"])
上面的例子,expand 将在每一次循环时生成两个路径:
- 取出
"a"
- 取出
"csv"
生成["a-1.csv", "a-2.csv"]
- 取出
"txt"
生成["a-1.txt", "a-2.txt"]
- 取出
- 取出
"b"
- 取出
"csv"
生成["b-1.csv", "b-2.csv"]
- 取出
"txt"
生成["b-1.txt", "b-2.txt"]
- 取出
最后合并:
a-1.csv a-2.csv a-1.txt a-2.txt b-1.csv b-2.csv b-1.txt b-2.txt
multiext 函数
如果只是需要通过 文件扩展名 匹配多种类型的文件,可以使用 multiext
函数:
multiext('a', '.csv', '.txt')
上述例子将生成:
a.csv a.txt
评论区