使用带有自定义临时目录的install.packages

时间:2013-07-24 17:53:16

标签: r cran devtools

我想安装一个包含安全配置文件的软件包,该安全配置文件无权访问/tmp,但有自己的临时目录,例如/tmp/jeroen。但是,即使我尝试传递TMPDIR环境变量,它仍然会失败,因为它尝试使用/tmp。在使用RAppArmorunixtools的玩具示例下方(有关测试资料,请参阅here

> library(RAppArmor)
> library(unixtools)

> dir.create("/tmp/jeroen")
> set.tempdir("/tmp/jeroen")
> setwd(tempdir());

> aa_change_profile("r-test")
Switching profiles...

> print(tempdir());
[1] "/tmp/jeroen"

> install.packages("plyr", lib="/tmp/jeroen", configure.vars="TMPDIR=/tmp/jeroen")
trying URL 'http://cran.rstudio.com/src/contrib/plyr_1.8.tar.gz'
Content type 'application/x-gzip' length 384462 bytes (375 Kb)
opened URL
==================================================
downloaded 375 Kb

Fatal error: cannot create 'R_TempDir'

The downloaded source packages are in
    ‘/tmp/jeroen/downloaded_packages’

查看kern.log文件(记录安全消息)时,问题是R CMD INSTALL仍然试图使用被拒绝的/tmp

Jul 24 19:41:34 Jeroen-Antec kernel: [16270.696805] type=1400 audit(1374687694.097:599):
apparmor="DENIED" operation="mkdir" parent=5798 profile="r-test" name="/tmp/RtmpcUOJuQ/"
pid=5802 comm="R" requested_mask="c" denied_mask="c" fsuid=1000 ouid=1000

我有什么方法可以告诉R CMD INSTALL使用/tmp/jeroen吗?

2 个答案:

答案 0 :(得分:2)

@hadley在评论中给出了正确答案:为了确保install.packages使用自定义临时目录,需要做

Sys.setenv(TMPDIR="/tmp/jeroen")

除了:

configure.vars="TMPDIR=/tmp/jeroen"

这样,包的提取和安装都避免了系统或用户默认的临时目录。

答案 1 :(得分:0)

help(tempdir)中的文档非常明确地指出使用了TMPTMPDIR,...:

  

默认情况下,'tmpdir'将是'tempdir()'给出的目录。      这将是每会话临时目录的子目录      R会话启动时由以下规则找到。该      检查环境变量'TMPDIR','TMP'和'TEMP'      转,第一个找到哪个指向可写目录      used:如果没有成功,则使用'/ tmp'。

因此,如果单独设置一个没有帮助,也许你想设置几个,并确保你的'替换目录'上的权限足够宽松等等。