2013-05-10 101 views
6

什麼是從R中查找OS臨時目錄的跨平臺方法?我目前使用:在R中讀取系統TMP目錄

dirname(tempdir()) 

在交互式R會話中,在Ubuntu和Windows上都做了這個工作。然而,當它從RApache內部調用時,它失敗了。在RApache中,tempdir()的值始終爲/tmp,所以dirname(tempdir())結果爲/,這顯然是錯誤的。我也試過:

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

?"environment variables"建議的,但這些都沒有在Ubuntu中設置。它似乎也沒有在/etc/R/*的任何文件中設置,所以我不太瞭解R如何檢測這個值。

+0

爲什麼'tempdir()'總是返回'/ tmp'令人費解。你有寫入訪問該目錄嗎? – flodel 2013-05-10 03:35:52

+0

我認爲rApache設置C級全局'R_TempDir'來實現一些緩存。請參閱https://github.com/jeffreyhorner/rapache – Jeroen 2013-05-10 03:52:10

回答

1

如果未設置C變量R_TempDir(儘管我不確定這是如何實現的),則可以使用環境變量「TMPDIR」,「TMP」和「TEMP」修改tempdir()返回的值, 。如果你想要一個跨平臺的功能,將返回一個合理的tmp目錄的路徑,不感興趣的R_TempDir值,你可以使用這樣的事情:

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' 
} 

這是基於功能InitTempDir在源文件src/main/sysutils.c中,從C源代碼轉換爲R.