我想运行以下代码:
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)
其中expr
是expression
。 require(req)
被视为一个表达式,其中req
不被视为迭代器变量作为字符。
如何优化代码以使其有效?
答案 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())