R - 在嵌套函数中使用替代

标签 r substitution

我有一个可能最终被嵌套的函数 (Inner) 和我正在调用的一些其他函数(通常这个函数不会为人所知) Outer,并且我希望 Inner 能够产生相同的结果,而不管包装函数如何(Outer 在下面的例子中)。

Inner <- function(x,baz,bang){
  # code stuff things ...
  x.prime = as.character(substitute(x))
  return(c(x.prime,y,z))
}

Outer <- function(y){
  Inner(y)
}
Inner(a)
# "a" "stuff" "things" , which is what I'm expecting, in particular the "a".
Outer(a)
# "y" .... , but I was expecting to get "a"?

当然,如果有人知道更好的方法,我不会死心塌地地使用替代品。

有没有人知道如何让 Inner 输出相同的结果,无论它是否嵌套?

提前致谢。

最佳答案

这是一个应该可以帮助您解决问题的大纲:

Inner <- function(x) {
  my.call <- quote(substitute(x))    # we quote this here because we are going to re-use this expression
  var.name <- eval(my.call)

  for(i in rev(head(sys.frames(), -1L))) { # First frame doesn't matter since we already substituted for first level, reverse since sys.frames is in order of evaluation, and we want to go in reverse order
    my.call[[2]] <- var.name         # this is where we re-use it, modified to replace the variable
    var.name <- eval(my.call, i)
  }
  return(var.name)
}
Outer <- function(y) Inner(y)
Outer2 <- function(z) Outer(z)

现在让我们运行函数:

Inner(1 + 1)
# 1 + 1
Outer(2 + 2)
# 2 + 2
Outer2(3 + 3)
# 3 + 3

Inner 总是返回最外层的表达式(你看不到 yz,只是在 .GlobalEnv 中输入的表达式。

这里的技巧是使用 sys.frames(),并重复 substitute 直到我们到达顶层。

请注意,这里假设所有“外部”函数只是将它们的参数转发给下一个内部函数。如果你有类似的事情,事情可能会变得更加复杂/不可能:

Outer <- function(y) Inner(y + 1)

此代码不会检查此类问题,但您可能应该在代码中检查。另外,请记住,这里的假设是您的函数只会从 R 命令行调用。如果有人将他们的函数包装在您的函数中,您可能会得到意想不到的结果。

关于R - 在嵌套函数中使用替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26557731/

相关文章:

r - 将函数列表应用于矩阵并返回矩阵作为 R 中的结果

r - 如何在 R 中计算 KNN 变量重要性

wolfram-mathematica - Mathematica 中的符号替换问题

JavaScript:您可以在创建时将变量替换为匿名函数吗?

regex - 这个替换有什么问题?

css - R Shiny-CSS react 消息

r - R中的HMM包错误

linux - 在 Makefile 中使用 xargs basename

r - 如果未分配则打印

javascript - 将用户 HTML 输入作为 javascript 函数参数传递