首页 > 解决方案 > 如何在snakemake中执行R

问题描述

我发现snakemake文档非常简洁。自从我被问过几次以来,我想发布这个问题和我自己的答案。

你如何在蛇形规则中执行或集成这个 R 脚本?

my-script.R

CUTOFF <- 25

dat <- read.table('input-table.txt')

out <- dat[dat$V1 > CUTOFF, ]

write.table(out, 'output-table.txt')

蛇文件:

rule one:
    input:
        txt= 'input-table.txt',
    output:
        out= 'output-table.txt',
    params:
        cutoff= 25,
    # now what?        

标签: rsnakemake

解决方案


@dariober 有一个彻底的答案。我想分享选项 1 的变体,我用来使 R 脚本的交互式开发/调试更容易一些。

模拟snakemake对象

可以包括一个序言来创建一个模拟snakemake对象,条件是脚本是否以交互方式运行。这模仿了被实例化的实际对象,使人们能够通过真实的输入逐步执行代码,但在 Snakemake 执行脚本时会被跳过。

脚本/我的脚本.R

#!/usr/bin/env Rscript

################################################################################
## Mock `snakemake` preamble
################################################################################

if (interactive()) {
  library(methods)
  Snakemake <- setClass(
    "Snakemake", 
    slots=c(
      input='list', 
      output='list', 
      params='list',
      threads='numeric'
    )
  )
  snakemake <- Snakemake(
    input=list(txt="input-table.txt"),
    output=list(out="output-table.txt"),
    params=list(cutoff=25),
    threads=1
  )
}

################################################################################

CUTOFF <- snakemake@params$cutoff

dat <- read.table(snakemake@input$txt)

out <- dat[dat$V1 > CUTOFF, ]

write.table(out, snakemake@output$out)

对象详细信息

类上的全套槽Snakemake可以在类generate_preamble代码中看到snakemake.script.Rscript。由于这可能会发生变化,因此可以使用(来自安装了 Snakemake 的 Python)检查已安装版本中的代码:

from inspect import getsource
from snakemake.script import RScript

print(getsource(RScript.generate_preamble))

推荐阅读