到目前为止,我已经使用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做到这一点?
答案 0 :(得分:1)
如果我理解正确,下面的代码应该更简单,因为它用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}")
答案 1 :(得分:0)
通过使用名为“ wcs”的函数作为输入(请参见here),我得到了一个有效的版本,我使用了run
而不是shell
。在run
部分中,我可以先定义一个变量,然后再使用shell(...)
执行结果。
我也可以直接在lambda函数中使用glob
,而不用topics
来引用文件。
如果有更多经验的人看到此内容,请告诉我这是否是“正确”的方法。
from glob import glob
topics=["soccer", "football"]
params=[1, 2]
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:
"echo plot.py {input} {output}"
rule combined_plot:
input:
lambda wcs: glob("data_p={param}_*.csv".format(**wcs))
output:
"combined_p={param}_plot.png"
run:
inputs=" ".join(["--input " + inp for inp in input])
shell("echo plot2.py {inputs}")