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