2014 年 3 月更新
关于这一点存在一些争论。从 v1.9.2 开始,我们暂时解决了setkey
使用 C 语言环境进行排序;例如,无论用户的区域设置如何,所有大写字母都位于所有小写字母之前。这是 v1.8.8 中所做的更改,我们原本打算撤销该更改,但目前仍保留该更改。
考虑save()
- 在您所在地区和同事中创建一个键控表load()
- 在不同的语言环境中使用它。当它们加入该表时,如果它是区域设置排序顺序,则它可能不再正常工作。我们必须更仔细地考虑一下,如果setkey
是允许再次进行语言环境排序,可能是通过将语言环境名称与“已排序”属性一起保存,所以data.table
至少可以比较并检测当前区域设置是否与运行的区域设置不同setkey
.
这也是出于速度原因,因为根据语言环境进行排序比 C 语言环境慢得多。尽管如此,我们可以尽可能高效地做到这一点,并且有选择地允许它是理想的。
因此,这现在是一个功能请求,非常欢迎进一步的评论。
FR#4842 setkey 使用会话的语言环境而不是 C 语言环境进行排序
不错的收获!致电给setkey
依次调用setkeyv
这就是所谓的fastorder
对依次调用的列/条目进行“排序”chorder
.
chorder
依次调用C函数Ccountingcharacter.c
。现在,我认为问题是由于“区域设置”造成的。
让我们看看我的 Mac 上的“区域设置”是什么。
Sys.getLocale()
# [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"
现在让我们看看如何order
对其进行排序:
x <- c("USA", "Ubuntu", "Uzbekistan")
order(x)
# [1] 2 1 3
现在,让我们将“区域设置”更改为“C”。
Sys.setlocale("LC_ALL", "C")
# [1] "C/C/C/C/C/en_US.UTF-8"
order(x)
# [1] 1 2 3
From ?order
:
字符向量的排序顺序将取决于所使用的语言环境的整理顺序:请参阅Comparison
.
From ?Comparison
:
字符向量中的字符串比较是使用所使用的语言环境的整理顺序在字符串中按字典顺序进行的:请参阅语言环境。 en_US 等语言环境的整理顺序通常与 C(应使用 ASCII)不同,并且可能会令人惊讶。请注意不要对排序顺序做出任何假设:例如在爱沙尼亚语中,Z 位于 S 和 T 之间,并且排序规则不一定是逐个字符的 - 在丹麦语中,aa 排序为单个字母,位于 z 之后......
所以,基本上,order
以及在“C”语言环境下,给出的顺序与data.table
's setkey
。我的猜测是 C 函数调用chorder
自动在 C 语言环境上运行,它将比较“S”在“b”之前的 ascii 值。
让 @MatthewDowle 注意到这一点可能很重要(如果他还没有意识到)。所以,我建议您将此作为错误归档here(只是要确定)。