为什么 R 中的“一”< 2 等于 FALSE?

Why does "one" < 2 equal FALSE in R?

提问人:JoeF 提问时间:11/19/2014 最后编辑:HenrikJoeF 更新时间:1/8/2019 访问量:1570

问:

我正在阅读 Hadley Wickham 关于胁迫的高级 R 部分,我无法理解这种比较的结果:

"one" < 2
# [1] FALSE

我假设 R 强制 2 到一个字符,但我不明白为什么 R 返回而不是返回错误。这对我来说尤其令人费解,因为FALSE

-1 < "one"
# TRUE

所以我的问题有两个方面:首先,为什么会有这个答案,其次,有没有办法看到 R 如何转换逻辑向量中的各个元素,就像这些例子一样?

r 比较 布尔逻辑 强制

评论

7赞 Ben Bolker 11/19/2014
提示:(10 不是必需的,但可能会给你另一个例子来思考:sort(c("one","2","-1","10"))"10"<"2")
1赞 Elzo Valugi 11/19/2014
这种怪癖出现在所有编程语言中,请始终注意您正在使用的数据类型,并将苹果与苹果进行比较,将橙子与橙子进行比较。
2赞 IRTFM 11/19/2014
胁迫在R中很普遍。它是一种弱类型语言。如果您不喜欢该功能,请使用 Java。当您查看带有“<”的字符时,它最初是第一个字符与第一个字符的区域设置特定排序规则顺序的比较。看:。。。。。'\t9999' < " 00000"
0赞 JoeF 11/19/2014
谢谢你的提示。我可以看到“排序”如何揭示答案是什么,但我仍然不明白排序本身是如何工作的。(我尝试了排序的帮助,但没有找到针对此特定问题的解释)。(好的,基于 BondedDust,我明白为什么“10”<“2”。
0赞 Henrik 11/19/2014
相关新闻: stackoverflow.com/questions/14932015/why-does-true-true-in-r/...;stackoverflow.com/questions/18964562/......

答:

9赞 OganM 11/19/2014 #1

它强制 2 进入一个字符,然后进行字母比较。数字字符假定在字母字符之前

要大致了解该行为,请尝试

'a'<'1'
'1'<'.'
'b'<'B'
'a'<'B'
'A'<'B'
'C'<'B'

评论

1赞 Ben Bolker 11/19/2014
我想知道是否有任何通用的(即跨区域设置的通用)保证数字在排序顺序中的字母字符之前?
0赞 JoeF 11/19/2014
谢谢。我会将这个和 jdharrison 的那个标记为都是正确的,但似乎我只能以这种方式标记其中一个。
17赞 jdharrison 11/19/2014 #2

从:help("<")

如果这两个参数是不同类型的原子向量,则一个是 强制到另一个的类型,(递减的)优先顺序 是字符、复杂、数字、整数、逻辑和原始。

因此,在这种情况下,数字的优先级低于字符。所以被胁迫到角色.字符向量中字符串的比较是词典编纂的,据我所知,它是按字母顺序排列的,但取决于语言环境。2"2"