Функция для применения произвольных функций в R - PullRequest
7 голосов
/ 31 мая 2011

Как реализовать в 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)

или некоторый его вариант.

Ответы [ 2 ]

17 голосов
/ 31 мая 2011

Я думаю 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)))
8 голосов
/ 31 мая 2011

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

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

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

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, которая фактически делает то же самое.

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