在 Snakemake 中有一个简单的方法可以使用lambda
Python 的函数来做到这一点。
首先,您应该创建一个文件的字典,文件名作为键,文件的路径作为值,如下所示:
files = {'filesA' : 'path/to/fileA.ext', 'filesB' : 'path/to/fileB.ext'}
这个字典可以在蛇文件或配置文件中。我建议把它放在配置文件中并像这样调用它config['dict_name']
lambda
所以现在让我们使用函数编写您的规则:
rule all :
input :
#If you want to create in a different directory use this,
#but it has to be like output from rule one.
#expand('{directory}{filename}{extension}',
#directory = 'path/to/newdir',
#filename = config['dictname'].keys(),
#extension = '.out')
#Otherwise
expand('{filename}{extension}',
filename = config['dictname'].keys(),
extension = '.out')
rule one:
input: lambda wildcards: config['dictname'][wildcards.input]
output: "{input}" + ".out"
message: "Executing one using {input}"
shell: "touch {input}.out"
在代码中,您有两条规则,all
将执行第一个调用的规则。因此,当您启动时,snakemake
它会想要获取与expand
函数创建的列表相对应的文件列表。
Snakemake 将查看规则是否生成该文件列表,如果不是,它将在目录中搜索它们。如您所见,您可以使用expand
目录、文件名、后缀、前缀、扩展名...
在这个例子中,Snakemake 想要一些文件的文件名是键字典和扩展名.out
。该规则one
是生产它们的完美规则。
该规则的one
工作方式如下:对于字典的每个键,将执行该规则。输入部分的 lambda 函数扮演了这个角色。为了记录,可以随意调用通配符input
只是一个例子。
为了更优雅,您可以将 lambda 函数的内容放入一个变量中,如下所示:
_input_One = lambda wildcards: config['dictname'][wildcards.input]
然后像这样编写规则一输入:
input: _input_One
有关更多信息,请查看https://snakemake.readthedocs.io/en/stable/上的文档
雨果