我用以下方式在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
构造或通过源代码时出现语法错误...
上面的函数会导致语法错误,但实际上它可以工作!这是怎么回事?
感谢您的帮助。
答案 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
。
这里,外部{}
是解析器的提示,内部的所有内容都是单个表达式,因此解析和解释在到达最终}
之前不应该终止。这正是函数中发生的事情,因为函数体具有{}
。