在它自己的输出上重新循环一个函数

Relooping a function over its own output

我已经定义了一个函数,我想多次将其重新应用于它自己的输出。我试过了

   replicate(1000,myfunction)

但意识到这只是将我的函数应用于我的初始输入 1000 次,而不是每次都将我的函数应用于新输出。实际上我想要的是:

    function(function(...function(x_0)...))

1000 次以上,能够看到每个阶段的变化。

我之前将b定义为某个长度为7的向量

        b_0=b
        C=matrix(0,7,1000)
        for(k in 1:1000){
            b_k=myfun(b_(k-1))
            }
        C=rbind(b_k)
        C

这是我想要的正确想法吗?

你可以试试递归函数:

rec_func <- function(input, i=1000) {
                if (i == 0) {
                   return(input)
                } else {
                   input <- myfunc(input)
                   i <- i - 1
                   rec_func(input, i)
                }
            }

例子

myfunc <- function(item) {item + 1}
> rec_func(1, i=1000)
[1] 1001

纯函数式编程方法,使用 functional 包中的 Compose

library(functional)

f = Reduce(Compose, replicate(100, function(x) x+2))
#> f(2)
#[1] 202

但是这个解决方案不适用于太大的n!很有意思。

您可以为此使用 Reduce。例如

add_two <- function(a) a+2
ignore_current <- function(f) function(a,b) f(a)

Reduce(ignore_current(add_two), 1:10, init=4)
# 24

通常 Reduce 期望迭代一组新值,但在这种情况下,我使用 ignore_current 删除序列值 (1:10),以便只使用参数来控制我们重复这个过程的次数。这与

相同
add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(add_two(4))))))))))

循环在这里工作得很好。

apply_fun_n_times <- function(input, fun, n){
  for(i in 1:n){
    input <- fun(input)
  }
  return(input)
}

addone <- function(x){x+1}

apply_fun_n_times(1, addone, 3)

这给出了

> apply_fun_n_times(1, addone, 3)
[1] 4