当前位置: 首页 > 知识库问答 >
问题:

R:添加两个if(){}else{}构造的意外行为

商俊智
2023-03-14

考虑以下R输入:

if(TRUE){1}else{0} + if(TRUE){1}else{0}

结果是1,但我期望2。如果我把每个If-else语句都用括号括起来,

(if(TRUE){1}else{0}) + (if(TRUE){1}else{0})

那么结果是2

有人能解释这种行为吗?

共有2个答案

方长卿
2023-03-14

这与决定评估顺序的操作员亲和力有关。像数学一样,括号比乘法有更高的优先级,比正负有更高的优先级。表达式的第二部分永远不会被计算,因此会被忽略,导致1例如if(TRUE){1}其他{0}消息(我永远不会打印)。包括括号将迫使首先评估两个部分分开,然后做加号,导致2。

那开济
2023-03-14

else子句直到R能够识别表达式的结尾才结束。在R中,{}不是if/else语句语法的一部分。{}可以在任何可能放置多个语句的地方使用。你也可以

if(TRUE) 1 else 0 + if(TRUE) 1 else 0 

{}没有真正意义。自从

 0 + if(TRUE) 1 else 0 

是一个有效的表达式,R只是假设您希望所有这些都用于else子句。通常,当R在完成的表达式后遇到换行符时,它将结束else子句。这意味着

if(TRUE){1}else{0} + 
   if(TRUE){1}else{0}

也将返回相同的值,因为第一行末尾的表示由于有效表达式不能以结尾,因此还会有更多内容。

注意:如果您真的很好奇的话,您可以在lobstr包的帮助下看到表达式是如何变成抽象语法树的。

#lobstr::ast(if(TRUE){1}else{0} + if(TRUE){1}else{0})
o-`if` 
+-TRUE 
+-o-`{` 
| \-1 
\-o-`+` 
  +-o-`{` 
  | \-0 
  \-o-`if` 
    +-TRUE 
    +-o-`{` 
    | \-1 
    \-o-`{` 
      \-0 

在这里,我们看到所有内容都嵌套在第一个if中。不是主运算符。

如上所述,可以使用(){}显式结束表达式块

{if(TRUE){1}else{0}} + {if(TRUE){1}else{0}}

同时考虑一下

x <- 5
if(FALSE) x+1 else x+2
# [1] 7
if(FALSE) x+1 else {x}+{2}
# [1] 7

注意对于else表达式,如何将x2放在一起。它不在第一个符号x处结束。

 类似资料:
  • 我们的组织有一个必需的编码规则(没有任何解释),即: if...else if构造应该用else子句终止 示例1:

  • 问题内容: 我可以在angularjs表达式中以某种方式使用if-then-else构造(三元运算符),例如,我有必须返回bool值的函数$ scope.isExists(item)。我想要这样的东西 我知道我可以使用返回字符串的函数,对于在表达式中使用if-then-else构造的可能性我很有趣。谢谢。 问题答案: 角表达式在1.1.5之前不支持三元运算符,但可以这样模拟: 因此,在示例中,类似

  • Perl条件语句有助于决策,这需要程序员指定一个或多个要由程序评估或测试的条件,以及在条件被确定为真时要执行的一个或多个语句,以及可选的其他条件如果确定条件为假,则执行语句。 以下是大多数编程语言中的典型决策结构的一般性 - 数字0,字符串'0'和“”,空列表()和undef在布尔上下文中都是false ,所有其他值都为true 。 否定真正的价值! 或not返回特殊的假值。 Perl编程语言提供

  • if 是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行 if 后由大括号括起来的代码块,否则就忽略该代码块继续执行后续的代码。 if condition { // do something } 如果存在第二个分支,则可以在上面代码的基础上添加 else 关键字以及另一代码块,这个代码块中的代码只有在条件不满足时才会执行。if 和 else 后的两个代码块是相互独立的分

  • 本文向大家介绍C# if, if...else, if... else if ,包括了C# if, if...else, if... else if 的使用技巧和注意事项,需要的朋友参考一下 示例 该if语句用于控制程序的流程。一条if语句根据Boolean表达式的值标识要运行的语句。 对于单个语句,braces{}是可选的,但建议使用。 该if还可以有一个else条款,将在案件条件的计算结果来执

  • if语句之后可以跟一个可选的else if...else语句,这对于使用单个if ... else if语句测试各种条件非常有用。 当使用if...else if…else语句时,请记住 - 一个if可以有零个或一个else语句,它必须在任何其他if之后。 如果语句可以有零到多个if,它们必须在else之前。 一旦else if成功,其余的if或else语句都不会被测试。 if ... else