为什么 if 和 else 语句不能在 R 中的不同行上

Why can't if and else statements be on separate lines in R

为什么在 R 中使用 if else 语句时,“else”不能换行,除非整个语句嵌套在另一种形式的语句、循环或函数中?

例如,下面的代码不起作用:

x <- 5

if(x<10){
  print("x<10")
}
else{
  print("x>9")
}

但是,如果我们将整个内容放在一个循环中以便缩进,突然间它就可以正常工作了

for(i in 1:1){
  x <- 5
  
  if(x<10){
    print("x<10")
  }
  else{
    print("x>9")
  }
}

我知道 R 希望你像下面这样写:

x <- 5

if(x<10){
  print("x<10")
}else{
  print("x>9")
}

但我不喜欢它的外观,并且还想了解为什么仅当语句未嵌套在其他内容中时才需要这种语法/样式。

谢谢!

这与强制执行样式无关,但与 R 解析器的工作方式有关。本质上,当您的 if 子句在句法上完整且右括号末尾有一个换行符时,控制台认为您已完成该指令,并等待其下一条指令。但是 else 子句必须是 相同指令 的一部分。如果 next 指令以 else 开头,R 解析器不知道 else 指的是什么。

为了清楚起见,让我们演示一下。如果将以下代码粘贴到控制台中:

x <- 5

if(x<10){
print("x<10")
}

然后你会看到这个:

> x <- 5
>   
> if(x<10){
+   print("x<10")
+ }
[1] "x<10"
>

注意,如果一行代码在语法上是完整的,R 将 运行 代码,然后在下一行的开头打印控制台标记 >。如果粘贴的代码中存在换行符,但代码在语法上不完整,则控制台会在每行的开头放置一个 +,表明 R 解析器需要更多输入才能获得语法上完整的代码 运行.

但是如果你 运行 你的示例代码,看看会发生什么:

> if(x<10){
+   print("x<10")
+ }
[1] "x<10"
> else{
Error: unexpected 'else' in "else"
>   print("x>9")
[1] "x>9"
> }
Error: unexpected '}' in "}"

您的 if 语句及其关联的括号在语法上是一个完整的元素,因此 R 运行 代码。它按预期打印出 [1] "x<10",然后等待下一条指令。然而,它的下一条指令是 else {,并且 R 解析器知道 no 语法正确的 R 代码可以 start [=43] =]其他。 R 无法回到过去并撤消它在 if 子句中所做的事情只是因为您 随后 写了一个 else 子句。

因此,这与强制执行样式无关。您只需要一种在 if 子句之后对 R 说“我还没有完成”的方法。有多种方法可以做到这一点。例如,您的代码可以放在函数、循环或括号内。这些只是对 R 解析器说的方式:“不要 运行 代码,我还没有完成。”

x <- 5

{
  
if(x<10){
  print("x<10")
}
else{
  print("x>9")
}
  
}
#> [1] "x<10"

reprex package (v2.0.1)

创建于 2022-02-11