2017-10-10 6 views
0

J'ai un problème alors que je tente de récupérer la trame de données déjà ejecuted par l'algorithme parLapply R.parLapply en R - dataframes

I joint l'exemple suivant avec les données de l'iris définie pour indiquer la question. J'ai créé une fonction qui fait un modèle de revêtement pour chaque espèce d'iris, puis une boucle sur eux.

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

Ici, les bases de données d'arbres ("predicted_df_1/2/3") est apparu correctement dans l'environnement local.

Lorsque j'exécute la même chose mais avec l'algorithme parLapply je ne trouve pas où sont les trames de données ou comment les amener à l'environnement local. Aucune erreur n'est affichée.

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) 

Comment quelqu'un m'aide dans cette tâche? Merci!

Répondre

0

utiliser simplement

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

alors vous obtiendrez une liste de taille 3 de parLapply avec les prédictions que vous voulez.


Vous ne pouvez pas affecter à l'environnement global lorsque vous utilisez le parallélisme car ce n'est pas votre session R principale qui fait le travail.

+0

Oui, ce n'est qu'un exemple. Les données réelles contiennent plus de 20k itérations, donc, si j'applique une simple boucle, la tâche demande plusieurs heures. Donc, avec le parallélisme, le processus serait plus rapide. – lolo

+0

@lolo Je ne comprends pas. Je viens de vous donner la solution pour paralléliser votre problème, pas dit que vous n'avez pas besoin de le paralléliser. –