R 中的隐式与显式 if/else,括号更改输出?

Implicit vs explicit if/else in R, brackets change output?

当 if/else 语句在函数中隐式使用而不是显式指定 if/else 语句中包含的表达式时,我很难理解某些 R 行为。

这个玩具功能如我所料,在收到 TRUE 时打印 "x is TRUE" 并在收到 FALSE 时打印 "x is FALSE"

f1 <- function(x){
  if (x)
    print("x is TRUE")
  else 
    print("x is FALSE")
}

> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE)
[1] "x is FALSE"
>

但是,如果我向它添加一个隐式的嵌套 if 语句,它就会停止按我预期的方式运行。下面的函数应该与上面的函数完全一样,但是当传递 FALSE.

时它什么也不打印
f1 <- function(x){
  if (x)
    if(TRUE)
      print("x is TRUE")
  else 
    print("x is FALSE")
}

> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE) # No output?
> 

最后,如果我添加括号来指定排列并使 if/else 显式化,它将再次按预期运行:

f1 <- function(x){
  if (x){
    if (TRUE)
      print("x is TRUE")
  } else {
    print("x is FALSE")
  }
}

> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE)
[1] "x is FALSE"
>

在网上搜索这个问题时,我看到了两个隐约相关的答案。一个讨论an issue with brackets not working but doesn't discuss different output if the brackets are missing entirely, and the other discusses the famous "Unexpected 'else' in 'else' error。从他们那里,我开始明白 R 可能将 if 语句解释为它自己的行,但我不明白为什么函数或任何意外的 else 没有抛出错误其他输出。

有人可以帮我理解 R 的控制流逻辑吗?

像许多语言一样,R 贪婪地将 else 附加到最近的 if。所以你的代码没有按照 R 读取它的方式缩进,即

  if (x)
    if(TRUE)
      print("x is TRUE")
    else 
      print("x is FALSE")

if(TRUE) 语句获取 else,并且由于 TRUETRUE,因此永远不会执行 else

R 中的一个奇怪之处在于,如果您将它们直接输入到控制台而不是在函数中,那么它们的行为会有所不同。然后贪心的把语句写完,所以我上面写的会是语法错误:

  if (x)
    if(TRUE)
      print("x is TRUE")

是一个完整的语句,所以会被执行。然后当你输入 else 时,你会得到一个错误,因为 else 不允许开始一个语句。