我的理解是,两个字符的字典顺序比较反射(reflect)了这些字符对应的Unicode数字代码的数值比较。例如
> utf8ToInt("a")
[1] 97
>
>
> utf8ToInt("b")
[1] 98
>
>
> # Because 97 < 98 the following lexicographical comparison returns TRUE
> "a" < "b"
[1] TRUE
>
但是,有一个我无法理解和解释的特殊情况:
> utf8ToInt("a")
[1] 97
>
>
> utf8ToInt("A")
[1] 65
>
>
> # Because 97 > 65 normally the following lexicographical comparison
> # is supposed to return FALSE, yet to my surprise it returns TRUE!
> "a" < "A"
[1] TRUE
>
我检查过Python 3.10.4
, DuckDB 0.7.0
我可以确认他们都返回 FALSE
作为比较结果'a' < 'A'
。然而,PostgreSQL 15.3
喜欢 R
,返回TRUE
。所以我对这种行为差异感到非常困惑。
为什么R
和PostgreSQL
返回TRUE
用于比较"a" < "A"
?
最佳答案
R 中并不像 C 等其他语言那样存在单个原子 char
的概念;最接近的 R 是一个长度为 1 的字符串向量,其中单个字符串包含单个字符。这意味着比较运算符始终比较单个字符,就像比较任何其他字符串一样 - 也就是说,按字典顺序,而不是像 C 中那样比较 8 位数字。这种字典顺序与区域设置相关,由 Scollate
确定。函数在底层 C 代码中,通过读取 LC_COLLATE 环境变量来实现。
如果您想要基于 ASCII 的字典顺序,可以将 LC_COLLATE 设置为“C”:
Sys.setlocale("LC_COLLATE", "C")
然后我们有:
"a" < "A"
#> [1] FALSE
请注意,您以这种方式编写的任何代码都将不可移植。使用 utf8ToInt
或类似的工具会更强大,如果您想比较 R 中的 ASCII 值,请专门转换为数字。
关于r - 为什么 "a"< "A"在 R 中返回 TRUE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77130678/