【问题标题】:Set variable within while statement在 while 语句中设置变量
【发布时间】:2021-02-02 10:39:05
【问题描述】:

R 是否允许在 while 语句中定义变量?只要两个条件之一为真,我就有一个 while 循环应该继续。但是,我还需要 while 循环中两个条件的结果。计算条件的函数计算量很大,因此不能简单地重新计算它们。

while (a = conditionA() || b = conditionB())
{
  do_some_work(a)
  some_more_work(a, b)
}

我目前的解决方法如下。

a = conditionA()
b = conditionB()

while (a || b)
{
  do_some_work(a)
  some_more_work(a, b)

  a = conditionA()
  b = conditionB()
}

但是,你们都明白这个解决方案只是感觉不对。其中,它污染了 while 循环之外的范围,并且不希望添加不必要的代码行。

或者,我们可以使用repeat,如评论中提到的帖子中所述。虽然这样可以避免污染循环外的范围,但在 IMO 中,它的可读性不如在 while 语句中定义变量。

repeat
{
  a = conditionA()
  b = conditionB()

  if (!a && !b)
    break

  do_some_work(a)
  some_more_work(a, b)
}

【问题讨论】:

  • 也许这会有所帮助:do-while loop in R
  • 对我来说,第二个块是在R 中使用while 的惯用方式。此外,这也是我在C++ 中使用的方式,因为编译器没有任何好处,而且对我来说更具可读性。我想这是一个品味问题。

标签: r while-loop


【解决方案1】:

你可以在条件中使用<-:

conditionA <- function() sample(c(T,F), 1)
conditionB <- function() sample(c(T,F), 1)

do_some_work <- function(a) cat("a", a, fill = TRUE)
do_some_more_work <- function(a, b) cat("a", a, "b", b, fill = TRUE)

set.seed(1)
while((a <- conditionA()) | (b <- conditionB())){
 
 do_some_work(a)
 do_some_more_work(a,b)
 
}
#> a TRUE
#> a TRUE b FALSE
#> a TRUE
#> a TRUE b TRUE
#> a FALSE
#> a FALSE b TRUE
#> a TRUE
#> a TRUE b TRUE

# The loop ends when both a and b are FALSE
a
#> [1] FALSE
b
#> [1] FALSE

由reprex package (v0.3.0) 于 2020 年 10 月 19 日创建

如果你使用||,它不起作用。

如果你真的想使用||,你需要这样写你的while语句:

while({a <- conditionA(); b <- conditionB(); a || b}){

 # ...

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多