我是Snakemake的新手,使用Snakemake-minimal 5.4.5。我有一个类似于这样的规则。
rule make_grm:
input:
inc_snps: "path/snps_for_test_chr{chromosome}.txt",
inc_samples: "path/samples_for_test_chr{chromosome}.txt"
params:
plink_root="path/data_chr{chromosome}",
output_root="path/snpgrm_chr{chromosome}"
output:
expand("path/snpgrm_chr{chromosome}.grm.{ext}", ext=["gz", "id"])
conda:
"path/environment.yaml"
shell:
"gcta64 --bfile {params.plink_root} --make-grm-gz --keep {input.inc_samples} --extract {input.inc_snps} --out {params.output_root}"
本质上,它接收一些输入,然后通过GCTA运行它们,产生两个输出文件:一个.id文件和一个.gz文件。
如果我在这个规则中明确了所有的文件名(例如,我用染色体编号代替{chromosome}通配符),它就能完美地工作。现在我想让它可以在命令行中指定要查看的染色体,但是 snakemake 抱怨我使用了通配符。
Wildcard error in line 40 of Snakefile
Wildcards in input files cannot be determined from output files: chromosome
如果我在shell中运行这样的程序,有什么想法吗?
snakemake --use-conda path/snpgrm_chr18.grm.gz
Snakemake不能像其他规则那样推断出{染色体}=18?
(我也在SGE集群上运行了这个,但我把这些细节省略了,因为我不认为它们会涉及到这个行为,而且会增加很多混乱)
如果你想在扩展函数中使用通配符,你必须把括号加倍。
expand("path/snpgrm_chr{{chromosome}}.grm.{ext}", ext=["gz", "id"])
这里, {{chromosome}}
是一个通配符。{ext}
只是扩展函数参数的一个占位符。
我在你的代码中看到了另一个问题。
output:
expand("path/snpgrm_chr{chromosome}.grm.{ext}", ext=["gz", "id"])
在你的代码里还有一个问题: expand
函数需要填写所有参数,而 {chromosome}
不是。其实你的意思是 {chromosome}
是一个通配符。你需要把它放在双括号里。
output:
expand("path/snpgrm_chr{{chromosome}}.grm.{ext}", ext=["gz", "id"])
剩下的在我的机器上也能用