为何R语言对带引号负数的不等式比较结果异常?
为什么R里这些比较会得到看似矛盾的结果?
嘿,这个问题戳中了R里类型强制转换和字符串比较规则的关键点,我来一步步给你理清楚:
首先,先明确两个核心规则:
- 当你比较两个字符串时,R是按字符的ASCII字典序来判断大小的,不是按字符串里的数字值。
- 当你比较不同类型(数值 vs 字符串)的对象时,R会自动把数值强制转换成字符串,然后再按字符串规则比较,而不是把字符串转成数值!
现在逐个拆解你的例子:
1. 字符串 vs 字符串:"-1"<"-2" 返回 TRUE
字符串比较是逐个字符对比ASCII码:
- 第一个字符都是
'-',ASCII码相同; - 第二个字符
'1'的ASCII码是49,'2'是50,49 < 50,所以"-1"在字典序里比"-2"小,返回TRUE。
2. 数值与字符串混合比较:全部返回TRUE
不管是-1<"-2"、"-1"< -2"、as.numeric("-1")<"-2"还是"-1"<as.numeric("-2"),R都会执行强制类型转换:把其中的数值转换成字符串,比如-1转成"-1",-2转成"-2",之后就变成了和第一个例子完全一样的"-1"<"-2",自然返回TRUE。
3. 数值 vs 数值:返回FALSE
只有当两边都是数值类型时,R才会按数值大小进行比较:
-1的数值确实比-2大,所以-1< -2和as.numeric("-1")<as.numeric("-2")都返回FALSE。
简单总结:R在跨类型比较时的默认行为是把数值转成字符串,而不是直觉里的把字符串转成数值——这就是所有看似矛盾结果的根源!
内容的提问来源于stack exchange,提问作者Matt Malis
相关产品推荐
相关产品推荐

