2015-07-02 40 views
1

我想知道如何通過並行循環返回四個表的列表。目前,我有一個函數calculatef1(k,i),它返回四個元素c(score1,score2,score3,score4)的向量。如何返回R表中的並行處理列表

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個數據幀score3以下四個成對的數據幀列表k,我。

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,等你的想法。

+0

如果你提供了一個可重複的例子,這將是最好的。 –

+0

只是增加了一些重複性的東西。 – Glassjawed

+0

導入這些庫的目的是什麼?我假設它們與真正的計算結果f1有關。你也應該提供一個理想的輸出。桌子應該包括什麼?因爲據我所見,第一個循環輸出一維數組 – OganM

回答

1

當然訣竅是創建適當的組合功能。您可以將內部foreach循環中的矢量與rbind合併,以便返回矩陣,然後由外部循環處理該矩陣。將合併的用於外foreach環可以是:

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

這將返回的四個列表,其可以被轉換成四個數據的列表的列表幀使用的「最終」功能:

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