Мой вопрос основан на другом, похожем вопросе:
передача нескольких аргументов в FUN of lapply (и другие * применяются)
У меня есть пользовательская функция создания data.frame
. Цель состоит в том, чтобы получить список data.frames
для каждой новой входной переменной (я хочу отсортировать цикл по нескольким входным переменным для создания новой data.frames
).
Мне удается сделать, что я хочу, если меняется только одна входная переменная:
fn <- function(a, b){
data.frame(res = c(a, b, a + b),
text = c("a", "b", "total"))
}
fn(1, 2)
#> res text
#> 1 1 a
#> 2 2 b
#> 3 3 total
lapply(1:3, FUN = fn, b = 1)
#> [[1]]
#> res text
#> 1 1 a
#> 2 1 b
#> 3 2 total
#>
#> [[2]]
#> res text
#> 1 2 a
#> 2 1 b
#> 3 3 total
#>
#> [[3]]
#> res text
#> 1 3 a
#> 2 1 b
#> 3 4 total
Однако, как только я также изменяю вторую входную переменную (b), я получаю сообщение об ошибке.
lapply(1:3, FUN = fn, b = 1:3)
Ошибка в data.frame (res = c (a, b, a + b), text = c ("a", "b", "total")): аргументы подразумевают различное количество строк: 7, 3
Предлагаемый подход в вопросе выше (см. Ссылку) заключается в использовании mapply
. Это работает, но
возвращает matrix
, который я интерпретирую как список списков (пожалуйста, исправьте меня, если я ошибаюсь).
x <- mapply(fn, b = 1:3, a = 1:3)
x
#> [,1] [,2] [,3]
#> res Integer,3 Integer,3 Integer,3
#> text factor,3 factor,3 factor,3
Чтобы получить желаемый список data.frames
, я мог бы снова использовать apply
:
apply(x, 2, data.frame)
#> [[1]]
#> res text
#> 1 1 a
#> 2 1 b
#> 3 2 total
#>
#> [[2]]
#> res text
#> 1 2 a
#> 2 2 b
#> 3 4 total
#>
#> [[3]]
#> res text
#> 1 3 a
#> 2 3 b
#> 3 6 total
Создано в 2019-05-22 с помощью представительного пакета (v0.2.1)
Вопрос : есть ли способ избежать mapply
, за которым следует apply
, чтобы установить более одной входной переменной в пользовательской функции?