R:如何在每个并行群集节点上获取变量文件?

时间:2014-02-24 10:26:40

标签: r parallel-processing

我想运行以下代码:

library(parallel)

cl <- makeCluster(detectCores())
requires <- c("fUnitRoots","fGarch")

for(req in requires) {
  clusterEvalQ(cl,require(req))
}

list1 <- clusterApply(cl,1:10,function(i) {
  x <- rnorm(100)
  y <- rnorm(100)
  m <- lm(y~x)
  res <- resid(m)
  t <- adfTest(res) ## this function is in {fUnitRoots}
  return(t@test$statistic)
})

stopCluster(cl)

但是,fUnitRoots包未在任何节点中加载。这可能是因为clusterEvalQ(cl,expr)其中exprexpressionrequire(req)被视为一个表达式,其中req不被视为迭代器变量作为字符。

如何优化代码以使其有效?

1 个答案:

答案 0 :(得分:2)

在这种情况下调用“require”时,“character.only”选项很有用。另外,我会使用“clusterCall”而不是“clusterEvalQ”来允许包名作为参数传递给worker函数:

clusterCall(cl, function(pkgs) {
  for (req in pkgs) {
    require(req, character.only=TRUE)
  }
}, c("fUnitRoots","fGarch"))

由于它在单个集群操作中加载所有软件包,因此效率也更高。

您可以使用以下方法验证包是否已正确加载:

clusterEvalQ(cl, search())