我刚刚使用包parallel
和foreach()
函数执行了我的第一步。因此这个问题会相当愚蠢。所以这是我想完成的任务:
t
一个简单的例子是:
newFunc<-function(){
test[i+1] <<- sqrt(test[i])
}
test <- c(1,rep(NA, 10))
foreach(i=1:11, .combine='rbind', .export='test')%do% newFunc()
这也为我提供了一个矢量作为for-loop当然也是如此。但是,如果我尝试并行化,这会产生不同的结果:
test <- c(1,rep(NA, 10))
library(doParallel)
library(foreach)
cl <- makeCluster(4)
registerDoParallel(cl)
foreach(i=1:11, .combine='rbind', .export='test')%dopar% newFunc()
stopCluster(cl)
这给我留下了输出c(1, NA, NA, NA, NA, ..., NA)
。我猜测这是因为奴隶不知道其他功能的结果?我希望我提供了必要的信息。我的实际功能当然更复杂,但这个例子似乎是最简单的方式来证明我的问题。
编辑:我想第一个问题是:这样的问题可以并行化吗?
答案 0 :(得分:2)
确实,所提出的迭代并不是并行运行,而是
test = numeric(11); test[] = 2
test^(1/2^(0:10))
是您感兴趣的解决方案。这很容易(虽然不必要,因为计算已经过矢量化)并行化
fun = function(i, test)
test[i] ^ (1 / 2^(i - 1))
unlist(mclapply(seq_along(test), fun, test))
对于并行评估,fun
不应更新非局部变量(与<<-
一样)。也许您的真正问题可以通过允许并行评估的方式提出,即使原始公式似乎需要连续评估?