【问题标题】:Relooping a function over its own output在自己的输出上重新循环函数
【发布时间】:2015-03-24 15:49:57
【问题描述】:

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

   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

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

【问题讨论】:

  • ?Recall 有一个例子

标签: r function loops repeat


【解决方案1】:

您可以为此使用 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】:

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

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

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

    【讨论】:

      【解决方案3】:

      循环在这里可以正常工作。

      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
      

      【讨论】:

        【解决方案4】:

        你可以试试递归函数:

        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
        

        【讨论】:

        • 在递归函数的定义中使用Recall 而不是rec_func 会更安全一些。
        • @Dason,实际上,我正在使用 Recall 编辑我的解决方案,但问题是,只是放置 Recall 而不是函数名称,我得到“错误:评估嵌套太深:无限递归 /选项(表达式=)?”以我的例子...
        • 您是否只替换函数内部的 rec_func ?您需要保持第一行中的 rec_func 相同。
        • @Dason,我正在尝试替换函数内部的 rec_func 调用,是的。奇怪的是,我试图简化我的功能(没有替换)并取消else 中的前两行并输入rec_func(myfunc(input), i-1) 并且还收到错误消息...
        • 我刚试了一下。看起来这更像是 R 不喜欢真正深度递归的问题。这是一个循环也可以正常工作的情况。基本上将其更改为使用 Recall 而是添加了几层嵌套并最终使 R 放弃,因为它认为它可能是无限递归。您可以通过将 i 设置为更小的值来查看 Recall 版本。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        相关资源
        最近更新 更多