par中的parLapply - 数据帧

时间:2017-10-10 15:02:09

标签: r parallel-processing

当我尝试恢复已经由R中的parLapply算法执行的数据帧时,我遇到了问题。

我使用虹膜数据集附加了下一个示例以显示问题。 我创建了一个函数,它为每个虹膜物种做一个线性模型,然后在它们上面进行循环。

uniques<-unique(iris$Species)

model<-function(i){
    table<-iris[iris$Species==uniques[i],]
    fit<-lm(Petal.Width ~ Petal.Length + Sepal.Width + Sepal.Length, data=table)
    predicted_df <- data.frame(pred = predict(fit, table), table)
    assign(paste0("predicted_df_",i),predicted_df,envir = .GlobalEnv)
}

#Loop over Species
loop<-  for (i in 1:3){
  model(i)
}

这里,树数据库(&#34; prediction_df_1 / 2/3&#34;)正确地出现在本地环境中。

当我使用parLapply算法执行相同的操作时,我无法找到数据框的位置或如何将它们带到本地环境。没有错误显示。

library("foreach")
library("doParallel")

cl <- makeCluster(mc <- getOption("cl.cores", 4))
clusterExport(cl=cl, varlist=c("iris"))
clusterEvalQ(cl, library(DAAG))

registerDoParallel(cl) # register the cluster
system.time(
  df <- parLapply(cl, 1:3, 
                    function(i) {
                      tryCatch({  model(i)}, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
                    })
)
stopCluster(cl)

有人如何帮助我完成这项任务?谢谢!

1 个答案:

答案 0 :(得分:0)

只需使用

model<-function(i){
    table<-iris[iris$Species==uniques[i],]
    fit<-lm(Petal.Width ~ Petal.Length + Sepal.Width + Sepal.Length, data=table)
    data.frame(pred = predict(fit, table), table)
}

然后,您将从parLapply获得一个包含所需预测的大小为3的列表。

当您使用并行性时,无法分配到全局环境,因为这不是执行此工作的主要R会话。