Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的嵌套foreach循环,其中内部循环返回矩阵_R_Loops_Foreach_Parallel Processing_Domc - Fatal编程技术网

R中的嵌套foreach循环,其中内部循环返回矩阵

R中的嵌套foreach循环,其中内部循环返回矩阵,r,loops,foreach,parallel-processing,domc,R,Loops,Foreach,Parallel Processing,Domc,我正在尝试并行化我的for循环。在这个循环中有一个嵌套的循环,我想将其并行化。答案肯定非常类似于:,但我似乎无法让它发挥作用。我已经尝试了我能想到的所有选项,包括将内部循环转换为它自己的函数并将其并行化,但我一直得到空列表 第一个非foreach示例有效: theFrame <- data.frame(col1=rnorm(100), col2=rnorm(100)) theVector <- 2:30 regFor <- function(dataFrame, aVect

我正在尝试并行化我的for循环。在这个循环中有一个嵌套的循环,我想将其并行化。答案肯定非常类似于:,但我似乎无法让它发挥作用。我已经尝试了我能想到的所有选项,包括将内部循环转换为它自己的函数并将其并行化,但我一直得到空列表

第一个非foreach示例有效:

theFrame <- data.frame(col1=rnorm(100), col2=rnorm(100))

theVector <- 2:30

regFor <- function(dataFrame, aVector, iterations)
{   
    #set up a blank results matrix to save into.
    results <- matrix(nrow=iterations, ncol=length(aVector))

    for(i in 1:iterations)
    {
        #set up a blank road map to fill with 1s according to desired parameters
        roadMap <- matrix(ncol=dim(dataFrame)[1], nrow=length(aVector), 0)
        row.names(roadMap) <- aVector
        colnames(roadMap) <- 1:dim(dataFrame)[1]

        for(j in 1:length(aVector))
        {
            #sample some of the 0s and convert to 1s according to desired number of sample
            roadMap[j,][sample(colnames(roadMap),aVector[j])] <- 1
        }

        temp <- apply(roadMap, 1, sum)

        results[i,] <- temp
    }

    results <- as.data.frame(results)
    names(results) <- aVector

    results
}

test <- regFor(theFrame, theVector, 2)
但这和我其他类似的尝试都不起作用

trying <- function(dataFrame, aVector, iterations, cores)
{   
    registerDoMC(cores)

    #set up a blank results list to save into. i doubt i need to do this
    results <- list()

    foreach(i = 1:iterations, .combine="rbind") %dopar%
    {
        #set up a blank road map to fill with 1s according to desired parameters
        roadMap <- matrix(ncol=dim(dataFrame)[1], nrow=length(aVector), 0)
        row.names(roadMap) <- aVector
        colnames(roadMap) <- 1:dim(dataFrame)[1]

        foreach(j = 1:length(aVector)) %do%
        {
            #sample some of the 0s and convert to 1s according to desired number of sample
            roadMap[j,][sample(colnames(roadMap),aVector[j])] <- 1
        }

        results[[i]] <- apply(roadMap, 1, sum)
    }
    results
}

test2 <- trying(theFrame, theVector, 2, 2)

我认为我必须在内部循环上使用foreach,不管发生什么,对吗

您需要将foreach的结果放入一个变量中:

    results<- foreach( ...

您需要将foreach的结果放入一个变量中:

    results<- foreach( ...

使用foreach时,您从未设置要保存到的空白结果列表,正如您所怀疑的那样。相反,您将对foreach循环体的求值结果进行组合,并返回组合结果。在这种情况下,我们希望外部foreach循环将内部foreach循环按行计算的向量组合成一个矩阵。该矩阵分配给变量结果,然后将其转换为数据帧

下面是我第一次尝试转换您的示例:

library(doMC)

foreachVersion <- function(dataFrame, aVector, iterations, cores) {
  registerDoMC(cores) # unusual, but reasonable with doMC
  rows <- nrow(dataFrame)
  cols <- length(aVector)
  results <-
    foreach(i=1:iterations, .combine='rbind') %dopar% {
      # The value of the inner foreach loop is returned as
      # the value of the body of the outer foreach loop
      foreach(aElem=aVector, .combine='c') %do% {
        roadMapRow <- double(length=rows)
        roadMapRow[sample(rows,aElem)] <- 1
        sum(roadMapRow)
      }     
    }
  results <- as.data.frame(results)
  names(results) <- aVector
  results
}

内部循环不需要实现为foreach循环。你也可以使用sapply,但我会尝试找出是否有更快的方法。但是对于这个答案,我想演示一个foreach方法。我使用的唯一真正的优化是通过在内部foreach循环中执行sum来消除要应用的调用。

当使用foreach时,您从未设置一个空白的结果列表来保存,正如您所怀疑的那样。相反,您将对foreach循环体的求值结果进行组合,并返回组合结果。在这种情况下,我们希望外部foreach循环将内部foreach循环按行计算的向量组合成一个矩阵。该矩阵分配给变量结果,然后将其转换为数据帧

下面是我第一次尝试转换您的示例:

library(doMC)

foreachVersion <- function(dataFrame, aVector, iterations, cores) {
  registerDoMC(cores) # unusual, but reasonable with doMC
  rows <- nrow(dataFrame)
  cols <- length(aVector)
  results <-
    foreach(i=1:iterations, .combine='rbind') %dopar% {
      # The value of the inner foreach loop is returned as
      # the value of the body of the outer foreach loop
      foreach(aElem=aVector, .combine='c') %do% {
        roadMapRow <- double(length=rows)
        roadMapRow[sample(rows,aElem)] <- 1
        sum(roadMapRow)
      }     
    }
  results <- as.data.frame(results)
  names(results) <- aVector
  results
}
内部循环不需要实现为foreach循环。你也可以使用sapply,但我会尝试找出是否有更快的方法。但是对于这个答案,我想演示一个foreach方法。我使用的唯一真正的优化是通过在内部foreach循环中执行sum来摆脱要应用的调用

我知道这是一个过时的问题,但只是给那些人一个提示 不让每个人工作的人。 如果使用foreach%dopar%{foreach%do%{}并行化外部循环,则 需要将.packages=cdoSNOW包含在外部 循环,否则您将遇到doSNOW not found错误。 一般来说,人们只是并行化内部循环foreach%:%foreach%dopar%{},正如论坛上所建议的,它 对于等待组合的大量数据,速度可能会慢得多 每100个结果和每个内部循环的末尾,这个过程不是并行的!。 我知道这是一个过时的问题,但只是给那些人一个提示 不让每个人工作的人。 如果使用foreach%dopar%{foreach%do%{}并行化外部循环,则 需要将.packages=cdoSNOW包含在外部 循环,否则您将遇到doSNOW not found错误。 一般来说,人们只是并行化内部循环foreach%:%foreach%dopar%{},正如论坛上所建议的,它 对于等待组合的大量数据,速度可能会慢得多 每100个结果和每个内部循环的末尾,这个过程不是并行的!。
这是问题的症结所在。谢谢史蒂夫·韦斯顿(Steve Weston)以上的回答是对这个问题的完整回答。对不起,我在第一个循环中点击了错误的符号。我现在修好了。再次感谢。这是问题的症结所在。谢谢史蒂夫·韦斯顿(Steve Weston)以上的回答是对这个问题的完整回答。对不起,我在第一个循环中点击了错误的符号。我现在修好了。再次感谢,谢谢!这很有效。如果不清楚的话,我的实际代码在两个循环中都在做更复杂的事情,所以使用sapply等可能会非常棘手。我最初的表述有两个主要问题。第一个是建立一个空白列表,并试图将结果保存到其中。顺便说一句,在其他情况下,我在foreach中成功地做到了这一点,第二个是没有理解什么是。combine正在做的。这很酷,而且不需要使用Reduce之类的东西就可以产生结果,我在过去用foreach做过类似的事情。谢谢@forlooper在foreach循环中可能会有副作用,但根据您使用的后端的不同,它的工作方式不同,因此强烈建议不要使用。我最初试图在foreach中防止副作用的可能性,但最终我放弃了尝试。谢谢Steve。我想我应该重新编程一些东西!非常感谢。这很有效。如果不清楚的话,我的实际代码在两个循环中都做了更复杂的事情,所以使用sapply等,co
会很棘手的。我最初的表述有两个主要问题。第一个是建立一个空白列表,并试图将结果保存到其中。顺便说一句,在其他情况下,我在foreach中成功地做到了这一点,第二个是没有理解什么是。combine正在做的。这很酷,而且不需要使用Reduce之类的东西就可以产生结果,我在过去用foreach做过类似的事情。谢谢@forlooper在foreach循环中可能会有副作用,但根据您使用的后端的不同,它的工作方式不同,因此强烈建议不要使用。我最初试图在foreach中防止副作用的可能性,但最终我放弃了尝试。谢谢Steve。我想我应该重新编程一些东西!