R:找到作为参数传递的函数的原始名称

时间:2015-04-28 05:36:38

标签: r function argument-passing

我有函数f1f2将函数作为参数,例如:

f1 <- function(FUN) {
    ...
}


f2 <- function(FUN)  {
   f1(FUN=FUN)
}

从函数f1内部,我需要找回传递给f2的函数的原始名称,例如"myFunc",而不是"FUN"

基本上我们可以设想一个函数f1,以便f2(f1(mean))返回"mean"吗?如果FUN是匿名的,我们可以返回NULLNA

在R中有一种简单/标准的方法吗?我试图使用手动搜索相同的功能代码(但它不是很干净,我正在寻找更好的解决方案)

fn = unlist(as.list(lsf.str(envir=.GlobalEnv)))
for (f in fn) {
    if (setequal(paste(body(myFunc)),paste(body(f)))) { 
      return(f)
    }
}

2 个答案:

答案 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"