2017-10-10 81 views
0

我有一個問題,而我試圖恢復已經由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) 

有人幫我完成這個任務嗎?謝謝!

回答

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會話來完成工作。

+0

是的,這只是一個例子。真實數據包含超過20k次迭代,因此,如果我應用簡單的循環,任務需要數小時。所以,在並行的情況下,這個過程會更快。 – lolo

+0

@ lolo我不明白。我剛剛給你解決方案來並行化你的問題,而不是說你不需要並行化它。 –