假设我有一个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在执行过程中自动安装/更新自定义库?
1条答案
按热度按时间czfnxgou1#
有几个问题使得这个问题变得重要,其中之一是R解析所有相对于当前工作目录的文件路径。* 源文件依赖项除外 *。
source
基本上不支持解析相对于当前执行文件的另一个源文件的路径,并且核心R没有很好的方法来解决这个限制。但是,如果你使用‘box’ modules,这就可以了。
在你的特殊情况下,你会改变路线
到
(
box::use
用于声明导入;它的逗号分隔参数是包或模块规范,[...]
表示“附加模块的所有导出名称”,这与source
的作用大致相同。)要将
lib/farenheit_to_celcius.R
变成一个模块,你需要在函数上面添加一个导出声明: