2014 年 3 月更新
关于这个有一些争论。从 v1.9.2 开始,我们现在已经确定 setkey 使用 C 语言环境进行排序;例如,无论用户的语言环境如何,所有大写字母都在所有小写字母之前。这是我们在 v1.8.8 中所做的更改,我们原本打算扭转但现在坚持下去。
考虑save()-ing 在您的语言环境中的键控表和同事load()-ing 在不同的语言环境中。当他们加入该表时,如果它是区域设置排序顺序,它可能不再正常工作。如果setkey 是否允许再次进行语言环境排序,我们必须更仔细地考虑,可能通过保存语言环境名称以及“排序”属性,所以data.table 至少可以比较和检测当前语言环境是否不同于运行setkey的那个。
这也是出于速度的原因,因为根据语言环境进行排序比 C 语言环境慢得多。虽然,我们可以尽可能高效地做到这一点,并且可以选择允许它是理想的。
因此,现在这是一个功能请求,非常欢迎更多的 cmets。
FR#4842 setkey to sort using session's locale not C locale
不错的收获!对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
来自?order:
字符向量的排序顺序将取决于使用的语言环境的整理顺序:请参阅Comparison。
来自?Comparison:
字符向量中字符串的比较是使用所用语言环境的整理顺序在字符串中按字典顺序进行的:请参阅语言环境。诸如 en_US 之类的语言环境的整理顺序通常与 C(应该使用 ASCII)不同,并且可能令人惊讶。谨防对整理顺序做出任何假设:例如在爱沙尼亚语中,Z 位于 S 和 T 之间,并且排序不一定是逐个字符的——在丹麦语中,aa 排序为单个字母,在 z....之后。
所以,基本上,order 以及“C”语言环境下的顺序与data.table 的setkey 相同。我的猜测是chorder 调用的 C 函数会自动在 C-locale 上运行,它将比较“S”在“b”之前的 ascii 值。
引起@MatthewDowle 的注意可能很重要(如果他还没有意识到的话)。因此,我建议您将此作为错误 here 提交(只是为了确定)。