parLapply中的R - dataframes

问题描述:

我有一个问题,而我试图恢复已经由parLapply算法R.parLapply中的R - dataframes

ejecuted数据帧I附着有虹膜数据设置为显示该问题的下一个例子。 我创建了一个函数,为每个虹膜种类做一个线性模型,然后通过它们循环。

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) 
} 

这里,树状数据库(“predicted_df_1/2/3”)正确地出现在本地环境中。

当我执行同样的事情,但与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) 

有人帮我完成这个任务吗?谢谢!

只需使用

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会话来完成工作。

+0

是的,这只是一个例子。真实数据包含超过20k次迭代,因此,如果我应用简单的循环,任务需要数小时。所以,在并行的情况下,这个过程会更快。 – lolo

+0

@ lolo我不明白。我刚刚给你解决方案来并行化你的问题,而不是说你不需要并行化它。 –