Использование объектов внутри списка в качестве аргументов функции в lapply - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь изучить различные способы использования объектов в списке в качестве аргументов 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)))

Теперь мне интересно, есть ли способ избежать использования function(x) и повторения всех этих x s. Что-то вроде:

lapply(D, "rbind", <args>)

Как я могу сообщить rbind (или любой другой функции), что я имею в виду объекты в рамках lapply?

Спасибо,

К.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Чтобы «избежать использования function(x) и повторять все эти x s», мы могли бы использовать with():

lapply(D, with, rbind(first, as.numeric(second)))
0 голосов
/ 24 августа 2018

Обновление

В соответствии с комментариями изменили код, чтобы оставить только правильное решение.


Как говорили некоторые комментаторы, проблема в том, что 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(.)

...