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会话来完成工作。
是的,这只是一个例子。真实数据包含超过20k次迭代,因此,如果我应用简单的循环,任务需要数小时。所以,在并行的情况下,这个过程会更快。 – lolo
@ lolo我不明白。我刚刚给你解决方案来并行化你的问题,而不是说你不需要并行化它。 –