动态 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}'
"""
是否可以在 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}'
"""