为什么as.numeric(1)==(3 | 4)评估为TRUE?

时间:2018-06-03 23:10:35

标签: r

我想使用h == 1 | 2进行简单的比较,其中h可以是1到4之间的整数。令我惊讶的是,它没有用。

我可以理解为什么

  

1 == 2 | 4

     

TRUE

甚至可能为什么

  

1 ==(2 | 4)

     

TRUE

但为什么以所有合理和理智的名义

  

as.numeric(1)==(2 | 4)

  

1L ==(2 | 4)

  

3 == 2 | 4

评估为

  

TRUE

???

如何让R告诉我1 is equal to 2 or 4和答案是FALSE

3 个答案:

答案 0 :(得分:7)

1 == 2 | 4

Operator precedence告诉我们它等同于(1 == 2) | 4

1 == 2FALSE,4被强制为逻辑(因为|是逻辑运算符),as.logical(4)TRUE,所以你拥有FALSE | TRUE 1}},即TRUE

确实coercion rules for logical operators?Logic)告诉我们:

  

数字和复杂矢量将被强制转换为逻辑值   零为假,所有非零值均为真。

3 == 2 | 4

同样的事情

1 == (2 | 4)

2 | 4将被强制转移到TRUE | TRUE,即TRUE。然后1 == TRUE被强制转移到1 == 1 TRUE

确实coercion rules for comparison operators?Comparison)告诉我们:

  

如果两个参数是不同类型的原子矢量,则一个是   强迫对方的类型,优先顺序(递减)   是字符,复数,数字,整数,逻辑和原始。

as.numeric(1) == (2 | 4)

同样的事情

1L == (2 | 4)

再次

1等于2或4

实际上(1等于2)或(1等于4),即:

(1==2)|(1==4)

FALSE | FALSE

FALSE

答案 1 :(得分:4)

正在运行2|4评估为TRUE。这就是您在比较TRUE时获得1 == TRUE的原因。您要评估的是(1 == 2) | (1 == 4),这会产生所需的FALSE

答案 2 :(得分:3)

将在第一句话中提供隐含问题的预期答案的代码是:

1 %in% 2:4
[1] FALSE

h=1
h %in% 1:2
[1] TRUE

" =="运算符不会从逻辑连接隐式生成范围(或备选方向)。它被认为是一个"比较" - 操作员,并且是#34;泛型"这意味着不同数据类型的方法可能不同。它们也是矢量化的(有效的隐式回收规则),因此可能返回许多值:

(1:2) == (1:4)
[1]  TRUE  TRUE FALSE FALSE

应用于值as.numeric()的{​​{1}} - 函数将完全返回输入。

进一步评论:由于您尝试使用" =="实际上是一个隐式设置操作,您可能想查看1的帮助页面。还有处理更复杂的集合函数的包。

R&C的强制可以在逻辑和数字之间来回转换,具体取决于函数的定义方式:

?intersect