首页 > 解决方案 > snakemake 规则:传递文件名之外的变量

问题描述

到目前为止,我使用snakemake 用snakemake 生成单独的图。这效果很好!不过,现在我想创建一个规则来创建跨主题的组合图,而无需将名称明确地放在图中。请参阅combined_plot下面的规则。

topics=["soccer", "football"]
params=[1, 2, 3, 4]

rule all:
  input:
    expand("plot_p={param}_{topic}.png", topic=topics, param=params),
    expand("combined_p={param}_plot.png", param=params),

rule plot:
  input:
    "data_p={param}_{topic}.csv"
  output:
    "plot_p={param}_{topic}.png"
  shell:
    "plot.py --input={input} --output={output}"

rule combined_plot:
  input:
    # all data_p={param}_{topic}.csv files
  output:
    "combined_p={param}_plot.png"
  shell:
    "plot2.py " + # one "--input=" and one "--output" for each csv file

有没有一种简单的方法可以用snakemake做到这一点?

标签: snakemake

解决方案


如果我理解正确,下面的代码应该更简单,因为它用expand函数替换了 lambda 和 glob。它将执行两个命令:

plot2.py --input=data_p=1_soccer.csv --input=data_p=1_football.csv --output combined_p=1_plot.png
plot2.py --input=data_p=2_soccer.csv --input=data_p=2_football.csv --output combined_p=2_plot.png 

topics=["soccer", "football"]
params=[1, 2]

rule all:
    input:
        expand("combined_p={param}_plot.png", param=params),

rule combined_plot:
    input:
        csv= expand("data_p={{param}}_{topic}.csv", topic= topics)
    output:
        "combined_p={param}_plot.png",
    run:
        inputs= ['--input=' + x for x in input.csv] 
        shell("plot2.py {inputs} --output {output}")

推荐阅读