2015-03-19 44 views
4

以下函數根據需要並行執行,但返回NULL而不是預期的矩陣。我究竟做錯了什麼?foreach和dopar返回NULL而不是所需的答案

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

回答

4

你能明確地嘗試從foreach循環?:

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 
} 
返回值