r - 如果 {...} 否则 {...} : Does the line break between "}" and "else" really matters?

标签 r if-statement

我写我的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 } and else to avoid a syntax error in entering a if ... 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/

相关文章:

python - 为什么else语句总是运行?

java - 如何请求 n 个数据点(x 和 y 坐标)的集合,直到 java 程序从第一个坐标读取空行?

受限玻尔兹曼机

r - R 中具有多个解释变量的细菌生长曲线(逻辑/S 形)

r - 使用ggplot2在散点图中用线连接点

c++ - 在 C++ 中的 if 中分配指针

r - 如何删除部分 PerformanceAnalytics 图表?

r - 如何在ggplot中实现绝对百分比?

r - 有条件地将字符串转换为特定数值

c# - Visual Studio 2010 - 更改语言属性