R中的程序包加载跨多个核心

时间:2017-02-27 17:24:22

标签: r parallel-processing package

我编写了一个简化包安装,更新和加载的功能:

LoadPackages <- function(package.list){
  if (length(intersect(package.list, old.packages()[, "Package"]))) 
    update.packages(checkBuilt=TRUE, ask=FALSE)
  new.package.list <- setdiff(package.list, installed.packages()[, "Package"])
  if (length(new.package.list)) 
    install.packages(new.package.list, dependencies=TRUE, repos='http://cran.rstudio.com')
  attached <- search()
  unloaded.package.list <- setdiff(package.list, gsub("package:", "", attached[grepl("package", attached)]))
  if (length(unloaded.package.list))
    sapply(unloaded.package.list, require, character.only=TRUE)
}

当我正常使用它时,没有问题,而且效果很好。但是,我只是在R中进行并行计算,而我想要使用parLapply的函数取决于几个包,所以我试图通过获取LoadPackages所在的R文件并调用它来加载它们:

cl <- makeCluster(detectCores() - 1)
clusterEvalQ(cl, {
  source("S:/Innovation Office/innovation/all/r/inn_all_r.R")
  LoadPackages(c('dplyr', 'ggplot2', 'ifultools', 'scales'))
}) 

我收到此错误:

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  7 nodes produced errors; first error: trying to use CRAN without setting a mirror

这对我来说有点令人费解,因为我确实将存储库设置为将其作为参数的唯一函数。但是,我尝试将chooseCRANmirror()添加到函数的顶部,只是为了得到:

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  7 nodes produced errors; first error: cannot choose a CRAN mirror non-interactively

我不知道发生了什么,或者为什么这个错误只出现在我并行使用该功能的时候,但是我肯定希望这些和我的其他功能可用,所以我很感激帮助这个。

1 个答案:

答案 0 :(得分:0)

update.packages函数也有一个repos参数。我认为如果你提供这个论点,错误就会消失。

发生第二个错误是因为集群工作者以非交互方式执行,因此他们无法执行chooseCRANmirror等交互式功能。

更新

old.packages也有一个repos参数。您也可以设置它,或者只使用options函数来设置默认存储库。如果将以下行添加到LoadPackages函数的开头,它将在函数执行时设置默认存储库,但在退出时重置它:

orig <- options(repos="http://cran.rstudio.com")
on.exit(options(repos=orig))