使用 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()
然而,它并不像我想要的那样工作。它还出于某种原因以“类似列表”的格式打印 NULL
s。如何在 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
我想在循环中每 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()
然而,它并不像我想要的那样工作。它还出于某种原因以“类似列表”的格式打印 NULL
s。如何在 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