Dear all, when I am running the code attached below, it seems that no results are returned, only the predefined NAs. What mistake do I make? Any comments and help is highly appreciated. Thanks and best, Martin Simpar3 <- function(n1) { L2distance <- matrix(NA, ncol=n1, nrow=n1) data <- rnorm(n1) diag(L2distance)=0 cl <- makeCluster(4) registerDoParallel(cl) foreach(j=1:n1) %dopar% { library(np) datj <- data[j] for(k in j:n1) { L2distance[j,k] <- k*datj } } stopCluster(cl) return(L2distance) } Res <- Simpar3(100)
Martin, I think the main problem is that you are trying to assign your results to the result matrix inside the foreach loop. Parallel functions in R are generally not good at updating parts of matrices from the different workers in this way. Instead, using e.g. foreach, each loop of the foreach-call has to return a vector which can be cbind-ed to a result matrix. Something like: L2distance = foreach(j=1:n1, .combine = cbind) %dopar% { res = rep(NA, 10) for (k in j:n1) res[k] = k*data[j] res } L2distance I am not sure what the np-library is, but you should consider putting it in a clusterExport-call after creating the cluster. Best wishes, Jon On 7/31/2015 2:39 PM, Martin Spindler wrote:> Dear all, > > when I am running the code attached below, it seems that no results are returned, only the predefined NAs. What mistake do I make? > Any comments and help is highly appreciated. > > Thanks and best, > > Martin > > > Simpar3 <- function(n1) { > L2distance <- matrix(NA, ncol=n1, nrow=n1) > data <- rnorm(n1) > diag(L2distance)=0 > cl <- makeCluster(4) > registerDoParallel(cl) > foreach(j=1:n1) %dopar% { > library(np) > datj <- data[j] > for(k in j:n1) { > L2distance[j,k] <- k*datj > } > } > stopCluster(cl) > return(L2distance) > } > > Res <- Simpar3(100) > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Jon Olav Sk?ien Joint Research Centre - European Commission Institute for Environment and Sustainability (IES) Climate Risk Management Unit Via Fermi 2749, TP 100-01, I-21027 Ispra (VA), ITALY jon.skoien at jrc.ec.europa.eu Tel: +39 0332 789205 Disclaimer: Views expressed in this email are those of the individual and do not necessarily represent official views of the European Commission.
Try this chance to actually return values: library(doParallel) Simpar3 <- function(n1) { L2distance <- matrix(NA, ncol=n1, nrow=n1) data <- rnorm(n1) diag(L2distance)=0 cl <- makeCluster(4) registerDoParallel(cl) x <- foreach(j=1:n1) %dopar% { library(np) datj <- data[j] for(k in j:n1) { L2distance[j,k] <- k*datj } L2distance # return the value } stopCluster(cl) return(x) } Res <- Simpar3(100) Jim Holtman Data Munger Guru What is the problem that you are trying to solve? Tell me what you want to do, not how you want to do it. On Fri, Jul 31, 2015 at 8:39 AM, Martin Spindler <Martin.Spindler at gmx.de> wrote:> Dear all, > > when I am running the code attached below, it seems that no results are > returned, only the predefined NAs. What mistake do I make? > Any comments and help is highly appreciated. > > Thanks and best, > > Martin > > > Simpar3 <- function(n1) { > L2distance <- matrix(NA, ncol=n1, nrow=n1) > data <- rnorm(n1) > diag(L2distance)=0 > cl <- makeCluster(4) > registerDoParallel(cl) > foreach(j=1:n1) %dopar% { > library(np) > datj <- data[j] > for(k in j:n1) { > L2distance[j,k] <- k*datj > } > } > stopCluster(cl) > return(L2distance) > } > > Res <- Simpar3(100) > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]
Dear Jim, Thank you very much for your response. It seems to work now, but the return value is not the required matrix but a list of matrices (one for each repition j). Any idea how it is possible to return only the last matrix and not all? Thanks and best, Martin ? ? Gesendet:?Freitag, 31. Juli 2015 um 18:22 Uhr Von:?"jim holtman" <jholtman at gmail.com> An:?"Martin Spindler" <Martin.Spindler at gmx.de> Cc:?"r-help at r-project.org" <r-help at r-project.org> Betreff:?Re: [R] R parallel / foreach - aggregation of results Try this chance to actually return values: ? ? library(doParallel) Simpar3 <- function(n1) { ?? L2distance <- matrix(NA, ncol=n1, nrow=n1) ?? data <- rnorm(n1) ?? diag(L2distance)=0 ?? cl <- makeCluster(4) ?? registerDoParallel(cl) ?? x <- foreach(j=1:n1)? %dopar% { ???? library(np) ???? datj <- data[j] ???? for(k in j:n1) { ?????? L2distance[j,k] <- k*datj ???? } ???? L2distance? # return the value ?? } ?? stopCluster(cl) ?? return(x) ?} ?Res <- Simpar3(100) ? Jim Holtman Data Munger Guru ? What is the problem that you are trying to solve? Tell me what you want to do, not how you want to do it.? On Fri, Jul 31, 2015 at 8:39 AM, Martin Spindler <Martin.Spindler at gmx.de> wrote:Dear all, when I am running the code attached below, it seems that no results are returned, only the predefined NAs. What mistake do I make? Any comments and help is highly appreciated. Thanks and best, Martin Simpar3 <- function(n1) { ? L2distance <- matrix(NA, ncol=n1, nrow=n1) ? data <- rnorm(n1) ? diag(L2distance)=0 ? cl <- makeCluster(4) ? registerDoParallel(cl) ? foreach(j=1:n1)? %dopar% { ? ? library(np) ? ? datj <- data[j] ? ? for(k in j:n1) { ? ? ? L2distance[j,k] <- k*datj ? ? } ? } ? stopCluster(cl) ? return(L2distance) } Res <- Simpar3(100) ______________________________________________ R-help at r-project.org[R-help at r-project.org] mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help[https://stat.ethz.ch/mailman/listinfo/r-help] PLEASE do read the posting guide http://www.R-project.org/posting-guide.html[http://www.R-project.org/posting-guide.html] and provide commented, minimal, self-contained, reproducible code.