tempdir()
R セッションの開始後に場所を変更する方法を探しています。C レベルのグローバル変数を更新する必要があると思いますR_TempDir
。R内からこれを行う良い方法は何でしょうか?
5 に答える
更新: Simon Urbanecksのunixtools パッケージには、これを実現する機能があります。コードの下 (将来の参照用)。
set.tempdir <- function(path) {
invisible(.Call(C_setTempDir, path.expand(path)))
}
C コード:
#include <string.h>
#include <Rinternals.h>
#include <Rembedded.h>
SEXP C_setTempDir(SEXP sName) {
if (TYPEOF(sName) != STRSXP || LENGTH(sName) != 1)
Rf_error("invalid path");
R_TempDir = strdup(CHAR(STRING_ELT(sName, 0)));
return sName;
}
非常に安っぽいですが、次のようにマスクbase::tempdir
することができます
tempdir <- function() { "[desired temp dir here]" }
次に、グローバル環境の前にベース名前空間を (暗黙的または明示的に) 参照するコードを使用していない限り、問題ありません...
初期化時に設定され、その後変更されないため、これを行う他の方法は本当にありません。つまり、Sys.setenv(TMPDIR="/home/bolker/R")
うまくいきません。手遅れです (おそらくご存じのとおり)。
ハードコード化されていなけれtempdir()
ば、はるかに簡単になります...ここでの設計基準はよくわかりません(または、慎重に考え抜かれた設計基準があったかどうか...)。(私は同様に のハードコーディング/設計について不機嫌に感じ.libPaths()
ます...実行中の R セッションに入ると、変更する方法はありません。)
2016 年になっても、私の好みとユースケースに対する適切な答えはまだ見られていません。私は同じ問題に直面し、次の解決策がユーザーの観点から最もクリーンであることがわかりました。
# test.R content
message(tempdir())
スクリプトの実行時にルート tempdir を変更します。
mkdir rtmp; TMPDIR=$PWD/rtmp Rscript test.R; rm -rf rtmp
または式の実行時:
mkdir rtmp; TMPDIR=$PWD/rtmp R -e 'tempdir()'; rm -rf rtmp
また、一時ファイルに多くのスペースを使用するスクリプト/パッケージを作成しているプログラマーは、@João Daniel が言及した方法で tmpdir を処理する必要があることにも言及する価値があります。
このtempdir()
関数は、一時ディレクトリを作成して、最後のセッションで有効なファイルを保存できる便利な方法です。セッションの開始時に作成された一時ディレクトリを返します。デフォルトでは、によって作成された新しい一時ファイルtempfile()
が保存されます。
ただし、作業ディレクトリとは関係ありません。作業ディレクトリを変更する場合は、コマンドを使用する必要がありますsetwd()
。
一時ファイルが保存されるディレクトリを変更する場合は、これをコマンドのパラメーターとして設定する必要があります。
tempfile(tmpdir="/my/path/to/tmpfile")