How to reference input in params section of snakemake rule?

Question:

I need to process my input file values, turning them into a comma-separated string (instead of white space) in order to pass them to a CLI program. To do this, I want to run the input files through a Python function. How can I reference the input files of a rule in the params section of the same rule?

This is what I’ve tried, but it doesn’t work:

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}
        """

It fails with:

InputFunctionException:
   AttributeError: 'builtin_function_or_method' object has no attribute 'bar'

Potentially related but (over-)complicated questions:
How to define parameters for a snakemake rule with expand input
Is Snakemake params function evaluated before input file existence?

Asked By: Cornelius Roemer

||

Answers:

Turns out I need to explicitly add input to the lambda w: part:

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}
        """

Interestingly, I found that one needs to use input in the lambda w, input. In my testing, lambda w, i did not work.

And alternative is to refer to the rule input in the standard way: 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}
        """

Also see http://biolearnr.blogspot.com/2017/11/snakemake-using-inputoutput-values-in.html for a discussion.

Answered By: Cornelius Roemer
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.