2012-09-03 6 views
6

Кто-нибудь знает, как написать функцию F, которая принимает вызов функции (например, mean (x = 1:10)) в качестве аргумента и возвращает только имя вызываемая функция (средняя)?извлечение имени вызова функции из вызова функции

Мои лучшие попытки до сих пор приведены ниже

(function(x1){ 

    return(deparse(substitute(x1))) 

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

Изменение x1 (вызов функции) в выражение перед де-анализа, кажется, не очень помогает: что возвращает

(function(x1){ 

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

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

Если это вообще возможно, я бы хотел использовать анонимные функции в качестве аргумента, поэтому F должен вернуться (функция (x) print (x)) для (function (x) print (x)) (1). Если вам нужно какое-либо разъяснение, не стесняйтесь комментировать. Благодарю.

Редактирование 1: просто для того, чтобы отметить, я хотел бы избежать проверки первой скобки и вырезания кода перед ним (для «mean (x = 1:10)», который вернет «mean»), поскольку « плохо (Fun_nAme»на самом деле является юридическое название функции в R.

Вопрос ответ: ответ Джош О'Брайена был совершенен: функция F, что удовлетворяет указанным выше условиям,

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

Он работает для двоичных операторов, стандартных функций и анонимных функций.

ответ

8

Вот простая функция, которая делает то, что вы хотите:

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

Я не знаю, что вы пытаетесь сделать, или, если это хорошая идея или, если это то, что вы хотите, но вот сильный удар у него с регулярным выражением:

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

FUN(mean(x = 1:10)) 
Смежные вопросы