我写我的if {...} else {...}
以以下方式在 R 中声明,因为我发现它更具可读性。
Testifelse = function(number1)
{
if(number1>1 & number1<=5)
{
number1 =1
}
else if ((number1>5 & number1 < 10))
{
number1 =2
}
else
{
number1 =3
}
return(number1)
}
根据
?Control
:... In particular, you should not have a newline between
}
andelse
to avoid a syntax error in entering aif ... else
construct at the keyboard or via source ...
上面的函数会导致语法错误,但实际上它有效!这里发生了什么?
谢谢你的帮助。
最佳答案
原创问答
如果我们放入 R 控制台:
if (1 > 0) {
cat("1\n");
}
else {
cat("0\n");
}
为什么它不起作用?
R 是一种解释型语言,因此 R 代码是逐行解析的。 (@JohnColeman 的评论:这个判断太宽泛了。任何现代解释器都会做一些解析,像 Python 这样的解释语言在这里没有类似于 R 的问题。这是 R 的制造者做出的设计决定,但它不是t 一个由于被解释的事实而强加给他们的决定(尽管无疑它使解释器更容易编写)。
自从
if (1 > 0) {
cat("1\n");
}
做出完整的合法声明,解析器会将其视为完整的代码块。那么,以下
else {
cat("0\n");
}
会出错,因为它被视为一个新的代码块,而没有以
else
开头的控制语句.因此,我们真的应该这样做:
if (1 > 0) {
cat("1\n");
} else {
cat("0\n");
}
这样解析器就可以毫不费力地将它们识别为一个完整的 block 。
在像 C 这样的编译语言中,没有这样的问题。因为在编译时,编译器可以“看到”你代码的所有行。
与函数内部发生的事情有关的最终更新
这里真的没有魔法!关键是
{}
的使用手动指示代码块。我们都知道在 R 中,{statement_1; statement_2; ...; statement_n;}
被视为单个表达式,其值为
statement_n
.现在,让我们这样做:
{
if (1 > 0) {
cat("1\n");
}
else {
cat("0\n");
}
}
它可以工作并打印
1
.在这里,外部
{}
提示解析器内部的所有内容都是一个表达式,因此解析和解释在到达最终 }
之前不应终止.这正是函数中发生的事情,因为函数体有 {}
.
关于r - 如果 {...} 否则 {...} : Does the line break between "}" and "else" really matters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37929184/