我想模拟数据,同时对这些数据进行10000次分析。因此我使用" for"在R中循环重复工作10000次。现在我想并行化这个任务。我遵循以下代码:
library(parallel)
library(doSNOW)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)
progress <- function(n) cat(sprintf("task %d is complete\n", n)) # to check the progress of the work
setno<- data.frame(sample_no=c(1:10000))
no_of_samples<- unique(setno$sample_no)
simulated_data_list <- vector("list",length(no_of_samples))
analysis_result <- numeric(length(simulated_data_list ))
foreach(i=1:10000,progress)%dopar%{
tryCatch({
simulated_data_list[[i]]<- rnorm(100)# suppose we are simulating data
analysis_result[[i]] <- 1-pnorm(simulated_data_list[[i]][1])
},error=function(e){cat("ERROR:",conditionMessage(e),"\n")})
}
但每次我这样做,我发现程序没有模拟数据(程序代码没有问题,因为它没有并行化就能正常运行)。我无法理解上述代码中的问题所在。你能建议任何更好的方法来做这项工作吗?
答案 0 :(得分:1)
您必须return
来自foreach
循环。例如:
library(parallel)
library(doSNOW)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)
result <- foreach(i = 1:5) %dopar% {
sim <- rnorm(2)
list(sim , 1 - pnorm(sim[1]))
}
simulated_data_list <- lapply(result, "[[", 1)
analysis_result <- lapply(result, "[[", 2)
例如,使用简单for
我们可以附加到列表,但foreach
不能像这样工作:
dummyList <- list()
dummyList2 <- list()
foreach(i = 1:5) %dopar% {
dummyList[[i]] <- rnorm(2)
}
for(i in 1:5) {
dummyList2[[i]] <- rnorm(2)
}
lapply(list(dummyList, dummyList2), length)
[[1]]
[1] 0
[[2]]
[1] 5