我需要处理输入文件值,将它们转换为逗号分隔的字符串(而不是空格),以便将它们传递给 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 函数在输入文件存在之前评估?
事实证明我需要明确添加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)
有趣的是,我发现需要input在lambda 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进行讨论。