#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)
будет проведена проверка работоспособности, является ли аргумент функции существующей функцией.