在函数中,我们如何可靠地返回包含函数本身的对象?
例如:
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
会在所有包装案例中起作用(而不仅仅是为了讽刺)。所以,我正在寻找一种更合理的方法来解决这个问题。
潜在的相关问题:
答案 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)
# }
当然,我不明白你需要什么。