获取函数名称作为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))