R:使用相对路径获取文件

时间:2012-08-21 04:26:49

标签: r

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

以下是我使用各种食谱和R论坛帖子拼凑的一段时间。它对于我的直接开发来说效果很好,但并不健全。例如,当文件通过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实施吗?

1 个答案:

答案 0 :(得分:68)

在GitHub上使用@hadley discussion之后,我意识到我的问题与R中的常见开发模式背道而驰。

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

总结:

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

  2. 要使其发挥作用,请始终在从其他目录中提取文件时设置chdir=T,例如source('lib/stats/big_stats.R', chdir=T)

  3. 为了便于以可预测的方式获取整个目录,我编写了sourceDir,它按字母顺序在目录中提供文件。

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