Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 访问从函数中调用的函数_R - Fatal编程技术网

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)
# }