2012-09-03 12 views
6

Qualcuno sa come scrivere una funzione F che accetta una funzione chiamata (diciamo, mean (x = 1:10)) come argomento e restituisce solo il nome di la funzione viene invocata (media)?estraendo una chiamata nome funzione da una funzione chiamata

I miei migliori tentativi finora sono riassunti di seguito

(function(x1){ 

    return(deparse(substitute(x1))) 

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

Modifica x1 (la chiamata di funzione) per l'espressione prima di de-analisi non sembra aiutare molto: che restituisce

(function(x1){ 

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

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

Se possibile, mi piacerebbe poter usare anche le funzioni anonime come argomento, quindi F deve restituire (funzione (x) stampa (x)) per (funzione (x) stampa (x)) (1). Se hai bisogno di chiarimenti sentiti libero di commentare. Grazie.

edit1: solo per notare, vorrei evitare di verificare la prima parentesi ed escopiare il codice prima di esso (per "mean (x = 1:10)" che restituirebbe "mean"), come " cattivo (Fun_nAme" è in realtà un nome di funzione legale in R.

domanda ha risposto: la risposta di Josh O'Brien è stato perfetto: la funzione F che soddisfa le condizioni di cui sopra è

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

funziona bene per operatori binari, funzioni standard e funzioni anonime

risposta

8

Ecco una funzione semplice che fa quello che vuoi:

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

Non so quello che stai cercando di fare o se è una buona idea o se questo è ciò che si vuole, ma qui è un colpo ad essa con espressioni regolari:

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

FUN(mean(x = 1:10)) 
Problemi correlati