首页 > 解决方案 > R中的自引用嵌套函数?

问题描述

所以,我正在尝试编写一个递归构建大型复杂公式的函数。基本上,我想简单地工作如下:

f <- function(x) {
  g <- function(y) y
  for( i in 1:4 ) {
    h <- g
    g <- function(y) h(y)^2
  }
  g(x)
}

请不要嘲笑这种疯狂的动机。现在我想要得到的是一个返回 ((((x^2)^2)^2)^2) 的函数,但实际发生的是我的运行时立即崩溃,可能是因为有某种调用到一个未引用的函数或其他东西,因为我g每次都覆盖表达式(显然我真的不知道 r 在这种情况下是如何工作的)。

我如何才能实现保留旧g参考资料的想法?

标签: r

解决方案


1)递归我们可以像这样使用递归:

h1 <- function(f, n) if (n == 1) f else function(x) f(h1(f, n-1)(x))

# test using g from questioun
h1(g, 4)(3)
## [1] 43046721

(((3^2)^2)^2)^2
## [1] 43046721

2)Reduce这用于迭代地与自身Reduce组合一个函数。fn

h2 <- function(f, n) function(y) Reduce(function(x, f) f(x), rep(list(f), n), y)

h2(g, 4)(3)
## [1] 43046721

3) 对于

h3 <- function(f, n) {
  function(x) {
   for(i in 1:n) x <- f(x)
   x
  }
}

h3(g, 4)(3)
## [1] 43046721

4)固定如果有一个小的固定数字,我们可以明确地写出来:

h4 <- function(x) g(g(g(g(x))))

h4(3)
## [1] 43046721

5) ComposeCompose我们可以使用功能包 稍微简化上述任何内容。(purrr 包也有一个compose功能。如果您已经在使用 purrr,请使用它;否则,功能的占用空间更小。)

library(functional)

h1a <- function(f, n) if (n == 1) f else Compose(f, h(f, n-1))

h2a <- function(f, n) Reduce(Compose, rep(list(f), n))

h2b <- function(f, n) do.call(Compose, rep(list(f), n))

h3a <- function(f, n) {
  for(i in 1:n) ff <- if (i == 1) f else Compose(ff, f)
  ff
}

h4a <- Compose(g, g, g, g)

推荐阅读