2017-10-10 6 views
0

私はすでにR.parLapply - データフレーム

にparLapplyアルゴリズムによってejecutedデータフレームを回復しようとしながら、私は問題を抱えているが、私はこの問題を表示するように設定された虹彩データと、次の例を添付しました。 私は、それぞれのアイリスのSpeciesにライナーモデルを作成し、その上にループを作成する関数を作成しました。

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

だけで、あなたはあなたが欲しい予測とparLapplyから大きさ3のリストを取得します

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

を使用しています。


並列処理を使用しているときにグローバル環境に割り当てることはできません。これは、作業を行う主なRセッションではないためです。

+0

はい、これは単なる例です。実際のデータには20k回以上の反復が含まれています。したがって、単純なループを適用すると、タスクに多くの時間がかかります。したがって、並列処理では、プロセスがより速くマッチするようになります。 – lolo

+0

@loloわかりません。私は、問題を並列化するソリューションを提供しましたが、並列化する必要はないとは言えませんでした。 –

関連する問題