从函数中访问正在调用的函数

时间:2015-11-06 09:19:02

标签: r

在函数中,我们如何可靠地返回包含函数本身的对象?

例如:

functionBuilder <- function(wordToSay) {
  function(otherWordToSay) {
    print(wordToSay)
    print(otherWordToSay)
    get(as.character(match.call()[[1]]))
  }
}

我可以像这样构建一个函数:

functionToRun <- functionBuilder("hello nested world")

...并运行它......

functionToRun("A")
#[1] "hello nested world"
#[1] "A"
#
#function(otherWordToSay) {
#        print(wordToSay)
#        print(otherWordToSay)
#        get(as.character(match.call()[[1]]))
#      }
#<environment: 0x1e313678>

...正如您所见,functionToRun会自行返回。但是,如果我通过sapply调用functionToRun,这种方法似乎会中断:

> sapply(LETTERS, functionToRun)
#[1] "hello nested world"
#[1] "A"
#Error in get(as.character(match.call()[[1]])) : object 'FUN' not found

我可以看到这是因为使用sapply时的实际调用是FUN但是{= 1}}在pos = -1(get的默认值)中不存在。在该位置工作的代码如下所示:

FUN

但如果未通过get(as.character(match.call()[[1]]),envir = sys.frame(sys.parent()))调用该函数,则相同的代码会失败,因为sapply过于靠后并最终引用sys.frame(sys.parent()))

从文档(R 3.2.2)开始,我预计R_GlobalEnv可能会解决只在需要时回到堆栈中的问题。虽然这适用于函数的dynGet调用,但是当函数自己调用时它会失败。 (此外,它被标记为“有点实验性”)。反向sapply似乎很有希望,但似乎不适用于getAnywhere被调用函数。

是否有一种可靠的方法来返回当前正在处理的函数,即是否适用于裸函数和sapply函数调用?

我现在正在做的是包装尝试在tryCatch中获取函数;但是我有点不确定我是否可以相信sapply会在所有包装案例中起作用(而不仅仅是为了讽刺)。所以,我正在寻找一种更合理的方法来解决这个问题。

潜在的相关问题:

1 个答案:

答案 0 :(得分:1)

我不能保证这会在所有情况下都有效,但看起来没问题:

fun <- function(x) {
  print(x)
  y <- exp(x)
  print(y)
  sys.function(0)
}

fun(1)
# [1] 1
# [1] 2.718282
# function(x) {
#   print(x)
#   y <- exp(x)
#   print(y)
#   sys.function(0)
# }
lapply(1:5, fun)[[3]]
# [1] 1
# [1] 2.718282
# [1] 2
# [1] 7.389056
# [1] 3
# [1] 20.08554
# [1] 4
# [1] 54.59815
# [1] 5
# [1] 148.4132
# function(x) {
#   print(x)
#   y <- exp(x)
#   print(y)
#   sys.function(0)
# }

当然,我不明白你需要什么。