从一条规则中输出多种文件类型。输入文件中的通配符不能从输出文件中确定。

问题描述 投票:0回答:2

我是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集群上运行了这个,但我把这些细节省略了,因为我不认为它们会涉及到这个行为,而且会增加很多混乱)

snakemake
2个回答
1
投票

如果你想在扩展函数中使用通配符,你必须把括号加倍。

expand("path/snpgrm_chr{{chromosome}}.grm.{ext}", ext=["gz", "id"])

这里, {{chromosome}} 是一个通配符。{ext} 只是扩展函数参数的一个占位符。


1
投票

我在你的代码中看到了另一个问题。

   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"])

剩下的在我的机器上也能用

© www.soinside.com 2019 - 2024. All rights reserved.