我正在构建一个包含三个规则的4次迭代的管道。除了可以将三个规则复制并粘贴4次并在每个规则中稍稍更改变量之外,还可以使用一个规则函数来接收需要更改的变量并返回规则吗?
我在Internet上找不到相关文档。
rule A:
input:
OUTPUT_DIR + "/XR/{pop}.pull"
output:
OUTPUT_DIR + "/XR/{pop}.nemo"
shell:"./scriptA {input} {output}"
rule B:
input:
OUTPUT_DIR + "/XR/{pop}.pull",
OUTPUT_DIR + "/XR/{pop}.nemo",
output:
OUTPUT_DIR + "/XR/{pop}.freqs"
shell:"./scriptB {input[0]} {input[1]} {output}"
rule C:
input:
OUTPUT_DIR + "/XR/{pop}.pull",
OUTPUT_DIR + "/XR/{pop}.freqs",
output:
OUTPUT_DIR + "/XR/{pop}.impute"
shell:"./scriptC {input[0]} {input[1]} {output}"
上面的代码是一个迭代。如果我想进行第二次迭代,并做一些细微的更改(例如,仅将XR
文件夹更改为XRQ
文件夹怎么办?
答案 0 :(得分:1)
如果模式中唯一需要的更改是文件夹的名称,则可以将其设为通配符:这是Snakemake中最明显和最受欢迎的方式。例如:
rule all:
input: expand(OUTPUT_DIR + "/{folder}/{pop}.impute", folder=["XR", "XRQ"], pop=["pop1", "pop2", "pop3", "pop4"])
rule A:
input:
OUTPUT_DIR + "/{folder}/{pop}.pull"
output:
OUTPUT_DIR + "/{folder}/{pop}.nemo"
shell:"./scriptA {input} {output}"
rule B:
input:
OUTPUT_DIR + "/{folder}/{pop}.pull",
OUTPUT_DIR + "/{folder}/{pop}.nemo",
output:
OUTPUT_DIR + "/{folder}/{pop}.freqs"
shell:"./scriptB {input[0]} {input[1]} {output}"
rule C:
input:
OUTPUT_DIR + "/{folder}/{pop}.pull",
OUTPUT_DIR + "/{folder}/{pop}.freqs",
output:
OUTPUT_DIR + "/{folder}/{pop}.impute"
shell:"./scriptC {input[0]} {input[1]} {output}"
无论如何,如果差异更加复杂,请提供更多详细信息并向我们显示根规则:在您提供的代码中,没有哪个规则可以解决所有通配符。