如何引用snakemake规则的params部分中的输入?

Cor*_*mer 2 python snakemake

我需要处理输入文件值,将它们转换为逗号分隔的字符串(而不是空格),以便将它们传递给 CLI 程序。为此,我想通过 Python 函数运行输入文件。如何在同一规则的 params 部分引用该规则的输入文件?

这是我尝试过的,但它不起作用:

rule a:
    input:
        foo="a.txt",
        bar=expand({build}.txt,build=config["build"]),
    output:
        baz=result.txt,
    params:
        joined_bar=lambda w: ",".join(input.bar),  # this doesn't work
    shell:
        """
        qux --comma-separated-files {params.joined_bar} \
            --foo {input.foo} \
            >{output.baz}
        """
Run Code Online (Sandbox Code Playgroud)

它失败了:

InputFunctionException:
   AttributeError: 'builtin_function_or_method' object has no attribute 'bar'
Run Code Online (Sandbox Code Playgroud)

潜在相关但(过于)复杂的问题:
如何使用扩展输入定义 Snakemake 规则的参数
Is Snakemake params 函数在输入文件存在之前评估?

Cor*_*mer 6

事实证明我需要明确添加input到该lambda w:部分:

rule a:
    input:
        foo="a.txt",
        bar=expand({build}.txt,build=config["build"]),
    output:
        baz=result.txt,
    params:
        joined_bar=lambda w, input: ",".join(input.bar),  # ', input' was added
    shell:
        """
        qux --comma-separated-files {params.joined_bar} \
            --foo {input.foo} \
            >{output.baz}
        """
Run Code Online (Sandbox Code Playgroud)

有趣的是,我发现需要inputlambda w, input. 在我的测试中,lambda w, i没有工作。

另一种方法是以标准方式引用规则输入rules.a.input.bar::

rule a:
    input:
        foo="a.txt",
        bar=expand({build}.txt,build=config["build"]),
    output:
        baz=result.txt,
    params:
        joined_bar=lambda w: ",".join(rules.a.input.bar),  # 'rules.a.' was added
    shell:
        """
        qux --comma-separated-files {params.joined_bar} \
            --foo {input.foo} \
            >{output.baz}
        """
Run Code Online (Sandbox Code Playgroud)

另请参阅http://biolearnr.blogspot.com/2017/11/snakemake-using-inputoutput-values-in.html进行讨论。