如何使用Nextflow从R可执行文件调用不同R脚本中的函数

y53ybaqx  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(114)

假设我有一个Nextflow工作流:

#!/usr/bin/env nextflow

nextflow.enable.dsl=2

process f_to_c {
    input:
    val f
    
    output:
    stdout
    
    script:
    """
    gettemp.R $f
    """
}

workflow {
    Channel.of(80,60) | f_to_c | view
}

bin目录中的gettemp.R代码:

#!/usr/bin/env Rscript

source("lib/farenheit_to_celcius.R")

args <- commandArgs(trailingOnly=TRUE)
cat(fahrenheit_to_celsius(args[[1]]))

lib/farenheit_to_celcius.R包含:

fahrenheit_to_celsius <- function(farenheit) {
  return((as.numeric(farenheit) - 32) * 5 / 9)
}

当执行工作流时,我得到:

cannot open file 'lib/farenheit_to_celcius.R': No such file or directory

我理解为什么,因为Nextflow在每个工作目录中执行gettemp.R。但是我怎么才能在不同的R脚本中调用函数呢?看起来source不是一个好的选择,所以更好的选择可能是用函数创建我自己的库。但是,是否有可能让Nextflow在执行过程中自动安装/更新自定义库?

czfnxgou

czfnxgou1#

有几个问题使得这个问题变得重要,其中之一是R解析所有相对于当前工作目录的文件路径。* 源文件依赖项除外 *。
source基本上不支持解析相对于当前执行文件的另一个源文件的路径,并且核心R没有很好的方法来解决这个限制。
但是,如果你使用‘box’ modules,这就可以了。
在你的特殊情况下,你会改变路线

source("lib/farenheit_to_celcius.R")

box::use(lib/farenheit_to_celsius[...])

box::use用于声明导入;它的逗号分隔参数是包或模块规范,[...]表示“附加模块的所有导出名称”,这与source的作用大致相同。)
要将lib/farenheit_to_celcius.R变成一个模块,你需要在函数上面添加一个导出声明:

#' @export
fahrenheit_to_celsius <- function(farenheit) {
  return((as.numeric(farenheit) - 32) * 5 / 9)
}

相关问题