Как получить список матриц в результате foreach? - PullRequest
3 голосов
/ 30 марта 2012

Я хотел бы преобразовать следующее вложенное для цикла

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

в код, используя foreach, и получить в результате тот же список матриц.Я пробовал много разных вещей, но ближайший «результат» таков:

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, чтобы не было необходимости преобразовывать результаты?

1 Ответ

2 голосов
/ 30 марта 2012

Вы "просто" должны предоставить правильную функцию .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]
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...