Snakemake 输出中的不同路径

问题描述 投票:0回答:1

我想知道,我有两条几乎相同的规则。有没有办法在 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}"

我尝试过,但输出中似乎没有函数、可选通配符。

snakemake
1个回答
0
投票

由于

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}"
© www.soinside.com 2019 - 2024. All rights reserved.