通过自己的输出重新加载函数

时间:2015-03-24 15:49:57

标签: r function loops repeat

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

   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

这是我想要的正确理念吗?

4 个答案:

答案 0 :(得分:3)

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

library(functional)

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

但是这个解决方案不适用于太大的n!非常有趣。

答案 1 :(得分:3)

你可以使用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))))))))))

答案 2 :(得分:2)

你可以尝试一个递归函数:

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

答案 3 :(得分:2)

循环在这里工作得很好。

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