2012-09-03 16 views
6

¿Alguien sabe cómo escribir una función F que toma una llamada de función (digamos, mean (x = 1:10)) como argumento, y devuelve solo el nombre de la función que se invoca (media)?extrayendo un nombre de llamada de función de una llamada a función

Mis mejores intentos realizados hasta ahora se resumen a continuación

(function(x1){ 

    return(deparse(substitute(x1))) 

})(mean(x = 1:10)) 
### 'mean(x = 1:10)' 

Cambio x1 (la llamada de función) a una expresión antes de-análisis no parece ayudar mucho: que devuelve

(function(x1){ 

    return(deparse(as.expression(substitute(x1)))) 

})(mean(x = 1:10)) 
# "expression(mean(x = 1:10))" 

Si es posible, me gustaría poder usar funciones anónimas como argumento también, así que F debe devolver (función (x) impresión (x)) para (función (x) impresión (x)) (1) Si necesita alguna aclaración, siéntase libre de comentar. Gracias.

edición1: me gustaría evitar buscar el primer paréntesis y suprimir el código anterior (para "mean (x = 1:10)" que devolvería "mean"), como " malo (Fun_nAme" es en realidad un nombre de función legal en R.

pregunta contestada: la respuesta de Josh O'Brien era perfecto: la función F que satisface las condiciones anteriores se

F <- function(x) deparse(substitute(x)[[1]]) 

funciona muy bien para operadores binarios, funciones estándar y funciones anónimas.

Respuesta

8

Esto es una función simple que hace lo que quiere:

F <- function(x) deparse(substitute(x)[[1]]) 

F(mean(x=1:10)) 
# [1] "mean" 

F((function(x) print (x))(1)) 
# [1] "(function(x) print(x))" 

F(9+7) 
# [1] "+" 
1

No sé lo que estás tratando de hacer o si es una buena idea o si esto es lo que quiere, pero aquí hay un golpe en ella con expresiones regulares:

FUN <- function(x1){ 
    z <- deparse(substitute(x1)) 
    list(fun=strsplit(z, "\\(")[[c(1, 1)]], 
    eval=x1) 
} 

FUN(mean(x = 1:10)) 
Cuestiones relacionadas