我想知道,我有两条几乎相同的规则。有没有办法在 Snakemake 中将它们合并成一个规则?
rule labels:
input: lambda wildcards: get_predict_data(datadir, wildcards.dataset, wildcards.day)
output: dir / 'data' / '{dataset}' / '{day}' / 'labels.gz'
shell: "zcat {input} | cut -f1 -d '|' | gzip > {output}"
rule labels2:
input: lambda wildcards: datadir / config['test_sets'][wildcards.testset]['path']
output: dir / 'data' / '{testset}' / 'labels.gz'
shell: "zcat {input} | cut -f1 -d '|' | gzip > {output}"
我尝试过,但输出中似乎没有函数、可选通配符。
由于
rule labels
有两个通配符,而 rule label2
只有一个通配符,因此很难将它们完全合并为单个规则。但也许你可以尝试:
use rule labels as labels2 with:
input: lambda wildcards: datadir / config['test_sets'][wildcards.testset]['path']
output: dir / 'data' / '{testset}' / 'labels.gz'
这仍然会产生两个规则,但会减少一些代码重复。
或者你可以让他们有相同的通配符。虽然不是很优雅,但是很方便。
rule all:
input:
"result/20241113/dataset1/output",
"result/test/testdataset/output",
rule get_input:
output:
"result/20241113/dataset1/input",
"test/testdataset/input",
shell:
"touch {output}"
def get_label_input(wc):
if wc.day == "test":
return f"test/{wc.dataset}/input"
return f"result/{wc.day}/{wc.dataset}/input"
rule labels:
input: get_label_input
output:
"result/{day}/{dataset}/output"
shell:
"cat {input} > {output}"