我有一个蛇形管道,其中输入文件分为两组-输入我想通过整个管道(真实输入)和仅应通过前几个规则(控制输入)通过的输入。我该如何通过所有规则传递真实输入,而仅通过前几个规则传递控制输入?
最明显的解决方案是委派,即在第一组(真)上运行所有规则,然后复制粘贴要在第二组(控件)上运行的规则,并分别为它们提供第二组输入
但是,我认为这不是代码可维护性的好习惯,我更希望以某种方式使用通配符的解决方案。
下面的代码使用更少的规则简化了问题:
INPUT = [NAME1, NAME2, NAME3, CONTROL]
LABELS = [A, B, C, D]
rule all:
input:
expand("output/{input}_results.txt",
input = INPUT)
rule split_data:
'''
Read the true input and control then split them
'''
input:
"data/{input}.txt"
output:
"data/{input}/{label}.txt", label = LABELS)
script:
"scripts/split_data.py"
rule run_true_data:
'''
Read only the true split and produce results.
'''
input:
"data/{{input}}/{label}.txt", label = LABELS)
output:
"output/{input}_results.txt"
script:
"scripts/produce_results.py"
在上述理想版本中,输入通配符应仅针对 的split_data产生[NAME1,NAME2,NAME3,CONTROL]。同时run_true_data和所有人都应仅接收[NAME1,NAME2,NAME3]。
此外,应根据通配符(例如,带有lambda)生成标签,但这目前并不重要,因此,为了避免混淆,我没有将其包括在内。
答案 0 :(得分:0)
也许您需要添加更多有关该问题确切性质的详细信息。如果第二条规则只需要一组不同的输入,为什么不为此步骤添加另一个通配符,将输入限制为仅必需的条目。类似于以下脚本
INPUT = ["NAME1", "NAME2", "NAME3", "CONTROL"]
TRUE_INPUT = ["NAME1", "NAME2", "NAME3"]
LABELS = ["A", "B", "C", "D"]
rule all:
input:
expand("data/{input}/{label}.txt",
input = INPUT, label = LABELS),
expand("output/{true_input}_results.txt", true_input = TRUE_INPUT)
rule split_data:
'''
Read the true input and control then split them
'''
input:
"data/{input}.txt"
output:
"data/{input}/{label}.txt"
script:
"scripts/split_data.py"
rule run_true_data:
'''
Read only the true split and produce results.
'''
input:
lambda wildcards: ["data/{}/{}.txt".format(wildcards.true_input, label) for label in LABELS]
output:
"output/{true_input}_results.txt"
script:
"scripts/produce_results.py"
通过这种方式,您应该能够控制规则run_true_data
的标签和输入