R でソースファイル中の相対パスを解決


teramonagi 氏の『実行したいファイルが保存してあるフォルダを自動で作業フォルダにしコードを実行する方法』に,作業ディレクトリを移動して相対パスを解決する方法が書かれています。メインの R コード中でディレクトリの位置が重要である場合は作業ディレクトリの移動が必要ですが,相対パスを何とかするくらいならディレクトリの移動はしなくては良いのではないかと思います。

R ではソースファイルのあるディレクトリを以下のように取得できます。

(function() {
   path <- (function() attr(body(sys.function(-1)), "srcfile"))()$filename
   dirname(path)
})()

これは,この関数が定義されたソースファイルを取得するので,関数として .Rprofile に定義するみたいなことは難しい気がします[A]。これを用いると,ソースファイルからの相対パスを絶対パスに変換することができます。例えば先述のブログ記事の例だと次で動きます[B]

require(Rcpp)

currentDirectory <- (function() {
   path <- (function() attr(body(sys.function(-1)), "srcfile"))()$filename
   dirname(path)
})()
sourceCpp(file.path(currentDirectory, "TenTimes.cpp"))
x <- 1:10
TenTimes(x)

少し長くなってしまいますが,呼び出し元から作業ディレクトリを移動しなくて済むのがメリットですね[C]

脚注

  1. 頑張れば何とかいけるのかもしれません。 []
  2. Linux でのみ確認。 Windows では確認していません。 []
  3. ソースコード中で作業ディレクトリを移動してしまった場合に元のディレクトリに移動するのはどうすれば良いのでしょうか。気になります []