Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

foreach and dopar returning NULL instead of the desired answer

Tags:

foreach

r

The following function executes in parallel as desired, but returns NULL instead of the expected matrix. What am I doing wrong?

doTheMath_MC <- function(st, end, nd) {
    if (st > end) stop("end must be larger than st")
    print(getDoParWorkers())

    # Helper function from stackoverflow.com/a/23158178/633251
    tr <- function(x, prec = 0) trunc(x * 10^prec) / 10^prec

    # Helper function to use with foreach
    fef <- function(i, j, num, trpi) {
        if (num[j] >= num[i]) return(NULL)
        val <- num[i]/num[j]
        if (!tr(val, nd) == trpi) return(NULL)
        return(c(i, j, tr(val, nd)))
        }

    # Here we go...     
    nd <- nd - 1
    trpi <- tr(pi, nd)
    num <- st:end
    ni <- length(num)

    ans <- foreach(i = 1:ni, .combine = rbind) %dopar% {
        tmp <- matrix(NA_real_, ncol = 3)
        for (j in 1:ni) {
            tmp <- rbind(tmp, fef(i, j, num, trpi))
            } # The backend holds all the results until all are done
        } #end of dopar control
    str(ans)    # NULL ! Why?
    cat("Done computing", paste("EST", st, end, nd+1, sep = "_"), "\n")
    if (is.null(ans)) return(NULL)
    ans <- as.matrix(na.omit(ans)) # probably not needed in MC version
    return(ans) # c("num", "den", "est", "eff")
    }
like image 951
Bryan Hanson Avatar asked Mar 19 '15 01:03

Bryan Hanson


1 Answers

Can you try explicitly returning a value from the foreach loop?:

ans <- foreach(i = 1:ni, .combine = rbind) %dopar% {
    tmp <- matrix(NA_real_, ncol = 3)
    for (j in 1:ni) {
        tmp <- rbind(tmp, fef(i, j, num, trpi))
    }

    return(tmp) # explicitly return the matrix tmp
}
like image 65
Tim Biegeleisen Avatar answered Nov 14 '22 06:11

Tim Biegeleisen