如何在R中返回并行处理的表列表

Posted

技术标签:

【中文标题】如何在R中返回并行处理的表列表【英文标题】:how to return a list of tables parallel processing in R 【发布时间】:2015-07-02 17:42:27 【问题描述】:

我正在尝试了解如何通过并行循环返回包含四个表的列表。目前,我有一个函数calculatef1(k,i),它返回一个由四个元素组成的向量c(score1,score2,score3,score4)

aggregate_scores <-
  foreach(k = 1:num_metrics, .combine='cbind') %:% 
  foreach(i = 1:10, .combine='c') %dopar% 
    x = c("boot","dtw","sqldf")
    lapply(x, require, character.only=T)
    f1 <- NA
    try(f1<-calculatef1(k,i),silent=TRUE)
    f1
  

现在,这个并行循环返回一个包含 40 行和 num_metrics 列的表,但是我将如何更改我的 foreach 循环,所以我返回一个包含 4 个表的列表,每个表对应一个不同的分数,而不是(或至少类似的东西)?

谢谢!

*为了重现性,将其用于calculatef1函数...

calculatef1 <- function(k,i)
  score1 <- k+i
  score2 <- k-i
  score3 <- k*i
  score4 <- k^i 
  c(score1,score2,score3,score4)

我想返回一个包含四个数据帧的列表,例如,第 3 个数据帧的以下对 k,i 的得分为 3。

1*1=1    2*1=2    3*1=3 ...
1*2=2    2*2=4    3*2=6 ...
1*3=3    2*3=6    3*3=9 ...
.        .        .
.        .        .

同样,第 4 个数据帧将有 1^1、2^1、3^1、1^2、2^2 等。你明白了。

【问题讨论】:

最好能提供一个可重现的例子。 刚刚添加了一些更多的东西以实现可重复性。 导入这些库的目的是什么?我假设它们与真正的calculatef1 有关。此外,您还应该提供所需的输出。表应该包括什么?因为据我所见,第一个循环输出一维数组 忽略这些库。我在这里更改了我的 calculatef1 代码以避免显示公司数据。 【参考方案1】:

当然,诀窍是创建适当的组合函数。您可以将来自内部foreach 循环的向量与rbind 组合起来,这样它就会返回矩阵,然后由外部foreach 循环处理这些矩阵。外部foreach 循环的组合可以是:

comb <- function(x, ...) 
  lapply(1:4, function(i) c(x[[i]], lapply(list(...), function(y) y[,i])))

这会返回一个包含四个列表的列表,可以使用“final”函数将其转换为包含四个数据框的列表:

final <- function(x) 
  lapply(x, function(y) 
    attr(y, 'names') <- paste('X', seq_along(y), sep='.')
    attr(y, 'row.names') <- .set_row_names(length(y[[1]]))
    class(y) <- 'data.frame'
    y
  )

您可以使用以下方法测试这两个函数:

x <- list(list(), list(), list(), list())
x <- comb(x, matrix(1, 10, 4), matrix(2, 10, 4))
x <- comb(x, matrix(3, 10, 4), matrix(4, 10, 4))
print(final(x))

最后,您可以在实际的foreach 循环中测试它们:

x <- list(list(), list(), list(), list())
aggregate_scores <-
  foreach(k = 1:6, .init=x, .final=final,
          .combine=comb, .multicombine=TRUE) %:%
    foreach(i = 1:10, .combine='rbind') %dopar% 
      c(k+i, k-i, k*i, k^i)
    

【讨论】:

以上是关于如何在R中返回并行处理的表列表的主要内容,如果未能解决你的问题,请参考以下文章

Weblogic 9中如何实现并行处理

R doParallel foreach 中的并行处理

在 AWS 中使用雪(和降雪)在 R 中进行并行处理

有没有办法在这个 R 代码中进行并行处理?

R 等效于 python 的 os.getpid() 用于并行处理

python中并行处理的流程