snakemake - 动态分支/管道
问题描述
是否可以在蛇文件中使用动态分支/管道?
我希望执行以下操作:
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
谢谢你的帮助!
解决方案
由于配置变量的值在运行前是已知的,因此在这种情况下无需动态修改 DAG。这是一个简单的蛇文件,a -> b -> d
如果config_var
为真则运行规则,a -> c -> d
如果config_var
为假则运行规则:
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}'
"""
推荐阅读
- c# - 为什么将 DateTime 传递给新的控制器方法时 TimeOfDay 属性会被截断?
- javascript - 如何使用 JavaScript 分隔数组以进行样式设置
- angular6 - 从一个组件导航到另一个组件,而无需在 Angular 6 中重新加载这两个组件
- ros - 是否可以从 ROS2 (Crystal) 中的不同包启动多个节点?
- python - 在 python 中使用 bs4 从网站的不同链接中获取律师详细信息
- laravel - 使用 SHA512 散列
- python - 我在使用 Selenium 制作类似 Instagram 的机器人时遇到问题
- angular - Angular 的十进制管道可以显示 4 个不带逗号的整数吗?
- android - Facebook 和 Telegram 等应用程序如何在“设置”中的“清除数据”中保留用户数据?
- asp.net - UPDATE 语句中的语法错误。代码有什么问题?