簡體   English   中英

在Snakemake中為規則all添加可選輸入文件

[英]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" 

但它不起作用:如果在規則定義中,則在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函數以包含其他條件(如果需要)。 此進一步記錄。

執行此操作的另一種方法是可讀性較低且不推薦但可以避免附加功能,應避免如下

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,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM