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