获取函数名称作为string

假设我有一堆函数,每个函数都有类似MyFunction.1等。我想把这些函数传递给另一个函数,这个函数打印出一个小的报表。 理想情况下,我希望能够标记使用哪个函数生成结果的报告部分。

那么有没有什么好的方法来获取预定义函数的名称作为一个string?

我想要的是同样的东西,记得library(foo)不需要引号,这就是它所做的:

 package <- as.character(substitute(package)) 

另一种方法是将函数名称传递给你的报表函数,然后用get()命令获取函数本身。 例如:

 function.names <- c("which","all") fun1 <- get(function.names[1]) fun2 <- get(function.names[2]) 

然后你的原始字符向量中有名字,并且这些函数有你定义的新名字。 在这种情况下, all函数现在被称为fun2

 > fun2(c(TRUE, FALSE)) [1] FALSE 

或者,如果您确实想保留原始函数名称,只需使用assign函数在本地分配它们即可:

 assign(function.names[2], get(function.names[2])) 

如果你现在运行这个命令,你将会在你的".GlobalEnv"使用all函数。 你可以看到这个ls()

这可能导致parse(eval(...))在这一点上,你打开这个批评:

 R> library(fortunes) R> fortune("parse") If the answer is parse() you should usually rethink the question. -- Thomas Lumley R-help (February 2005) R> 

那么你的函数必须被称为MyFunction.1等pp?

你可以通过match.call得到函数的未被评估的参数。 例如:

 > x <- function(y) print(match.call()[2]) > x(lm) lm() 

当一个函数作为一个对象传递时,它就会失去它的名字。 例如,请参阅以下行的结果:

 str(lm) lm 

你可以得到参数和函数的主体,但不是名字。

我的build议是构build一个命名的函数列表,其中可以打印名称:

 > somefns <- list(lm=lm, aggregate=aggregate) > str(somefns) List of 2 $ lm :function (formula, data, subset, weights, na.action, method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...) $ aggregate:function (x, ...) > somefns[[1]](dist ~ speed, data=cars) Call: somefns[[1]](formula = dist ~ speed, data = cars) Coefficients: (Intercept) speed -17.58 3.93 > names(somefns)[[1]] [1] "lm" 

只是想举一个例子来说明这个问题的优点和局限性:

我想用它的名字“保存”一个函数,作为另一个函数中使用的一个选项:

 R> foreach(..., .combine=test_fun) {...} 

test_fun是函数的名字,当然

 R> mode(test_fun) [1] "function" 

当我在foreach中使用它时,我只需要函数名称,而test_fun可以是一个现有的函数(例如cbind )。 所以, test_fun是由

 R> test_fun <- get('cbind') 

要么

 R> test_fun <- assign('cbind', get('cbind')) 

所以,你在这里得到了这个function

 R> test_fun function (..., deparse.level = 1) .Internal(cbind(deparse.level, ...)) 

实际上,原来的名字不能被保留,所以你没有办法把test_fun转换回string"cbind"

 R> deparse(substitute(test_fun)) [1] "test_fun" 

我不幸的是需要deparse的foreach代码,所以想要显示在string中的原始名称。 这意味着唯一的方法是将'cbind'保存为一个string,创build这样一个函数对象在这种情况下没有任何好处。

那这个呢:

 deparse(quote(foo.bar))