能否通过主通配符关联次级通配符并合并Snakemake规则?
可行方案:用字典关联通配符并合并规则
当然可以合并成一个规则,用字典关联主通配符与次级取值列表的方案完全可行,具体实现如下:
步骤1:重构变量定义为字典
把分散的次级取值列表整合到字典中,清晰对应主选项和其取值:
opt_vals_map = { 'opt1': [0.1, 0.2], 'opt2': [0.01, 0.02] }
步骤2:合并为单个通用规则
借助Snakemake的通配符和expand功能,编写覆盖所有场景的规则:
# 触发所有需要生成的输出文件 rule all: input: expand( "{opt}/{val}/output.txt", opt=opt_vals_map.keys(), val=lambda wildcards: opt_vals_map[wildcards.opt] ) # 通用处理规则 rule process_opt: input: "{opt}/{val}/input.txt" output: "{opt}/{val}/output.txt" run: "./my-script.py --input {input} --output {output}"
关键说明
rule all通过expand结合lambda表达式,根据当前opt通配符动态拉取对应的val列表,自动生成所有需要的输出路径。process_opt规则使用{opt}和{val}两个通配符,匹配所有符合{opt}/{val}结构的输入输出,完美复用原有运行命令,无需重复编写规则。
可选:添加通配符约束(避免无效组合)
如果要防止出现opt1搭配0.01这类无效组合,可添加通配符约束:
import re wildcard_constraints: opt = '|'.join(re.escape(opt) for opt in opt_vals_map.keys()), val = lambda wildcards: '|'.join(re.escape(str(v)) for v in opt_vals_map[wildcards.opt])
内容的提问来源于stack exchange,提问作者ftcap_8989
相关产品推荐
相关产品推荐

