我想使用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
?
答案 0 :(得分:7)
1 == 2 | 4
Operator precedence告诉我们它等同于(1 == 2) | 4
1 == 2
是FALSE
,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