2013-05-10 13 views
6

Co to jest międzyplatformowa metoda znajdowania katalogu tymczasowego systemu operacyjnego z poziomu R? Obecnie używam:Przeczytaj systemowy katalog TMP w R

dirname(tempdir()) 

Który wykonał zadanie zarówno w systemie Ubuntu, jak i Windows z poziomu interaktywnej sesji R. Jednak nie powiodło się, gdy został wywołany z wnętrza RApache. W RApache wartość tempdir() jest zawsze /tmp, więc dirname(tempdir()) jest wynikiem /, co oczywiście jest błędne. Próbowałem również:

Sys.getenv("TMP") 
Sys.getenv("TEMP") 
Sys.getenv("TMPDIR") 

jak sugeruje ?"environment variables" ale żaden z nich nie były ustawione w Ubuntu. Nie wydaje się też być ustawiony w żadnym z plików w /etc/R/*, więc nie do końca rozumiem, w jaki sposób R wykrywa tę wartość.

+0

Dlaczego 'tempdir()' zawsze zwraca '/ tmp' jest zastanawiające. Czy masz dostęp do zapisu do tego katalogu? – flodel

+0

Myślę, że rApache ustawia globalny poziom 'R_TempDir' na poziomie C w celu zaimplementowania buforowania. Zobacz https://github.com/jeffreyhorner/rapache – Jeroen

Odpowiedz

1

Zmienne środowiskowe "TMPDIR", "TMP" i "TEMP" mogą być użyte do modyfikacji wartości zwróconej przez tempdir(), jeśli zmienna C R_TempDir nie jest ustawiona (chociaż nie jestem pewien jak to się robi) . Jeśli chcesz funkcję cross-platformowa, która powróci na ścieżkę rozsądnym katalogu tmp, i nie są zainteresowani w wartości R_TempDir, można użyć coś takiego:

gettmpdir <- function() { 
    tm <- Sys.getenv(c('TMPDIR', 'TMP', 'TEMP')) 
    d <- which(file.info(tm)$isdir & file.access(tm, 2) == 0) 
    if (length(d) > 0) 
    tm[[d[1]]] 
    else if (.Platform$OS.type == 'windows') 
    Sys.getenv('R_USER') 
    else 
    '/tmp' 
} 

ta opiera się na funkcji InitTempDir w pliku src/main/sysutils.c z dystrybucji źródła R, przetłumaczone z C na R.

Powiązane problemy