我有函数f1
和f2
将函数作为参数,例如:
f1 <- function(FUN) {
...
}
f2 <- function(FUN) {
f1(FUN=FUN)
}
从函数f1
内部,我需要找回传递给f2
的函数的原始名称,例如"myFunc"
,而不是"FUN"
。
基本上我们可以设想一个函数f1
,以便f2(f1(mean))
返回"mean"
吗?如果FUN
是匿名的,我们可以返回NULL
或NA
。
在R中有一种简单/标准的方法吗?我试图使用手动搜索相同的功能代码(但它不是很干净,我正在寻找更好的解决方案)
fn = unlist(as.list(lsf.str(envir=.GlobalEnv)))
for (f in fn) {
if (setequal(paste(body(myFunc)),paste(body(f)))) {
return(f)
}
}
答案 0 :(得分:1)
您也可以使用lazyeval
包:
f1 <- function(FUN) {
lazyeval::expr_text(FUN)
}
f2 <- function(FUN) {
f1(FUN = FUN)
}
f2(f2(f2(mean)))
[1] "f2(f2(mean))"
这对我有用:
f1 <- function(FUN) {
eval(quote(substitute(FUN)), envir = parent.frame())
}
f2 <- function(FUN) {
f1(FUN=FUN)
}
f2(mean)
在这种情况下,f1
会评估f2环境中的substitute(FUN)
来电。
见theese结果:
> f2(mean)
mean
> f2(function(x) {NULL})
function(x) {
NULL
}
如果您希望输出为字符串,则需要使用deparse
,然后可以定义f1:
f1 <- function(FUN) {
eval(quote(deparse(substitute(FUN))), envir = parent.frame())
}
答案 1 :(得分:1)
在大多数情况下,以下功能会给出原始名称。
find.original.name <- function(fun) {
objects <- ls(envir = environment(fun))
for (i in objects) {
if (identical(fun, get(i, envir = environment(fun)))) {
return(i)
}
}
}
a <- ls
find.original.name(a)
# [1] ls
a <- glm
find.original.name(a)
# [1] "glm"
a <- function() print("test")
find.original.name(a)
# [1] "a"
但是如果功能的副本(确切地说,它不是副本)和原始功能在同一环境中,则此功能无法正常工作......
test <- function() print("test")
a <- test
find.original.name(a)
# [1] "a"