2012-04-25 3 views

답변

4

업데이트 : 사이먼 Urbanecks unixtools package이 작업을 수행 할 수있는 기능이 있습니다. 코드 밑 (나중에 참조 할 수 있도록).

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; 
} 
+0

그건 완전히 맞아! 'install.packages ('unixtools', repos = 'http://www.rforge.net/'); unixtools :: set.tempdir ("/ new/tmp/path")'트릭을했습니다. – fdetsch

1

tempdir() 함수는 임시 디렉토리를 만드는 가장 좋은 방법이므로 마지막 세션에서 유효한 파일을 저장할 수 있습니다. 세션이 시작될 때 생성 된 임시 디렉토리를 반환하며 기본적으로 tempfile()에 의해 생성 된 새 임시 파일이 저장됩니다.

그러나 작업 디렉토리와 관련이 없습니다. 작업 디렉토리를 변경하려면 setwd() 명령을 사용해야합니다.

임시 파일이 저장되는 디렉토리를 변경하려면 명령의 매개 변수로 설정해야합니다.

tempfile(tmpdir="/my/path/to/tmpfile") 
+0

나는 이것을 알고있다. 필자는 명시 적으로 tempdir() 및 tempfile()의 기본 동작을 변경하려고합니다. – Jeroen

+0

이것과 관련된 것이 있습니까? http://tolstoy.newcastle.edu.au/R/e2/devel/06/09/0025.html 일부 시스템 환경 변수를 무시할 수는 있지만'tempdir()'리턴을 수정하지 않는 것 같습니다. –

1

그것은 지독 치즈,하지만 당신은 당신이 (암시 적 또는 명시 적으로) 즉,에 보였다 코드를 사용하지 않은 그런 다음 당신이만큼 OK 것

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

을 말함으로써 base::tempdir 마스크 수 기본 환경의 네임 스페이스 ...

초기화 시간에 설정되고 이후에 변경되지 않으므로이 작업을 수행하는 다른 방법은 실제로 표시되지 않습니다. 즉, Sys.setenv(TMPDIR="/home/bolker/R")이 작동하지 않습니다. 너무 늦었습니다 (아시다시피).

tempdir() 덜 하드 코딩 된 경우 ... 여기서는 디자인 기준을 이해하지 못합니다. (또는 덜 신중하게 설계 기준이 신중하게 고려되었는지 여부는 ...). (비슷한 코드 인 .libPaths()의 하드 코딩/디자인에 대해서도 심술 궂은 느낌이 들었습니다. 실행중인 R 세션에있는 경우 변경하는 방법은 없습니다.)

+0

이것은 작동하지 않습니다. tempdir을 호출하는 대부분의 함수는 실제로 기본 패키지 내부에 있습니다. C 레벨을 세계적으로 수정하는 것이 필요합니다. – Jeroen

+0

ps : .libPaths()는 실제로 하드 코드되지 않습니다. 다음은 코드를 설정하는 코드입니다. http://pastebin.com/E2sVKr30 – Jeroen

+1

나는 그렇게 생각하지 않습니다. 나는 R이 이것을 한 번 '상수'로 취급한다고 생각한다. –

3

tempdir()의 잠금을 해제하고 baseenv() 새로운 기능은 작동 될 수 있습니다

tempdir <- function() "/NewTempDir" 
unlockBinding("tempdir", baseenv()) 
assignInNamespace("tempdir", tempdir, ns="base", envir=baseenv()) 
assign("tempdir", tempdir, baseenv()) 
lockBinding("tempdir", baseenv()) 
3

2016 년은 여전히 ​​내 취향과 사용 사례에 대한 좋은 대답을 보지 못했어요. 나는 같은 문제에 직면하고 다음과 같은 솔루션이보기의 사용자 관점에서 가장 깨끗한입니다 발견

mkdir rtmp; TMPDIR=$PWD/rtmp Rscript test.R; rm -rf rtmp 

또는 실행시 :

# test.R content 
message(tempdir()) 

지금 스크립트 실행시 루트 TEMPDIR 변경 표현 :

mkdir rtmp; TMPDIR=$PWD/rtmp R -e 'tempdir()'; rm -rf rtmp 

임시 파일을위한 공간을 많이 사용하는 스크립트/패키지를 작성하는 프로그래머가 워싱턴 TMPDIR 처리해야한다는 언급도 가치가있다 y @ João Daniel이 언급했다.

+0

2017 년, 완벽하게 작동하므로 다른 패키지를 설치하지 않으므로이 솔루션을 사용하고 thantks를 작동합니다. – HanniBaL90