Можем ли мы передать функцию в качестве аргумента

Я использую R для построения математической модели. Я хочу написать функцию f(a, b, g), которая принимает 3 аргумента, а последний — функцию. Я хочу знать, могу ли я передать функцию в качестве аргумента другой функции? Если это возможно, можете ли вы, ребята, привести простой пример?


person Lin Jiayin    schedule 04.04.2016    source источник
comment
Функционалы? adv-r.had.co.nz/Functionals.html   -  person slamballais    schedule 04.04.2016
comment
Да. См. раздел «Примеры» в ?optim и ?integrate для некоторых функций R, которые принимают другие функции в качестве аргументов.   -  person G. Grothendieck    schedule 04.04.2016
comment
Этот вопрос является абсолютно корректным вопросом, он вовсе не расфокусирован (содержит вопрос и пример), и его не следует закрывать. Уже есть один хороший ответ, но, учитывая сложную тему, другие ответы также могут содержать ценную информацию/примеры.   -  person stevec    schedule 02.07.2020


Ответы (2)


Безусловно, допустимо передавать функцию в качестве аргумента функции. Многие элементарные функции R делают это. Например,

tapply(..., FUN)

Вы можете проверить их по ?tapply.

Дело в том, что вы рассматриваете только имя функции как символ. Например, в примере с игрушкой ниже:

foo1 <- function () print("this is function foo1!")
foo2 <- function () print("this is function foo2!")

test <- function (FUN) {
  if (!is.function(FUN)) stop("argument FUN is not a function!")
  FUN()
  }

## let's have a go!
test(FUN = foo1)
test(FUN = foo2)

Также можно передать аргументы функции foo1 или foo2 в test, используя .... Я оставляю это для вас, чтобы провести некоторые исследования.


Если вы знакомы с языком C, то нетрудно понять, почему это правомерно. R написан на C (хотя синтаксис его языка принадлежит языку S), поэтому по существу это достигается за счет использования указателей на функции. Если вы хотите узнать больше об этом, см. Как работают указатели функций в C. ?

person Zheyuan Li    schedule 04.04.2016

Вот очень простой пример из текста Хэдли:

randomise <- function(f) f(runif(1e3))

randomise(mean)
#> [1] 0.5059199
randomise(mean)
#> [1] 0.5029048
randomise(sum)
#> [1] 504.245
person stevec    schedule 03.07.2020