【问题标题】:Eliminating a while loop消除一个while循环
【发布时间】:2020-11-02 06:23:00
【问题描述】:

我有这段代码,我想知道它是否可以在没有 while 循环的情况下执行。

quantity <- vector()        
while (length(quantity) < 2) {                
       Random <- runif(10, 0, 1)                   
       quantity <- which(Random < 0.3)        
}
quantity 

【问题讨论】:

  • 由于不清楚需要多少次迭代才能完成,while 循环在这里最合适。不知道你为什么要在这里消除while 循环;你到底想用什么替换它?

标签: r performance loops


【解决方案1】:

你可以定义一个递归函数。

set.seed(42)
foo <- function() {
  random <- runif(10, 0, 1)
  quantity <- which(random < .3)
  if (length(quantity) >= 2) return(quantity)
  else return(foo())
}
foo()
# [1] 3 8

检查:

set.seed(42)
quantity <- vector()        
while (length(quantity) < 2) {                
  Random <- runif(10, 0, 1)                   
  quantity <- which(Random < 0.3)        
}
quantity 
# [1] 3 8

【讨论】:

  • 我怀疑递归函数是否与您的基准测试结果一样快。
  • @Hugh 我也很惊讶,你可以自己试试:microbenchmark::microbenchmark('while'={quantity &lt;- vector();while (length(quantity) &lt; 2) {Random &lt;- runif(10, 0, 1);quantity &lt;- which(Random &lt; 0.3)};quantity},foo=foo())
  • 我认为foo 是一个函数。考虑将您的第一个包裹在 local 中,然后您就不会得到区别。 microbenchmark::microbenchmark('while'=local({quantity &lt;- vector();while (length(quantity) &lt; 2) {Random &lt;- runif(10, 0, 1);quantity &lt;- which(Random &lt; 0.3)};quantity}),foo=foo())
  • @Hugh 我确定现在替补席是假的。有趣的是我从未使用过local。但是,当我还包装 local(foo)) 时,我得到的结果甚至不同。所以我将while 代码包装到一个函数中,现在得到与foo 相似的结果。
  • 我认为正在发生的事情是 R 认识到,对于 foo,一旦函数返回,内部变量就可以被丢弃,但在 while 中,它必须挂在它们上面(并因此为它们分配内存)等
猜你喜欢
  • 2019-03-08
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2015-05-11
  • 2012-10-28
  • 2019-03-15
相关资源
最近更新 更多