2013-05-10 48 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.