передавая более одного аргумента в FUN of lapply - PullRequest
0 голосов
/ 22 мая 2019

Мой вопрос основан на другом, похожем вопросе: передача нескольких аргументов в 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, чтобы установить более одной входной переменной в пользовательской функции?

1 Ответ

2 голосов
/ 22 мая 2019

Вы можете сделать:

library(purrr)

map2(1:3, 1:3, fn)

[[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

Если вы хотите придерживаться mapply, вы можете сделать:

x <- mapply(fn, b = 1:3, a = 1:3, SIMPLIFY = F)

или

x <- Map(fn, b = 1:3, a = 1:3)

, который является оберткойдля mapply с SIMPLIFY = F.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...