我想用h == 1 | 2
做一个简单的比较,h
可以是1到4之间的整数。令我惊讶的是,它不起作用。
我大概能理解为什么
1 == 2|4
真的
甚至可能是为什么
1 == (2 | 4)
真的
但为什么以一切合理和理智的名义
as.numeric(%1) == (%2| 4)
或
1L == (2 | 4)
或
3 == 2|4
评估结果为
TRUE
???
我如何才能让R告诉我1 is equal to 2 or 4
和答案是否为FALSE
发布于 2018-06-04 07:16:22
1 == 2 | 4
Operator precedence告诉我们它等同于(1 == 2) | 4
1 == 2
是FALSE
,4被强制为逻辑(因为|
是一个逻辑运算符),as.logical(4)
是TRUE
,所以你有FALSE | TRUE
,那就是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
)告诉我们:
如果两个参数是不同类型的原子向量,则一个参数被强制转换为另一个参数的类型,优先级(降序)为字符、复杂、数字、整数、逻辑和raw。
as.numeric(1) == (2 | 4)
同样的事情
1L == (2 | 4)
又是一样的
1等于2或4
实际上是(1等于2)或(1等于4),即:
(1==2)|(1==4)
这就是
FALSE | FALSE
哪一个是FALSE
发布于 2018-06-04 07:14:06
运行2|4
的结果为TRUE
。这就是为什么在比较1 == TRUE
时会获得TRUE
。您想要评估的是(1 == 2) | (1 == 4)
,它会产生所需的FALSE
。
发布于 2018-06-04 07:45:54
为你的第一句话中隐含的问题提供预期答案的代码是:
1 %in% 2:4
[1] FALSE
h=1
h %in% 1:2
[1] TRUE
"==“运算符不会从逻辑合取中隐式生成范围(或备选方案的向量)。它被认为是一种“比较”-operator,是“泛型”的,这意味着对于不同的数据类型,方法可以是不同的。它们也是矢量化的(使用有效的隐式回收规则),因此可能会返回许多值:
(1:2) == (1:4)
[1] TRUE TRUE FALSE FALSE
并且应用于值1
的as.numeric()
-function将精确地返回输入。
进一步说明:由于您尝试使用的"==“实际上是一个隐式的设置操作,因此您可能需要查看?intersect
的帮助页面。还有一些包可以处理更复杂的set函数。
R的强制可以在逻辑和数字之间来回切换,这取决于函数的定义方式:
sum( letters[1:10] %in% letters)
[1] 10
sum( letters[1:10] == letters)
[1] 10
Warning message:
In letters[1:10] == letters :
longer object length is not a multiple of shorter object length
https://stackoverflow.com/questions/50671793
复制相似问题