将循环嵌套在并行Foreach循环内

时间:2017-04-27 19:19:56

标签: r foreach parallel-processing parallel-foreach

让我们说这个例子,我想以很多不同的方式划分很多文件。

DIVIDERS = c(2,3,5,10)

我有一个文件列表,我打算使用每个分隔符对每个文件进行操作。我想同时这样做。

我有:

foreach(x = DIVIDERS) %dopar% {
     for( y in listOfFiles ) {
           print( paste( x,  y, sep = "" ) )

这只是初步确保我确实在每个“Y”文件中获得每个“X”分隔符。但是,它们都打印出null。我想这是一个并行嵌套循环的问题。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

您需要将MyBase导出到每个子线程:

listOfFiles

答案 1 :(得分:0)

这种筑巢很好;你只是没有正确地返回结果。 foreach循环返回NULL,因为内部for循环返回一个不可见的NULL。

请改为尝试:

library(doParallel)
cl <- makePSOCKcluster(2)
registerDoParallel(cl)

DIVIDERS <- c(2,3,5,10)
listOfFiles <- c('file1', 'file2', 'file3')

newlist <-
  foreach(x=DIVIDERS, .combine='c') %dopar% {
    sublist <- vector('list', length(listOfFiles))
    for(i in seq_along(listOfFiles)) {
      y <- listOfFiles[[i]]
      sublist[[i]] <- paste(x,  y, sep = "")
    }
    sublist
  }

请注意,这使用.combine='c',以便我们获取字符串列表,而不是字符串列表列表。

虽然在for循环中嵌套foreach循环没有问题,但在这种情况下我会使用lapply

newlist <-
  foreach(x=DIVIDERS, .combine='c') %dopar% {
    lapply(listOfFiles, function(y) paste(x, y, sep=""))
  }