5

tempdir()R セッションの開始後に場所を変更する方法を探しています。C レベルのグローバル変数を更新する必要があると思いますR_TempDir。R内からこれを行う良い方法は何でしょうか?

4

5 に答える 5

7

更新: 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;
}
于 2013-06-25T18:45:22.067 に答える
4

非常に安っぽいですが、次のようにマスクbase::tempdirすることができます

tempdir <- function() { "[desired temp dir here]" }

次に、グローバル環境の前にベース名前空間を (暗黙的または明示的に) 参照するコードを使用していない限り、問題ありません...

初期化時に設定され、その後変更されないため、これを行う他の方法は本当にありません。つまり、Sys.setenv(TMPDIR="/home/bolker/R")うまくいきません。手遅れです (おそらくご存じのとおり)。

ハードコード化されていなけれtempdir()ば、はるかに簡単になります...ここでの設計基準はよくわかりません(または、慎重に考え抜かれた設計基準があったかどうか...)。(私は同様に のハードコーディング/設計について不機嫌に感じ.libPaths()ます...実行中の R セッションに入ると、変更する方法はありません。)

于 2012-04-25T20:35:25.017 に答える
4

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 を処理する必要があることにも言及する価値があります。

于 2016-10-13T09:09:10.287 に答える
1

このtempdir()関数は、一時ディレクトリを作成して、最後のセッションで有効なファイルを保存できる便利な方法です。セッションの開始時に作成された一時ディレクトリを返します。デフォルトでは、によって作成された新しい一時ファイルtempfile()が保存されます。

ただし、作業ディレクトリとは関係ありません。作業ディレクトリを変更する場合は、コマンドを使用する必要がありますsetwd()

一時ファイルが保存されるディレクトリを変更する場合は、これをコマンドのパラメーターとして設定する必要があります。

tempfile(tmpdir="/my/path/to/tmpfile")
于 2012-04-25T20:09:51.660 に答える