动态 Branching/Plumbling

Dynamic Branching/Plumbling

是否可以在 snakefile 中使用动态 Branching/Plumbing?

我希望执行以下操作:

A -> B -> D
or
A -> C -> D

取决于配置变量是否为真。

例如:

*(rules.B if config["deblur"] == True else rules.B),

在此实例中,它同时运行规则 B 和 C。

我试过了

if config["deblur"] == True:
    rules.B,
else:
    rules.C,

但这给了我一个语法错误。

下一条规则输入如下。

    input:
        qiime_feature_table_input = rules.qiime_deblur.output.qiime_deblur_table if config["deblur"] == "True" else rules.qiime_denoise.output.qiime_denoise_table

感谢您的帮助!

不确定这是否适用于您的情况,但一种选择是让这两个规则生成相同的文件(它可能是一个虚拟文件),但一次只定义一个带有条件的规则。这是一个粗略的伪代码:

config_var = True

rule all:
    input: 'test.txt'

if config_var:
    rule B:
         output: 'test.txt'
else:
    rule C:
         output: 'test.txt'

由于配置变量的值在 运行时间之前已知,因此在这种情况下不需要动态修改 DAG。这是一个简单的蛇文件,如果 config_var 为真,它将 运行 规则 a -> b -> d,如果 config_var 为假,则规则 a -> c -> d

config_var = True

rule all:
    input:
        "d/out.txt",

rule a:
    output:
        "a/a.txt",
    shell:
        """
        echo 'a' > '{output}'
        """

rule b:
    input:
        rules.a.output,
    output:
        "b/b.txt",
    shell:
        """
        echo 'b' > '{output}'
        """

rule c:
    input:
        rules.a.output,
    output:
        "c/c.txt",
    shell:
        """
        echo 'c' > '{output}'
        """

rule d:
    input:
        rules.b.output if config_var else rules.c.output,
    output:
        "d/out.txt",
    shell:
        """
        cat '{input}' > '{output}'
        """