2013-03-08 3 views
1

Я распределяю задания по кластеру, и я бы предпочел не идти на каждую машину и вручную устанавливать правильные пакеты. Контроллер задания запускает скрипты как никто, поэтому я должен указать бесконтактные пути для записи для установок. У меня действительно было это рабочее решение:Установка R пакетов удаленно без особых привилегий. А.К.А. повреждение от установки пакетов R в/tmp/

`%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' 

ххх (и другие пакеты) в манифесте 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) 

ответ

2

Вы, возможно, потребуется вариант 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.")) 
    } 
} 
+0

Я думаю, что код работал раньше, потому что он установлен пакет в той же сессии, что он использовал его, и он перестает работать, потому что R считает, что пакет того разбитым в настоящее время установлен правильно. Мне потребуется несколько дней, чтобы войти и проверить ваш код, но так много спасибо за ответ. Это не такой популярный вопрос. – enfascination

+0

Прошло более двух лет, но я просто принял это, отредактировав исходный ответ, поставив/tmp/в кавычки и установив равным ему lib и destdir. – enfascination

Смежные вопросы