R 访问从函数中调用的函数
在函数中,如何可靠地返回包含函数本身的对象 例如:R 访问从函数中调用的函数,r,R,在函数中,如何可靠地返回包含函数本身的对象 例如: functionBuilder <- function(wordToSay) { function(otherWordToSay) { print(wordToSay) print(otherWordToSay) get(as.character(match.call()[[1]])) } } 我可以看出这是因为使用sapply时实际调用的是FUN,但是FUN在pos=-1处不存在(get的默认值)。在该
functionBuilder <- function(wordToSay) {
function(otherWordToSay) {
print(wordToSay)
print(otherWordToSay)
get(as.character(match.call()[[1]]))
}
}
我可以看出这是因为使用sapply时实际调用的是FUN
,但是FUN
在pos=-1处不存在(get的默认值)。在该位置工作的代码如下所示:
get(as.character(match.call()[[1]]),envir=sys.frame(sys.parent())
但是如果没有通过sapply
调用该函数,则相同的代码将失败,因为sys.frame(sys.parent())
返回太远,最终引用的是R\u GlobalEnv
从文档(R3.2.2)中,我希望dynGet
能够解决只在需要时回到堆栈中的问题。虽然这适用于函数的调用,但当函数被单独调用时,它会失败。(此外,它被标记为“有点实验性”)。相反地,getAnywhere
似乎很有希望,但似乎不适用于sapply
调用的函数
是否有可靠的方法返回当前正在处理的函数,即对裸函数调用和封装函数调用都有效
我现在正在做的是将获取函数的尝试包装在tryCatch中;但是我有点不确定是否可以相信get(as.character(match.call()[[1]])、envir=sys.frame(sys.parent())
在所有包装情况下都能工作(不仅仅是sapply)。所以,我正在寻找一种更合理的方法来解决这个问题
可能相关的问题:
我不能保证这在所有情况下都能起作用,但看起来还可以:
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)
# }
fun我认为它是非常通用的,但是我用它来实现一个类似于R.cache
的缓存层。所以,我想得到函数本身,这样我就可以对它进行消化,并将其作为散列的一部分来存储函数的结果,以确保缓存的结果与函数当前生成的结果相匹配。
> sapply(LETTERS, functionToRun)
#[1] "hello nested world"
#[1] "A"
#Error in get(as.character(match.call()[[1]])) : object 'FUN' not found
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)
# }