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
,会将工作目录更改为源文件的目录。
综上所述:
-
假定
source
始终是相对的,因为source
文件的工作目录被设置为文件所在的目录。 -
为了使这个工作,总是设置
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) }