обобщить lapply / map для всех перестановок нескольких аргументов - PullRequest
1 голос
/ 05 марта 2020

Я хочу проверить, работает ли функция f, которая имеет несколько аргументов, как требуется.

f <- function(x1, ..., xm) {...}

Я хочу указать списки

x1_arguments <- list(x1_1, ..., x1_n1)
...
xm_arguments <- list(xm_1, ..., xm_nm)

и проверить, что f работает для всех возможных комбинаций x1, ..., xm.

Я мог бы, конечно,

  1. Напишите, например, такой кадр данных, чтобы строки содержали возможные комбинации аргументов x1, ... xm. а затем l oop над строками

  2. Напишите вложенное для / lapply l oop

Я бы хотел сделать его красивее однако, как 1. создает возможно большой объект, который абсолютно не нужен и 2. выглядит некрасиво

Существует ли встроенная R-функция, которая позволяет вам это делать, например, обобщенная функция lapply, которая зацикливается на нескольких списках?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы ищете outer.

outer(1:3, 4:6, FUN=`^`)
#      [,1] [,2] [,3]
# [1,]    1    1    1
# [2,]   16   32   64
# [3,]   81  243  729

Чтобы получить векторный формат, используйте

as.vector(outer(1:3, 4:6, FUN=`^`))
# [1]   1  16  81   1  32 243   1  64 729

mapply, в основном выбрасывает только диагональ.

mapply(FUN=`^`, 1:3, 4:6)
# [1]   1  32 729

Редактировать

Для большего количества аргументов вы можете попробовать expand.grid.

f <- function(x, y, z) x + y - z

Просто разверните ваши аргументы для всех возможных комбинаций перестановок.

args <- expand.grid(
  x1=1:3,
  x2=4:6,
  xn=7:9)

head(args)
#   x1 x2 xn
# 1  1  4  7
# 2  2  4  7
# 3  3  4  7
# 4  1  5  7
# 5  2  5  7
# 6  3  5  7

И распакуйте их в .GlobalEnv.

list2env(args, envir=.GlobalEnv)

Тогда вы можете использовать mapply.

mapply(f, x1, x2, xn)
# [1] -2 -1  0 -1  0  1  0  1  2 -3 -2 -1 -2 -1  0 -1  0  1 -4 -3
# [21] -2 -3 -2 -1 -2 -1  0
1 голос
/ 05 марта 2020

Существует встроенная функция для применения к нескольким итерациям:

mapply()

В вашем случае:

mapply(f, x = x_arguments, y = y_arguments)

Возможно, вам потребуется упорядочить x и y так, чтобы все возможные комбинации экземпляров совпадают, но как только вы это сделаете, вы можете использовать эту функцию.

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