2012-03-30 130 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