Функция для применения произвольных функций в R

#r

#r

Вопрос:

Как можно реализовать в R функцию apply.func(func, arg.list) , которая принимает произвольную функцию func и подходящий список arg.list в качестве аргументов и возвращает результат вызова func с аргументами, содержащимися в arg.list . Например.

 apply.func(foo, list(x="A", y=1, z=TRUE))
  

эквивалентно

 foo(x="A", y=1, z=TRUE)
  

Спасибо!

P.S. FWIW, эквивалент Python для apply.func был бы чем-то вроде

 def apply_func(func, arg_list):
    return func(*arg_list)
  

или

 def apply_func(func, kwarg_dict):
    return func(**kwarg_dict)
  

или какой-либо ее вариант.

Ответ №1:

Я думаю, do.call это то, что вы ищете. Вы можете прочитать об этом через ?do.call .

Классическим примером того, как люди используют do.call , является rbind объединение фреймов данных или матриц:

 d1 <- data.frame(x = 1:5,y = letters[1:5])
d2 <- data.frame(x = 6:10,y = letters[6:10])

do.call(rbind,list(d1,d2))
  

Вот еще один довольно тривиальный пример использования sum :

 do.call(sum,list(1:5,runif(10)))
  

Ответ №2:

R позволяет передавать функции в качестве аргументов функциям. Это означает, что вы можете определить apply.func следующим образом (где f — функция, а ... — все остальные параметры:

 apply.func <- function(f, ...)f(...)
  

Затем вы можете использовать apply.func to и указать любую функцию, параметры которой имеют смысл:

 apply.func(paste, 1, 2, 3)
[1] "1 2 3"

apply.func(sum, 1, 2, 3)
[1] 6
  

Однако обратите внимание, что следующее может не дать ожидаемых результатов, поскольку mean принимает вектор в качестве аргумента:

 apply.func(mean, 1, 2, 3)
[1] 1
  

Обратите внимание, что существует также вызываемая базовая функция R do.call , которая эффективно выполняет то же самое.

Комментарии:

1. f <- match.fun(f) будет проведена проверка работоспособности, является ли аргумент функции существующей функцией.