使用 forerach 进行并行计算的不需要的结果

Unwanted result from parallel computation with forerach

我想在循环中每 5 次迭代后打印一条消息。这在基本 R 循环中工作如下:

vec = c() # empty vector
for (i in 1:100) {
        
        s = sqrt(i)
        vec = c(vec, s)
        if (i %% 5 == 0) {
                print(paste0("Iteration number: ", i, " finished running"))
        }
        
}

我希望能够使用 forerach 的并行计算来做同样的事情。到目前为止,我已经完成了以下工作:

vec = c() # empty vector
library(doParallel); library(foreach)
ncores = detectCores() # number of cores in my computer
registerDoParallel(ncores)
foreach (i = 1:100) %dopar% {
        
        s = sqrt(i)
        vec = c(vec, s)
        if (i %% 5 == 0) {
                print(paste0("Iteration number: ", i, " finished running"))
        }
        
}
stopImplicitCluster()

然而,它并不像我想要的那样工作。它还出于某种原因以“类似列表”的格式打印 NULLs。如何在 forerach 方法中从基本 R 循环获得相同的结果?

如果打印在每个 5 的倍数上的消息是绝对不需要的,下面将创建两个相同的向量。
请注意,我事先创建了 vec 并在循环中使用了 message

vec <- numeric(100)
for (i in 1:100) {
  vec[i] <- sqrt(i)
  if (i %% 5 == 0) {
    message(paste0("Iteration number: ", i, " finished running"))
  }
}

library(doParallel)
library(foreach)

ncores <- detectCores() # number of cores in my computer
registerDoParallel(ncores)

vec2 <- foreach(i = 1:100, .combine = c) %dopar% {
  sqrt(i)
}
stopImplicitCluster()

identical(vec, vec2)
#[1] TRUE