2012-03-30 147 views
3

我想使用的foreach改造下面的嵌套的for循環如何獲得foreach的矩陣列表?

first <- c(1, 2, 3) 
second <- c(1, 2, 3) 

dummy = matrix(double(), len(first), len(second)) 
c <- list() 
c$sum <- dummy 
c$times <- dummy 

for (i in 1:len(first)) { 
    for (j in 1:len(second)) { 
     c$sum[i, j] <- first[i] + second[j] 
     c$times[i, j] <- first[i] * second[j] 
    } 
} 

c 

成代碼,並得到矩陣作爲結果的相同的列表。我嘗試了許多不同的事情,但最近的「結果」是這樣的:

x <- foreach(b = second, .combine = "cbind") %:% foreach(a = first, .combine = "c") %do% { 
      c <- list() 
      c$sum <- a+b 
      c$times <- a*b 
      out <- c 
      } 
x 

如何得到正確使用的foreach矩陣的這個名單?

編輯:一種可能是使用的結果,並呼籲後的foreach改造它:

res <- list() 
res$sum <- x[rownames(x)=="sum", ] 
rownames(res$sum) <- NULL 
colnames(res$sum) <- NULL 
res$times <- x[rownames(x)=="times", ] 
rownames(res$times) <- NULL 
colnames(res$times) <- NULL 
res 

如何「參數多態」的foreach所以沒有必要改變結果嗎?

回答

2

你「只是」必須提供正確的.combine函數。 如果你只有數字,你可以返回一個數組而不是一個列表。

library(foreach) 
library(abind) 
first <- 1:3 
second <- 4:5 
x <- 
    foreach(b = second, .combine = function(...) abind(..., along=3)) %:% 
    foreach(a = first, .combine = rbind) %do% { 
    c(sum=a+b, times=a*b) 
    } 

如果你真的需要列表,編寫組合函數會更困難。 相反,您可以構建一個data.frame,然後在需要時重新設計它。

x <- 
    foreach(b = second, .combine = rbind) %:% 
    foreach(a = first, .combine = rbind) %do% { 
    data.frame(a=a, b=b, sum=a+b, times=a*b) 
    } 
library(reshape2) 
list(
    sum = dcast(x, a ~ b, value.var="sum" )[,-1], 
    times = dcast(x, a ~ b, value.var="times")[,-1] 
) 
+0

謝謝。這幫了很多。 – Samo 2012-04-01 16:31:10