【问题标题】:Infinite recursion error - how to solve?无限递归错误 - 如何解决?
【发布时间】:2017-03-10 23:07:30
【问题描述】:

对 R 来说还是新手,因此尝试练习使用函数,我创建了一些(可能效率很低)代码,稍后我将对其进行修改,目前它返回我需要的结果,但我想在其中重复模拟 100 次函数本身。这实际上是 turn[i] ,它以指定的函数概率返回结果 -1 或 1:

game = function(n,pr) {
turn = cumsum(2*rbinom(n,1,prob=pr)-1)
bankrupcy.test = which(turn == -25)
winner.test = which(turn == 50)
if(length(bankrupcy.test)==0){bankrupcy.test=c(0)}
if(length(winner.test)==0){winner.test=c(0)}
if(bankrupcy.test==0 && winner.test==0){turn[n]}else
if(bankrupcy.test[1]>winner.test[1]){-25}else{
50}
return(replicate(100,game(n)))
}

我已尝试创建一个 for 循环,但我似乎无法正确构建它,因此我希望在我创建的函数中使用复制命令,但是我收到以下错误:

“评估嵌套太深:无限递归/选项(表达式=)? 总结时出错:求值嵌套太深:无限递归 /options(expressions=)"

我哪里错了?我想返回一个包含上述模拟的 100 个结果的向量,其中游戏一直进行到获得 50 个利润或产生 25 个损失,以先发生者为准。如果前面的结果都没有出现,则采用向量的最终值。

【问题讨论】:

  • 你从函数内部调用game,所以game最终调用了它自己。这导致了递归。
  • 我认为可能是这种情况,但我还能如何在函数中复制模拟?唯一的方法是for循环吗?如果函数变得稍微复杂一点,我似乎永远无法让它们工作......
  • 您是否有理由希望在函数中进行复制?如果您删除 return(replicate(100,game(n))) 然后在函数之外运行 replicate(100, game(n = n, pr = pr)) 它应该可以工作(但也许我不明白您要做什么)
  • 我想进一步添加到函数中,所以会有额外的因素依赖于 100 个模拟(或更多)的最终向量,所以我有一个数据样本来返回有关信息.我将把函数扩展到更多的变量(function(x,y,z....) 并且向量中只有一个结果,目前还不能这样做。
  • 你能举个例子吗? IE。第一次调用函数时npr 的一些值?

标签: r function recursion replication infinite-recursion


【解决方案1】:

试试这个:

n <- 1000
pr <- 0.50

game <- function(n, pr) {
  result = 
    replicate(100, {{turn = cumsum(2*rbinom(n, 1,prob=pr)-1)
      bankrupcy.test = which(turn == -25)
      winner.test = which(turn == 50)
      if(length(bankrupcy.test)==0){bankrupcy.test = 0}
      if(length(winner.test)==0){winner.test = 0}
      if(bankrupcy.test==0 && winner.test==0){turn[n]} else
        if(bankrupcy.test[1]>winner.test[1]) {-25} else {50}
      }})
  return(result)
}

game(n, pr)

【讨论】:

  • 谢谢,这就是我正在寻找的结果,唯一的问题是如果我编写游戏(1000, 0.5),则让“函数中的函数”返回 100 值向量。一旦我开始尝试在大括号内执行此操作,错误就会继续发挥作用。
  • 查看我的编辑。我已经将replicate 函数移到了game 函数中。无需递归调用相同的函数,现在该函数以后需要执行的任何操作都可以访问结果。 :)
  • 为了获得良好的实践,最好将花括号内的代码移动到具有不同名称的自己的函数中,然后让game 过程调用该函数。并且还可以使模拟的数量动态化,但它确实有效。
猜你喜欢
  • 2015-05-21
  • 2019-03-09
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多