Передать имя функции в качестве аргумента в mapply? - PullRequest
4 голосов
/ 25 октября 2019

Я хотел бы передать имя функции в качестве аргумента в mapply:

f2 <- function(a, b) a + b^2
f <- function(a, b, func) func(a, b)
f(1, 3, f2)  ## returns 10
mapply(f2,  1:2,  3)  ## returns [1] 10 11
mapply(function(a, b) f(a, b, f2), 1:2,  3) ## returns [1] 10 11
mapply(f,  1:2,  3,  f2)  ## fails

Последний вызов mapply генерирует ошибку

Error in dots[[3L]][[1L]] : object of type 'closure' is not subsettable

Есть ли способ сделать это?

Ответы [ 2 ]

5 голосов
/ 25 октября 2019

mapply предполагает, что вы хотите перебрать все векторы, которые вы передаете после первой функции. Но вы хотите использовать одно и то же значение f2 для каждой итерации. Вы можете сделать это, используя параметр MoreArgs=

mapply(f,  1:2,  3,  MoreArgs=list(func=f2))

У вас не будет той же проблемы с 3, потому что R выполнит рециркуляцию вектора, чтобы расширить 3 до c(3,3), чтобы соответствовать той же длине, что и c(1,2). Функции в R не имеют такого же неявного поведения при переработке. Но если вы хотите, чтобы значение всегда оставалось неизменным, лучше указать его в параметре MoreArgs

0 голосов
/ 25 октября 2019

1) Обернуть функцию в список:

mapply(f,  1:2,  3,  list(f2))
## [1] 10 11

2) Обычно функции, которые имеют аргументы функции, используют match.fun, чтобы можно было передатьлибо функция, либо строка символов, содержащая ее имя. Например, mapply сам делает это, поэтому вышеприведенная строка кода может быть в равной степени записана как: mapply("f", 1:2, 3, list(f2)). Если бы f было написано таким образом, то мы могли бы просто указать имя f2 в виде символьной строки, а именно "f2".

f <- function(a, b, func) {
  func <- match.fun(func)
  func(a, b)
}

mapply(f,  1:2,  3,  "f2")
## [1] 10 11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...