将可选的输入文件全部放入 Snakemake 中
Put optional input files for rule all in Snakemake
在我的 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"
但它不起作用:
如果在规则定义中(Snakefile,第 58 行)
,则意外关键字第 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 [],
输入只是文件列表。您可以在规则定义之外定义它们:
deg_files = []
if config["DEG"]["exec"]:
deg_files.append("DEG/DEG.txt")
dtu_files = []
if config["DTU"]["exec"]:
dtu_files.append("DTU/DTU.txt")
rule all:
input:
deg_files,
dtu_files,
在我的 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"
但它不起作用: 如果在规则定义中(Snakefile,第 58 行)
,则意外关键字第 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 [],
输入只是文件列表。您可以在规则定义之外定义它们:
deg_files = []
if config["DEG"]["exec"]:
deg_files.append("DEG/DEG.txt")
dtu_files = []
if config["DTU"]["exec"]:
dtu_files.append("DTU/DTU.txt")
rule all:
input:
deg_files,
dtu_files,