6

我正在尝试首先为 LETTERS x NUMS 组合生成 4 个文件,然后对 NUMS 进行汇总以获得 LETTERS 中的每个元素一个文件:

LETTERS = ["A", "B"]
NUMS = ["1", "2"]


rule all:
    input:
        expand("combined_{letter}.txt", letter=LETTERS)

rule generate_text:
    output:
        "text_{letter}_{num}.txt"
    shell:
        """
        echo "test" > {output}
        """

rule combine text:
    input:
        expand("text_{letter}_{num}.txt", num=NUMS)
    output:
        "combined_{letter}.txt"
    shell:
        """
        cat {input} > {output}
        """

执行此蛇文件会导致以下错误:

WildcardError in line 19 of /tmp/Snakefile:
No values given for wildcard 'letter'.
  File "/tmp/Snakefile", line 19, in <module>

似乎部分expand是不可能的。它是一个限制expand吗?如果是这样,我应该如何规避它?

4

3 回答 3

7

更新(2020 年 11 月 25 日):根据这个答案allow_missing由于expand.


看来这不是 的限制expand,而是我对 python 中字符串格式化工作方式的熟悉程度的限制。我需要为非扩展通配符使用双括号:

LETTERS = ["A", "B"]
NUMS = ["1", "2"]


rule all:
    input:
        expand("combined_{letter}.txt", letter=LETTERS)

rule generate_text:
    output:
        "text_{letter}_{num}.txt"
    shell:
        """
        echo "test" > {output}
        """

rule combine text:
    input:
        expand("text_{{letter}}_{num}.txt", num=NUMS)
    output:
        "combined_{letter}.txt"
    shell:
        """
        cat {input} > {output}
        """

现在执行此蛇文件会生成预期的以下文件:

text_A_2.txt
text_A_1.txt
text_B_2.txt
text_B_1.txt
combined_A.txt
combined_B.txt
于 2016-11-03T09:44:52.690 回答
5

可以使用 进行部分扩展allow_missing=True

例如:

expand("text_{letter}_{num}.txt", num=[1, 2], allow_missing=True)

> ["text_{letter}_1.txt", "text_{letter}_2.txt"]
于 2020-11-25T10:10:14.707 回答
3

事实上,当你想在expand. 它依赖于str.format,因此也format适用于任何规则expand

于 2016-11-07T09:51:28.327 回答