如何为Snakemake自动生成的输出目标分配可读标签?
Snakemake规则输出冗余优化与标签分配问题
我有一个输出高度冗余的Snakemake规则(已简化):
rule redundant: output: a_x = "prefix_a_x.ext" b_x = "prefix_b_x.ext" a_y = "prefix_a_y.ext" b_y = "prefix_b_y.ext" run: process_1(output.a_x) process_2(output.a_y) process_3(output.b_x) process_4(output.b_y)
使用列表推导式可减少冗余,但会降低可读性(需通过索引访问输出,不够直观):
rule less_readable: output: [f"prefix_{a}_{b}.ext" for a in ["a", "b"] for b in ["x", "y"]] run: process_1(output[0]) process_2(output[1]) process_3(output[2]) process_4(output[3])
注:不想使用expand("prefix_{a}_{b}.ext", a=["a", "b"], b=["x", "y"]),因为输出顺序很重要,担心未来Snakemake版本会改变其顺序。
尝试用字典推导式兼顾冗余减少与可读性,却触发报错:
rule more_readable: output: {f"{a}_{b}": f"prefix_{a}_{b}.ext" for a in ["a", "b"] for b in ["x", "y"]} run: process_1(output.a_x) process_2(output.a_y) process_3(output.b_x) process_4(output.b_y)
执行命令snakemake -j 1 prefix_a_x.ext时的报错信息:
Building DAG of jobs... MissingRuleException: No rule to produce prefix_a_x.ext (if you use input functions make sure that they don't raise unexpected exceptions).
解决方法
在Snakemake 7.x版本中,不能直接在output段使用字典推导式生成带标签的输出,但可以通过**字典解包(**操作符)**实现需求,既减少冗余,又保留标签可读性和顺序可控性:
方式1:提前定义输出字典
# 预先定义带标签的输出字典,确保顺序符合预期 outputs_dict = { f"{a}_{b}": f"prefix_{a}_{b}.ext" for a in ["a", "b"] for b in ["x", "y"] } rule optimized_readable: output: **outputs_dict # 解包字典作为带标签的输出项 run: process_1(output.a_x) process_2(output.a_y) process_3(output.b_x) process_4(output.b_y)
方式2:直接在output段内解包推导式
rule optimized_readable: output: **{ f"{a}_{b}": f"prefix_{a}_{b}.ext" for a in ["a", "b"] for b in ["x", "y"] } run: process_1(output.a_x) process_2(output.a_y) process_3(output.b_x) process_4(output.b_y)
以上两种写法既能通过推导式消除冗余代码,又能像原始规则一样通过标签(如output.a_x)访问输出文件,同时Snakemake能正确识别每个输出文件对应的规则,避免MissingRuleException报错。
内容的提问来源于stack exchange,提问作者abukaj
相关产品推荐
相关产品推荐

