【发布时间】:2018-11-06 04:35:30
【问题描述】:
我想模拟数据,同时对这些数据进行 10000 次分析。因此,我在 R 中使用了一个“for”循环来重复工作 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")})
}
但是每次我这样做时,我发现程序没有模拟数据(程序代码没有问题,因为它正常运行而没有并行化)。我不明白上面代码中的问题出在哪里。您能建议任何更好的方法来完成这项工作吗?
【问题讨论】:
-
1.您的代码不可重现
simulated_data_list[[i]]<- some function to simulate data; 2. 你在模拟中使用种子吗? 3. 我会使用future而不是doSNOW -
@PoGibas 我把它做成可重现的。您现在可以建议吗?
-
你的意思是“程序代码没有问题,因为它在没有并行化的情况下正常运行”使用foreach和简单的
%do%更新simulated_data_list和analysis_result? -
@PoGibas 没有 foreach 和 %do%
-
是的,没错!这是
foreach返回结果的方式,它使用return并且不能简单地附加到提供的列表中。从foreach返回单个列表:list(sim <- rnorm(100); 1-pnorm(sim))
标签: r foreach parallel.foreach