将列表内的对象用作lapply中的函数参数

时间:2018-08-24 09:07:02

标签: r lapply

我正在尝试学习使用不同的方法来使用列表中的对象作为... .mergeMap((ids) => { const observables = ids.map(id => this.db.collection('posts').doc(id)) return Observable.forkJoin(observables) }) 中的FUN参数。取得以下数据:

lapply

所需结果:

A <- list(a = matrix(0, ncol = 3, nrow = 3), b = matrix(0, ncol = 3, nrow = 3))
B <- list(a = matrix(1, ncol = 1, nrow = 3), b = matrix(1, ncol = 1, nrow = 3))
D <- mapply(FUN="list", A, B, SIMPLIFY=F, USE.NAMES=F)
D <- lapply(D, `names<-`, c("first", "second"))
D
[[1]]
[[1]]$`first`
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

[[1]]$second
     [,1]
[1,]    1
[2,]    1
[3,]    1


[[2]]
[[2]]$`first`
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

[[2]]$second
     [,1]
[1,]    1
[2,]    1
[3,]    1

这是我通常的做法:

[[1]]
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
[4,]    1    1    1

[[2]]
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
[4,]    1    1    1

现在,我想知道是否有一种避免使用lapply(D, function(x) rbind(x$first, as.numeric(x$second))) 并重复所有这些 x 的方法。像这样:

function(x)

如何让lapply(D, "rbind", <args>) (或任何其他函数)知道我正在引用rbind框架内的对象?

谢谢

K。

2 个答案:

答案 0 :(得分:1)

更新

根据注释,更改了代码以仅保留正确的解决方案。


正如一些评论员所说,问题是B需要进行调换才能找到一个优雅的解决方案。您应该看看library(purrr),因为这样整个问题就会减少为:

map2(A, B, ~ rbind(.x, t(.y)))
# $`a`
#      [,1] [,2] [,3]
# [1,]    0    0    0
# [2,]    0    0    0
# [3,]    0    0    0
# [4,]    1    1    1

# $b
#      [,1] [,2] [,3]
# [1,]    0    0    0
# [2,]    0    0    0
# [3,]    0    0    0
# [4,]    1    1    1

map2的作用是接收2个列表,并将函数应用于这些列表的每个元素。 ~语法是function(.)

的快捷方式

答案 1 :(得分:1)

要“避免使用function(x)并重复所有这些x”,我们可以使用with()

lapply(D, with, rbind(first, as.numeric(second)))