我有函数 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)
    }
}

最佳答案

您也可以使用 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) 调用。

查看这些结果:
> f2(mean)
mean
> f2(function(x) {NULL})
function(x) {
  NULL
}

如果希望输出为字符串,则需要使用 deparse ,然后可以定义 f1 :
f1 <- function(FUN) {
  eval(quote(deparse(substitute(FUN))), envir = parent.frame())
}

关于R:查找作为参数传递的函数的原始名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29911116/

10-12 00:02
查看更多