66

相対パスを使用したファイルのソーシングは、大規模なコードベースを処理する場合に役立ちます。他のプログラミング言語には、ソース元のファイルのディレクトリからの相対パスを使用してファイルをソースするための明確に定義されたメカニズムがあります。例は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より良い実装を知っていますか?

4

1 に答える 1

76

GitHubで@hadleyと話し合った後、私の質問はRの一般的な開発パターンに反していることに気付きました。

ソースされるRファイルでは、作業ディレクトリ()がそれらが存在するディレクトリに設定されていると想定することが多いようですgetwd()。これを機能させるために、デフォルト値が。でsourceある引数があります。に設定すると、作業ディレクトリがソース元のファイルのディレクトリに変更されます。chdirFALSETRUE

要約すれば:

  1. 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)
}
于 2012-09-02T06:54:54.393 に答える