在我的Snakemake项目中,我有一个config.yaml文件,该文件允许用户运行管道的某些步骤或不运行某些步骤,例如:
DEG :
exec : True
因此,在Snakefile中,我包括与DEG相关的规则:
if config["DEG"]["exec"]:
include: "rules/classic_mapping.smk"
include: "rules/counts.smk"
include: "rules/run_DESeq2.smk"
问题是,现在我想在“ all”规则中动态指定输出文件,以便Snakemake可以根据用户输入的参数知道要生成哪些文件。例如,我想到要进行以下操作:
rule all:
input:
if config["DEG"]["exec"]:
"DEG/DEG.txt"
if config["DTU"]["exec"]:
"DTU/DTU.txt"
但它不起作用:
如果在规则定义中,则Unexpected关键字的第58行出现SyntaxError(Snakefile,第58行)
我需要一个外部的观点来寻找替代方案,因为Snakemake不应该以这种方式工作
预先感谢
最佳答案
您可以使用snakemake的功能将函数作为输入并将if循环放入函数中。示例实现如下
def get_input(wildcards):
input_list = []
if config["DEG"]["exec"]:
input_list.append("DEG/DEG.txt")
if config["DTU"]["exec"]:
input_list.append("DTU/DTU.txt")
return input_list
rule all:
input:
get_input
如果需要,您可以自定义
get_input
函数以包括其他条件。 here对此进行了进一步记录。这样做的另一种替代方法如下,它的可读性差得多,不推荐使用,但在避免附加功能的情况下可以使用,它如下
rule all:
input:
lambda wildcards: "DEG/DEG.txt" if config["DEG"]["exec"] else [],
lambda wildcards: "DTU/DTU.txt" if config["DTU"]["exec"] else [],
关于python - 将可选的规则输入文件全部放入Snakemake中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57090794/