Snakemake如何实现部分通配符配对、其余全展开?
解决Snakemake中部分变量配对、部分笛卡尔积的问题
可以实现你要的效果,问题出在当前的expand用法错误地将outputdir也纳入了配对范围。要让BASES和CONTRASTS严格配对,同时每个配对与ALLOUTPUTS中的所有目录做笛卡尔积,只需调整expand的参数顺序:
ruleAll: input: expand( os.path.join("{outputdir}", "{bse}-{contrast}_comparison.bed"), outputdir=ALLOUTPUTS, zip, bse=BASES, contrast=CONTRASTS )
原理说明
outputdir=ALLOUTPUTS单独放在前面,不参与配对,会与后面的配对组合做笛卡尔积;zip, bse=BASES, contrast=CONTRASTS指定仅bse和contrast按位置一一配对,生成(A,1)、(B,2)、(C,3)三组组合;- 最终每个
outputdir都会与这三组配对结合,生成你期望的6个文件路径。
另一种等价写法是先预定义配对组合,再做笛卡尔积:
# 先提前生成BASES与CONTRASTS的配对元组 PAIRS = list(zip(BASES, CONTRASTS)) ruleAll: input: expand( os.path.join("{outputdir}", "{bse}-{contrast}_comparison.bed"), outputdir=ALLOUTPUTS, bse=[pair[0] for pair in PAIRS], contrast=[pair[1] for pair in PAIRS] )
这两种写法都能生成你需要的文件路径:
outs1/A-1_comparison.bed outs1/B-2_comparison.bed outs1/C-3_comparison.bed outs2/A-1_comparison.bed outs2/B-2_comparison.bed outs2/C-3_comparison.bed
内容的提问来源于stack exchange,提问作者Al Bro
相关产品推荐
相关产品推荐

