如何将一个函数应用于多个列表并获得一个列表作为 R 中的输出?

How applying a function to multiple lists and get a list as the output in R?

我有两个列表 AB,每个列表都有 100 个元素。每个元素都是一个方阵,N in N。我想将列表 A 中的元素 i 与列表 B 中的元素 i 相乘(I 在 1 到 100 之间)并以包含 100 个元素的列表作为输出。

我如何使用应用函数来做到这一点?例如,lapplysapplymapply、...

正如 RonakShah 在评论中所说,Map 可能是这里的答案。

这样想:lapply 对一个列表的每个元素应用一个函数:

myfunc <- function(x) {
  # do something with x
}
lapply(1:4, myfunc)
## unrolls to be the equivalent of ...
list(
  myfunc(1),
  myfunc(2),
  myfunc(3),
  myfunc(4)
)
然而,

Map 将多个列表的每个 n 元素“压缩”在一起。使用 Map 相当于上面的 lapply

Map(myfunc, 1:4)

但还有很多。

myfunc_many <- function(x, y, z) {
  # do something with all three args
}
Map(myfunc_many, 1:4, 11:14, 21:24)
## unrolls to 
list(
  myfunc_many(1, 11, 21),
  myfunc_many(2, 12, 22),
  myfunc_many(3, 13, 23),
  myfunc_many(4, 14, 24)
)

Map可以处理任意数量的列表;如果你的函数是 variadic (接受任意数量的参数),它仍然可以工作(尽管你的函数必须有处理它的内置机制,使其可变):

myfunc_variadic <- function(...) {
  dots <- list(...)
  # do something with dots
}
Map(myfunc_variadic, 1:4)
Map(myfunc_variadic, 1:4, 11:14)
Map(myfunc_variadic, 1:4, 11:14, 21:24, 31:34, 41:44)

在上面的所有示例中,我都使用向量作为每个参数,但它同样适用于事物列表。最后一个例子,

set.seed(42)
L1 <- replicate(2, matrix(sample(6), nrow = 2), simplify = FALSE)
L2 <- replicate(2, matrix(sample(6), nrow = 2), simplify = FALSE)
L1
# [[1]]
#      [,1] [,2] [,3]
# [1,]    1    6    2
# [2,]    5    4    3
# [[2]]
#      [,1] [,2] [,3]
# [1,]    2    1    5
# [2,]    6    3    4
L2
# [[1]]
#      [,1] [,2] [,3]
# [1,]    4    5    3
# [2,]    1    2    6
# [[2]]
#      [,1] [,2] [,3]
# [1,]    2    1    5
# [2,]    3    4    6
Map(`*`, L1, L2)
# [[1]]
#      [,1] [,2] [,3]
# [1,]    4   30    6
# [2,]    5    8   18
# [[2]]
#      [,1] [,2] [,3]
# [1,]    4    1   25
# [2,]   18   12   24