2011-05-31 23 views
7

¿Cómo se podría aplicar en I la función apply.func(func, arg.list), que tiene una función arbitraria func y una lista adecuada arg.list como argumentos, y devuelve el resultado de llamar func con los argumentos contenidos en arg.list. P.ej.Función de aplicar funciones arbitrarias en I

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

es equivalente a

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

Gracias!

P.S. Fwiw, el equivalente Python de apply.func sería algo así como

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

o

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

o alguna variante de la misma.

Respuesta

17

Creo que do.call es lo que estás buscando. Puede leer sobre esto a través del ?do.call.

El ejemplo clásico de cómo la gente utiliza do.call es rbind tramas de datos o matrices juntos:

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)) 

He aquí otro ejemplo bastante trivial usando sum:

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

Exactamente. ¡Gracias! – kjo

+0

+1 para publicar primero ... – Andrie

8

R permite que las funciones pueden pasar como argumentos a las funciones. Esto significa que puede definir apply.func de la siguiente manera (donde f es una función y ... indica todos los demás parámetros:

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

continuación, puede utilizar apply.func a y especificar cualquier función donde los parámetros tienen sentido:

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

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

Sin embargo, tenga en cuenta que lo siguiente puede no producir los resultados que esperaba, ya que mean toma un vector como argumento:

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

Tenga en cuenta que también hay una función R base llamada do.call que hace lo mismo.

+2

'f <- match.fun (f)' será un control de cordura si el argumento de función es función existente. – Marek

Cuestiones relacionadas