【问题标题】:if - else if - else statement and bracketsif - else if - else 语句和括号
【发布时间】:2014-11-11 04:22:14
【问题描述】:

我理解写“if - else if”语句的常用方法如下:

if (2==1) {
  print("1")
} else if (2==2) {
  print("2")
} else {
  print("3")
}

if (2==1) {print("1") 
} else if (2==2) {print("2")
} else print("3")

相反,如果我这样写

if (2==1) {
  print("1")
} 
else if (2==2) {
  print("2")
}
else (print("3"))

或者这样:

if (2==1) print("1") 
else if (2==2) print("2")
else print("3")

该语句不起作用。你能解释一下为什么} 必须在同一行中的elseelse if 之前吗?有没有其他方法可以在 R 中编写 if-else if-else 语句,尤其是不带括号的?

【问题讨论】:

  • 当初始 if 后跟一个复合表达式(由 {} 对指示)时,默认情况下解析器会期望 else 后跟的表达式也是复合表达式。 else 的唯一定义用途是复合表达式。这甚至在文档中都有说明:if(cond) cons.expr else alt.expr 其中cons.expralt.expr 被定义为复合。正如@Berry 指出的那样,您可以使用 R 解析函数定义的方式来解决这个问题,但最好在括号使用中保持一致(IMO)。
  • 如果你将不寻常的 if-else 括在括号 { bad if-else expr } 或更常见的函数 function() { bad if-else expr} 中,它也会起作用
  • 我很遗憾“重新格式化代码”(在 RStudio 中)没有将 else 格式化到正确的位置。它可以看到这个问题,恕我直言。

标签: r if-statement


【解决方案1】:

R 逐行读取这些命令,因此它认为您在执行 if 语句之后的表达式后就完成了。请记住,您可以使用if而不添加else

您的第三个示例将在函数中运行,因为整个函数在执行之前定义,所以 R 知道它还没有完成(在 if() do 之后)。

【讨论】:

  • 我在一个函数中尝试过,我的第三个和第四个例子都在函数中工作。谢谢
  • 这在 R-inferno 的第 8.1.43 节 btw 中有所提及。
【解决方案2】:

在 R 中,我们也有 ifelse() 函数:

ifelse(1 < 0, "hello", "hi")

输出:

# [1] "hi"

【讨论】:

    【解决方案3】:

    正如hrbrmstr 所说:

    当初始 if 后跟复合表达式时(由 {} 对)默认情况下解析器将期望表达式 其次是 else 也是复合的。 else 的唯一定义使用 是复合表达式。

    在语句if(cond) cons.expr else alt.expr 中,else 需要放在结尾的 `cons.expr' 复合词之后并与该复合词在同一行中。

    所以如果你想让你的代码在没有括号的情况下看起来更好看,可以这样应用:

    if (2==1) print("1") else 
       if (2==2) print("2") else 
          print("3")
    

    【讨论】:

      【解决方案4】:

      ifelse 具有树参数、第一个条件、第二个真结果和最后一个假结果。

      y_pred = ifelse(prob_predict > 0.5,1,0)
      

      【讨论】: