我是R.的新手。我写了这个非常简单的脚本来突出我的问题。如果我运行这个常规for循环testdata会在每次迭代时更新,就像我想要的那样。
a = 5
b = 4
c = 3
testdata = matrix(nrow=100, ncol=5)
for(j in 1:100){
testdata[j,1] <- a*j
testdata[j,2] <- b*j
testdata[j,3] <- c*j
testdata[j,4] <- (a+b)*j
testdata[j,5] <- (a+c)*j
}
然而,使用foreach的这个并行版本完成了计算,但它们没有在testdata中更新。
a = 5
b = 4
c = 3
testdata = matrix(nrow=100, ncol=5)
library(foreach)
library(doParallel)
library(doMC)
registerDoMC()
getDoParWorkers() # Checking the number of cores.
foreach(j = 1:100) %dopar% {
testdata[j,1] <- a*j
testdata[j,2] <- b*j
testdata[j,3] <- c*j
testdata[j,4] <- (a+b)*j
testdata[j,5] <- (a+c)*j
}
我试图在这里以及互联网上的其他地方关注示例,但大多数示例在R shoptalk中都太深,我无法遵循。如何使这个并行版本执行非并行版本的功能。感谢。
答案 0 :(得分:0)
您应该查看foreach
包的文档。在代码的foreach(j = 100)
部分,您可以指定参数.combine
以告诉foreach
如何编译结果。由于您需要5x100数据帧/矩阵,因此您可以逻辑地将五个参数(即c(a*j, b*j, c*j, (a+b)*j, (a+c)*j)
)的矢量和rbind
它们组成一个数据帧。看看下面的代码:
a = 5
b = 4
c = 3
library(foreach)
library(doParallel)
library(parallel)
## Assuming you want to use all of your cores
registerDoParallel(cores = detectCores())
## Specify your .combine argument below
foreach(j = 1:100, .combine = "rbind") %dopar% {
c(a*j, b*j, c*j, (a+b)*j, (a+c)*j)
}
这吐了出来:
[,1] [,2] [,3] [,4] [,5]
result.1 5 4 3 9 8
result.2 10 8 6 18 16
result.3 15 12 9 27 24
result.4 20 16 12 36 32
result.5 25 20 15 45 40
...
然后,您可以通过将此分配给您想要的变量来进一步采取这一步:
...
testdata <- foreach(j = 1:100, .combine = "rbind") %dopar% {
c(a*j, b*j, c*j, (a+b)*j, (a+c)*j)
}
testdata <- as.data.frame(testdata, row.names = FALSE)
希望这有帮助!