2014-02-24 107 views
1

我想运行下面的代码:R:如何在每个并行群集节点上获取变量文件?

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([email protected]$statistic) 
}) 

stopCluster(cl) 

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

我应该如何改进代码才能使其工作?

回答

2

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

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

这也有点更有效,因为它加载所有的软件包在单一群集操作中。

您可以验证软件包使用正确装入:

clusterEvalQ(cl, search()) 
相关问题