在R中将嵌套for循环转换为并行

在R中将嵌套for循环转换为并行,r,foreach,parallel-processing,parallel-foreach,R,Foreach,Parallel Processing,Parallel Foreach,下面您可以在R中找到一段代码,我想将其转换为使用多个CPU作为并行进程运行。我尝试使用foreachpackage,但没有成功。。鉴于我有3级嵌套循环,我找不到一个好的例子来说明如何使它工作。非常感谢您的帮助。下面的代码示例-我制作了一个简单的函数,因此可以作为示例: celnum <- c(10,20,30) t2 <- c(1,2,3) allrepeat <- 10 samplefunction <- function(celnum,t2){ x

下面您可以在R中找到一段代码,我想将其转换为使用多个CPU作为并行进程运行。我尝试使用
foreach
package,但没有成功。。鉴于我有3级嵌套循环,我找不到一个好的例子来说明如何使它工作。非常感谢您的帮助。下面的代码示例-我制作了一个简单的函数,因此可以作为示例:

celnum <- c(10,20,30)
t2 <- c(1,2,3)
allrepeat <- 10

samplefunction <- function(celnum,t2){

        x <- rnorm(100,celnum,t2)
        y = sample(x, 1)
        z = sample(x,1)

        result = y+z


        result 
}
celnum编辑:

嵌套的for循环应该如下所示。请注意,嵌套的
循环只有一个
foreach
和两个

library(foreach)
library(doSNOW)

cl <- makeCluster(3, type = "SOCK")
registerDoSNOW(cl)

set.seed(20)
output <- foreach(k=1:allrepeat) %dopar% {
  df <- data.frame()
  for (i in 1:length(t2)) {
    for (j in 1:length(celnum)) {
      df[i,j] <- mean(samplefunction(celnum[i],t2[j]))
    }  
  }
  df
}
顺便说一句:你应该

stopCluster(cl)
。。。后来


原创帖子

首先,您必须确定要用
foreach
循环替换
for
循环中的哪一个

基本上,这个决定主要受循环结果的影响,因此,如何组合这些结果。由于您将单个进程外包给PC的各个处理器,因此只返回最后一个元素。这些结果将按照
.combine
参数(例如
'c'
'cbind'
等)中的说明进行组合。由于您正试图生成两个列表,因此第一次开始可能不太容易。因此,我想提出一个示例,概述嵌套在其他
for
循环中的
foreach
循环的功能

library(foreach)
library(doSNOW)

dat1 <- c(15.2, 12.58, 4.25, 1.05, 6.78, 9.22, 11.20)
dat2 <- data.frame(matrix(1:15, ncol = 3))


cl <- makeCluster(3, type = "SOCK")
registerDoSNOW(cl)

for (i in 1:nrow(dat2)) {
  FEresult <- foreach(j = 1:ncol(dat2), .combine = c, .inorder = TRUE) %dopar% {
    tmp <- dat1 * dat2[i, j]
    data.frame(tmp)
  }
  FEresult
  if (i == 1) {
    res <- FEresult
  } else {
    res <- rbind(res, FEresult)
  }
}

res
库(foreach)
图书馆(doSNOW)

dat1也许你可以看看@loki:谢谢,这很好。我可以用foreach运行一个简单的循环。但是,我确实很难转换这段代码,因为这段代码会给我一个由四个矩阵组成的列表的输出,其中有一个3级嵌套循环来运行函数。我仍在与Rhanks的学习过程中。我决定稍微简化一下这个函数(参见编辑后的文章)。你介意看一看,看看最后的调整将有助于它的工作吗?当我复制循环,它的工作。也许你可以将错误信息编辑到你的问题中,这样我就可以看一看。这里没有错误信息,但结果不符合要求。我希望在
output
中获得与
z_grid
中相同的结果。前者是[i,j]的[3,3]矩阵,其中该矩阵的k个模拟被总结为每个矩阵条目中的平均值。这有意义吗?换句话说,我模拟了I和j组合k次的场景,并希望得到I和j的每个组合的k次模拟的平均值。使用
foreach
的当前输出为我提供了30x3的输出维度,我甚至不确定它们是如何订购的。谢谢,在这个示例中效果很好。但是,当我用更复杂的函数替换此函数时(完全工作,安装了所有库,与以前的循环一起工作等),使用%dopar%时,我收到一条错误消息:{:task 1 failed-“找不到函数”SpatialPoints“
。当我执行%do%时,没有问题,语句被执行。遇到过这样的问题吗?您必须添加参数
foreach(..blabla...packages=c(“sp”,“rgdal”)
或在foreach循环期间要使用的任何包。因此,包被加载到各个进程中。
library(plyr)
aaply(laply(output, as.matrix), c(2,3), mean)

#   X2
# X1       V1       V2       V3
#  1 20.30548 21.38818 18.49324
#  2 40.09506 40.64564 40.34847
#  3 60.10946 59.68913 58.66209
stopCluster(cl)
library(foreach)
library(doSNOW)

dat1 <- c(15.2, 12.58, 4.25, 1.05, 6.78, 9.22, 11.20)
dat2 <- data.frame(matrix(1:15, ncol = 3))


cl <- makeCluster(3, type = "SOCK")
registerDoSNOW(cl)

for (i in 1:nrow(dat2)) {
  FEresult <- foreach(j = 1:ncol(dat2), .combine = c, .inorder = TRUE) %dopar% {
    tmp <- dat1 * dat2[i, j]
    data.frame(tmp)
  }
  FEresult
  if (i == 1) {
    res <- FEresult
  } else {
    res <- rbind(res, FEresult)
  }
}

res