假设我有一个函数返回2个矩阵。对于每个输入i。
f<-function(i){
m1=matrix(i,ncol=5,nrow=5)
m2=matrix(i*10,ncol=5,nrow=5)
r=list(m1=m1,m2=m2)
return(r)
}
d=lapply(1:3,f)
如何在没有for循环的情况下获得2件事情?
d[[1]]$m1+d[[2]]$m1+d[[3]]$m1
d[[1]]$m2+d[[2]]$m2+d[[3]]$m2
我为m1尝试了sum(lapply(1:3,function(x) (d[[x]]$m1)))
,但无效。
答案 0 :(得分:4)
您可以使用Reduce
:
Reduce("+", lapply(d, function(x) x$m1))
您还可以使用purrr包中的m1
,m2
和transpose
获取map
和reduce
:
library(purrr)
map(transpose(d), reduce, `+`)
返回:
$m1
[,1] [,2] [,3] [,4] [,5]
[1,] 6 6 6 6 6
[2,] 6 6 6 6 6
[3,] 6 6 6 6 6
[4,] 6 6 6 6 6
[5,] 6 6 6 6 6
$m2
[,1] [,2] [,3] [,4] [,5]
[1,] 60 60 60 60 60
[2,] 60 60 60 60 60
[3,] 60 60 60 60 60
[4,] 60 60 60 60 60
[5,] 60 60 60 60 60
答案 1 :(得分:2)
我们遍历内部嵌套list
元素(lapply(paste0("m", 1:2), ..
)的名称,循环遍历list
元素(lapply(d, ...
),提取与之匹配的元素names
d1[[nm]]
)并Reduce
使用+
(发布时我没有看到其他答案)。
lapply(paste0("m", 1:2), function(nm) lapply(d, function(d1) Reduce(`+`, d1[[nm]])))
#[[1]]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 6 6 6 6 6
#[2,] 6 6 6 6 6
#[3,] 6 6 6 6 6
#[4,] 6 6 6 6 6
#[5,] 6 6 6 6 6
#[[2]]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 60 60 60 60 60
#[2,] 60 60 60 60 60
#[3,] 60 60 60 60 60
#[4,] 60 60 60 60 60
#[5,] 60 60 60 60 60