为什么if-else语句没有括号有时会起作用,有时候不行?

时间:2016-09-28 15:54:26

标签: r

我现在很困惑!首先我在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:不是重复,标记的问题甚至不讨论没有括号的变体,这是我的问题的核心。它正在谈论换行的必要性。

3 个答案:

答案 0 :(得分:2)

当整个“ if”语句括在大括号中时(如函数主体中一样),则不需要“ else”与“ if”的右括号位于同一行。 / p>

此代码产生语法错误:

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")
  }
}

答案 1 :(得分:0)

  

任何解释?

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

  

当if语句不在块中时,else(如果存在)必须   与statement2的结尾出现在同一行。否则新的   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
}

答案 2 :(得分:0)

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

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而无需添加其他。