if {...} else {...}:“}”和“else”之间的换行真的很重要吗?

时间:2016-06-20 18:16:28

标签: r if-statement

我用以下方式在R中编写if {...} else {...}语句,因为我觉得它更具可读性。

Testifelse = function(number1)
{
     if(number1>1 & number1<=5)
     {
          number1 =1
     }
     else if ((number1>5 & number1 < 10))
     {
          number1 =2
     }
     else
     {
          number1 =3
     }

     return(number1)
}

根据?Control

  

...特别是,您不应该在}else之间添加换行符,以避免在键盘输入if ... else构造或通过源代码时出现语法错误...

上面的函数会导致语法错误,但实际上它可以工作!这是怎么回事?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

原始问答

如果我们放入R控制台:

if (1 > 0) {
  cat("1\n");
  }
else {
  cat("0\n");
  }

为什么它不起作用?

R是一种解释型语言,因此R代码逐行解析。 (注释@JohnColeman:这个判断太宽泛了。任何现代解释器都会做一些解析,并且解释像Python这样的语言没有类似于R问题的问题。这是R的制作者做出的一个设计决定,但是由于它被解释的事实,它并没有被强加于他们的决定。 (虽然无疑使得翻译更容易编写)。)

由于

if (1 > 0) {
  cat("1\n");
  }

制作完整的合法声明,解析器会将其视为完整的代码块。然后,以下

else {
  cat("0\n");
  }

将遇到错误,因为它被视为新的代码块,而没有以else开头的控制语句。

因此,我们真的应该这样做:

if (1 > 0) {
  cat("1\n");
  } else {
  cat("0\n");
  }

这样解析器就可以毫不费力地将它们识别为整个块。

在像C这样的编译语言中,没有这样的问题。因为在编译时,编译器可以&#34;看到&#34;所有代码行。

最终更新与功能内部的内容有关

这里真的没有魔力!关键是使用{}手动指示代码块。我们都知道在R,

{statement_1; statement_2; ...; statement_n;}

被视为单个表达式,其值为statement_n

现在,让我们来做:

{
  if (1 > 0) {
    cat("1\n");
    }
  else {
    cat("0\n");
    }
}

它可以工作并打印1

这里,外部{}是解析器的提示,内部的所有内容都是单个表达式,因此解析和解释在到达最终}之前不应该终止。这正是函数中发生的事情,因为函数体具有{}