【问题标题】:Why if-else statement without brackets sometimes works and sometimes not?为什么不带括号的 if-else 语句有时有效,有时无效?
【发布时间】:2017-02-06 17:13:50
【问题描述】:

我现在很困惑!首先我了解到这在 R 中是不可能的,但我经常忘记它,它有时会起作用。然后它再次不起作用!我开始认识到这种模式 - 它适用于 for 循环或另一个块语句,但不适用于外部:

for (i in 1:10) {

    if (0) 
        a <- 1
    else
        a <- 2

    b <- 3
}

对我来说没有意义……有什么解释吗?和手动参考?在我阅读的每个 R 资源中,似乎都需要括号:

if (0) {
    a <- 1
} else {
    a <- 2
}

PS:不是重复的,标记的问题甚至不谈论没有括号的变体,这是我问题的核心。讲的是换行的必要性。

【问题讨论】:

  • @ZheyuanLi 这不是一个重复的人,他们甚至不谈论没有括号的变体,这是我问题的核心。他们在谈论换行的必要性。
  • @ZheyuanLi 伙计,我不知道你在说什么。 这是一个不同的问题。这可能是由于 R 解析器的同一部分,但我看不到那么远。
  • 这就是运行一段代码和逐行运行代码的区别吧?

标签: r


【解决方案1】:

有什么解释吗?

这里的简短回答是您需要使用方括号或将else 子句与if 放在同一行。来自the documentation

当 if 语句不在块中时,如果存在 else,则必须 与语句 2 的结尾出现在同一行。否则新 statement2 末尾的行完成了 if 并产生 a 被评估的语法完整的语句。

所以,你可以使用这个:

for (i in 1:10) {
    if (0) {
        a <- 1
    }
    else {
        a <- 2
    }
    b <- 3
}

或者这个:

for (i in 1:10) {
    if (0) a <- 1 else a <- 2
    b <- 3
}

【讨论】:

  • 对不起,我不明白你的回答。你如何解释 if 语句在 for 循环外部或内部的区别?
  • 糟糕,抱歉——错过了for 方面。在您的陈述之后添加分号以分隔它们。我也会更新答案。
【解决方案2】:

当整个“if”语句用大括号括起来时(如在函数体中),您不需要“else”与“if”的右括号位于同一行。

此代码产生语法错误:

a <- 1
if (a >1)
{
  print("a is greater than 1")
}
else
{
  print ("a is not greater than 1")
}

虽然没有,只是因为添加了第一个和最后一个括号:

{
  a <- 1
  if (a >1)
  {
    print("a is greater than 1")
  }
  else
  {
    print ("a is not greater than 1")
  }
}

【讨论】:

  • 我喜欢这个答案,因为它消除了for 的干扰,直截了当。
【解决方案3】:

我想为问题的为什么部分做出贡献 - 为什么有两种不同的可能性

hrbrmstr 在此SO question 中声明以下内容

当初始 if 后跟复合表达式(由 {} 对指示)时,默认情况下解析器将期望表达式后跟 else 也是复合表达式。 else 的唯一定义用途是复合表达式。这甚至在文档中都有说明: if(cond) cons.expr else alt.expr 其中 cons.expr 和 alt.expr 被定义为复合。正如@Berry 指出的那样,您可以使用 R 解析函数定义的方式来解决这个问题,但最好在括号使用中保持一致(IMO)。

Berry Boessenkool 写道:

R 逐行读取这些命令,因此它认为您在执行 if 语句之后的表达式后就完成了。请记住,您可以使用 if 而不添加 else。

【讨论】:

  • 我看不到这个。您能否解释一下“复合表达式”的含义以及它与此的关系?
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多