我试图看看如何通过并行循环返回四个表的列表。目前,我有一个函数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等等。你明白了。
答案 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)
}