R:使用相对path来源文件

在处理大型代码库时,使用相对path来源文件是很有用的。 其他编程语言具有明确定义的机制,用于使用相对于源文件目录的path来源文件。 Ruby的require_relative就是一个例子。 在R中实现相对path采购的好方法是什么?

下面是我用各种食谱和R论坛post拼凑起来的。 这对我的直接发展很有效,但不够健全。 例如,当文件通过testthat库(特别是auto_test()加载时会中断。 rscript_stack()返回character(0)

 # Returns the stack of RScript files rscript_stack <- function() { Filter(Negate(is.null), lapply(sys.frames(), function(x) x$ofile)) } # Returns the current RScript file path rscript_current <- function() { stack <- rscript_stack() r <- as.character(stack[length(stack)]) first_char <- substring(r, 1, 1) if (first_char != '~' && first_char != .Platform$file.sep) { r <- file.path(getwd(), r) } r } # Sources relative to the current script source_relative <- function(relative_path, ...) { source(file.path(dirname(rscript_current()), relative_path), ...) } 

你知道更好的source_relative实现吗?

在GitHub上与@hadley 讨论之后,我意识到我的问题与R中的共同开发模式不符。

似乎在R源文件中,经常假定工作目录( getwd() )被设置为它们所在的目录。为了使这个工作, source有一个chdir参数,其默认值是FALSE 。 设置为TRUE ,会将工作目录更改为源文件的目录。

综上所述:

  1. 假定source始终是相对的,因为source文件的工作目录被设置为文件所在的目录。

  2. 为了使这个工作,总是设置chdir=T当源文件从另一个目录,例如, source('lib/stats/big_stats.R', chdir=T)

为了以一种可预测的方式方便地获取整个目录,我写了sourceDir ,它按照字母顺序在一个目录中生成文件。

 sourceDir <- function (path, pattern = "\\.[rR]$", env = NULL, chdir = TRUE) { files <- sort(dir(path, pattern, full.names = TRUE)) lapply(files, source, chdir = chdir) }