为了理解Snakemake,我想将传统的Makefile示例与Snakemake进行比较。有一个nice introduction page to make,其中包含先决条件的教育示例:
# source: http://www.jfranken.de/homepages/johannes/vortraege/make_inhalt.en.html
# Declaration of a variable
clothes = coat shoes mobile sweater socks\
trousers shirt pants undershirt
all: $(clothes)
# An explicit rule assigns the commands for several targets
$(clothes):
@echo put on $@; touch $@
# Implicit rules state the prerequisites
coat: shoes mobile sweater
shoes: socks trousers
mobile: trousers
sweater: shirt
trousers: pants shirt
shirt: undershirt
# Additional feature
.PHONY: naked
naked: ; @-rm $(clothes)
我尝试将其转换为Snakemake文件,请参阅本文末尾。它有效,但我必须为每篇文章重复touch
命令。我尝试通过区分显式和隐式规则(使用通配符)来复制make方法,但没有成功。有比现在更优雅的方式吗?
# Snakemake version of http://www.jfranken.de/homepages/johannes/vortraege/make_inhalt.en.html#ToC6
CLOTHES = ["coat", "shoes", "mobile", "sweater", "socks", "trousers", "shirt", "pants", "undershirt"]
rule all:
input: CLOTHES
rule coat:
input: "shoes", "mobile", "sweater"
output: "coat"
shell: "touch coat"
rule shoes:
input: "socks", "trousers"
output: "shoes"
shell: "touch shoes"
rule mobile:
input: "trousers"
output: "mobile"
shell: "touch mobile"
rule sweater:
input: "shirt"
output: "sweater"
shell: "touch sweater"
rule trousers:
input: "pants", "shirt"
output: "trousers"
shell: "touch trousers"
rule shirt:
input: "undershirt"
output: "shirt"
shell: "touch shirt"
rule undershirt:
output: "undershirt"
shell: "touch undershirt"
rule pants:
output: "pants"
shell: "touch pants"
rule socks:
output: "socks"
shell: "touch socks"
### Additional feature
rule naked:
run:
for ds in CLOTHES:
shell("rm -f {}".format(ds))
答案 0 :(得分:2)
在Snakemake中,可以使用input functions和配置文件来表示不同的依赖关系,例如:
configfile: "config.yaml"
def get_prereqs(wildcards):
"""Lookup prerequisites in config file."""
# return prereqs as list of strings
return config["clothes"][wildcards.type]
# target rule for creating all desired files
rule all:
input:
config["clothes"]
rule clothes:
input:
# refer to function that will be called with the inferred wildcards as single argument
get_prereqs
output:
# in general, rule output should be more specific than in this example
"{type}"
shell:
"touch {output}"
和config.yaml:
clothes:
coat:
- shoes
- mobile
- sweater
shoes:
- socks
- trousers
mobile:
- trousers
sweater:
- shirt
trousers:
- pants
- shirt
shirt:
- undershirt
pants: []
undershirt: []
socks: []