1

我在集群上分配作业,我不想去每台机器手动安装正确的包。作业控制器以无人身份运行脚本,因此我必须为安装指定无可争议的可写路径。我实际上有这个工作解决方案:

`%ni%` = Negate(`%in%`) ### "not in"
.libPaths("/tmp/") ### for local (remote non super user) install of packages
if ("xxx" %ni% installed.packages()) {install.packages("xxx", repos = "http://cran.r-project.org", lib="/tmp/")}
# ... and more
library(xxx)
# ... and more

起初它有效,但一周后我遇到了一个奇怪的问题。

> library(xxx)
Error in library(xxx) : there is no package called 'xxx'

xxx(和其他包)在 installed.packages() 的清单中,.libPaths 报告路径上的 /tmp/,ls 在 /tmp/ 中显示包的文件夹。使用 install.packages 重新安装会引发错误,remove.package、update.package 和 find.package 也是如此。

两个问题:我应该以不同的方式管理远程安装吗?
任何想法是什么导致我无法加载包的问题?

请让我不必实施像

locdir <- paste("/tmp/", as.integer(runif(1, 1, 100000)), sep='')
system(paste("mkdir", locdir))
.libPaths(locdir)
install.packages("xxx", repos = "http://cran.r-project.org", lib=locdir)
library(xxx)
4

1 回答 1

2

您可能需要 option character.only = TRUE,尽管您的代码以前有效但现在不再有效,这很奇怪。无论如何,试试这个功能:

packageLoad<-function(libName){
    # try to load the package
    if (!require(libName,character.only = TRUE)){ 
      # if package is not available, install it
      install.packages(libName,dep=TRUE, 
         repos="http://cran.r-project.org",lib="/tmp/",destdir="/tmp/")
      # try again
      if(!require(libName,character.only = TRUE)) 
         stop(paste("Package ",libName," 
            not found and its installation failed."))
    }
}
于 2013-03-08T21:16:29.680 回答