在 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/

10-11 03:56