在 snakemake 中,您可以像这样调用外部脚本:
rule NAME:
input:
"path/to/inputfile",
"path/to/other/inputfile"
output:
"path/to/outputfile",
"path/to/another/outputfile"
script:
"path/to/script.R"
这可以方便地访问 R 脚本中名为
snakemake
的 S4 对象。现在就我而言,我在 SLURM 集群上运行 snakemake,我需要在执行 Rscript 之前使用
module load R/3.6.0
加载 R,否则作业将返回:/usr/bin/bash: Rscript: command not found
我怎么能告诉snakemake这样做呢?如果我将规则作为 shell 而不是脚本运行,不幸的是,我的 R 脚本无法访问
snakemake
对象,因此这不是理想的解决方案:shell:
"module load R/3.6.0;"
"Rscript path/to/script.R"
最佳答案
不能使用 script
标签调用 shell 命令。您绝对必须使用 shell
标签。您始终可以将输入和输出添加为参数:
rule NAME:
input:
in1="path/to/inputfile",
in2="path/to/other/inputfile"
output:
out1="path/to/outputfile",
out2="path/to/another/outputfile"
shell:
"""
module load R/3.6.0
Rscript path/to/script.R {input.in1} {input.in2} {output.out1} {output.out2}
"""
并在 R 脚本中获取您的参数:
args=commandArgs(trailingOnly=TRUE)
inFile1=args[1]
inFile2=args[2]
outFile1=args[3]
outFile2=args[4]
使用conda环境:
您可以指定用于特定规则的 conda 环境:
rule NAME:
input:
in1="path/to/inputfile",
in2="path/to/other/inputfile"
output:
out1="path/to/outputfile",
out2="path/to/another/outputfile"
conda: "r.yml"
script:
"path/to/script.R"
在你的 r.yml 文件中:
name: rEnv
channels:
- r
dependencies:
- r-base=3.6
然后当你运行snakemake时:
snakemake .... --use-conda
Snakemake 将在运行之前安装所有环境,并且每个环境都将在发送到 slurm 的作业中激活。
关于python - Snakemake - 在调用外部脚本之前加载集群模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57411801/