如何返回R

时间:2015-07-02 17:42:28

标签: r parallel-processing

我试图看看如何通过并行循环返回四个表的列表。目前,我有一个函数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对,得分为3,i。

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 ...
.        .        .
.        .        .

类似地,第四个数据帧将具有1 ^ 1,2 ^ 1,3 ^ 1,1 ^ 2,2 ^ 2等等。你明白了。

1 个答案:

答案 0 :(得分:1)

当然,技巧是创建适当的组合功能。您可以将内部foreach循环中的向量与rbind组合在一起,以便返回矩阵,然后由外部foreach循环处理。外foreach循环的组合可以是:

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

这将返回一个包含四个列表的列表,这些列表可以使用&#34; final&#34;转换为四个数据帧的列表。功能:

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)
    }