2012-09-03 34 views
6

Czy ktoś wie, jak napisać funkcję F, która przyjmuje wywołanie funkcji (np. Średnią (x = 1:10)) i zwraca tylko nazwę wywoływana funkcja (średnia)?wyodrębnianie nazwy wywołania funkcji z wywołania funkcji

moich najlepszych prób dotychczas są podsumowane poniżej

(function(x1){ 

    return(deparse(substitute(x1))) 

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

Zmiana x1 (wywołania funkcji) do wyrażenia przed de-parsowania nie wydaje się, aby pomóc wiele, że zwraca

(function(x1){ 

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

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

Jeśli to w ogóle możliwe, chciałbym móc również używać anonimowych funkcji jako argumentów, więc powinien powrócić (funkcja (x) print (x)) dla (funkcja (x) print (x)) (1)). Jeśli potrzebujesz wyjaśnienia, prosimy o komentarz. Dzięki.

edit1: aby zauważyć, chciałbym uniknąć sprawdzania pierwszego nawiasu i wycinania kodu przed nim (dla "średniej (x = 1:10)", która zwróci "średnia"), jak " zły (Fun_nAme”jest w rzeczywistości prawnej nazwa funkcji w R.

Pytanie odpowiedź: odpowiedź Josh O'Briena była idealna: funkcja F który spełnia powyższe warunki jest

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

to działa ładnie dla operatorów binarnych, funkcji standardowych i funkcji anonimowych

Odpowiedz

8

Oto prosta funkcja, która robi to, co chcesz:

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

Nie wiem, co próbujesz zrobić, czy to dobry pomysł, czy to jest to, co chcesz, ale tutaj jest walnięcie na to z regex:

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

FUN(mean(x = 1:10)) 
Powiązane problemy