精简版。Iload()数据在一个包中。以前,一个包中的测试通过了,现在它失败了,因为输出sort改变了。这是一个最小的可重现示例 - 有关详细信息,请参见下文:
y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
sort(y)
# OLD 3.5.2 [1] "Schaffhausen" "Schwyz" "Seespital" "SRZ"
# NEW 4.0.0 [1] "SRZ" "Schaffhausen" "Schwyz" "Seespital"
# Update 4.0.2 see comment:
# [1] "Schaffhausen" "Schwyz" "Seespital" "SRZ"
# From jay.sf's comment
sort.int(y, method="radix")
# [1] "SRZ" "Schaffhausen" "Schwyz" "Seespital"
sort.int(y, method="shell")
# [1] "Schaffhausen" "Schwyz" "Seespital" "SRZ"
# From Henrik's comment:
data.table::fsort(y)
# [1] "SRZ" "Schaffhausen" "Schwyz" "Seespital"
Run Code Online (Sandbox Code Playgroud)
我发现的唯一相关报告变化是
R 4.0.0
新特性的变化
......
当通过 read.table() 加载数据集时,data() 现在使用 LC_COLLATE=C 来确保可能的字符串到因子转换的区域设置独立结果。
但我什至不确定,这是否可以解释我所看到的。由于我想尽量减少导入包的数量并且我想了解发生了什么,我不确定如何继续。我错过了什么吗?(对sort.intwith 方法的更改radix可以完成这项工作,但仍然:为什么要更改?那真的更好吗?
我刚刚意识到,(感谢罗兰)sort在我的情况下调用sort.int:
function (x, decreasing = FALSE, na.last = NA, ...)
{
if (is.object(x))
x[order(x, na.last = na.last, decreasing = decreasing)]
else sort.int(x, na.last = na.last, decreasing = decreasing,
...)
}
Run Code Online (Sandbox Code Playgroud)
来自?sort.int:
“auto”方法选择“radix”表示短(少于2^31个元素)数值向量、整数向量、逻辑向量和因子;否则,“壳”。)
并且根据文档,sort.int没有从 4.0.0 更改为 4.0.2。
从 ?data.table::setorder
data.table 总是在“C-locale”中重新排序。因此,排序可能与通过 base::order 获得的排序不同。例如,在英语语言环境中,排序在 C 语言环境中区分大小写。因此,排序 c("c", "a", "B") 在 data.table 中返回 c("B", "a", "c") 但 c("a", "B", "c" ) 以基础::顺序。请注意,这在大多数数据情况下没有区别;两者都在仅存在大写或小写字母的 id 上返回相同的结果(“AB123”<“AC234”在两者中都为真),或者在国家名称和其他始终大写的专有名词上返回相同的结果。例如,既不是“美国”<“巴西”也不是“美国”<“巴西”
使用 C 语言环境使 data.table 中的排序行为在会话和语言环境中更加一致。base::order 的行为取决于关于 R 会话区域设置的假设。在英语语言环境中,"america" < "BRAZIL" 默认情况下为真,但如果您键入 Sys.setlocale(locale="C") 或 R 会话已在 C 语言环境中为您启动,则为假 - 这可能发生在服务器上/services 因为区域设置来自 R 会话启动的环境。相比之下,无论 R 会话的启动方式如何,data.table 中的 "america" < "BRAZIL" 始终为 FALSE。
(相关问题使用 R和最佳实践进行语言相关排序:我应该尝试将 UTF-8 更改为语言环境还是保持原样安全?)
细节
R.version # old _
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 5.2
year 2018
month 12
day 20
svn rev 75870
language R
version.string R version 3.5.2 (2018-12-20)
nickname Eggshell Igloo
y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
sort(y)
# [1] "Schaffhausen" "Schwyz" "Seespital" "SRZ"
stringr::str_sort(y)
# [1] "Schaffhausen" "Schwyz" "Seespital" "SRZ"
stringr::str_sort(y, locale = "C")
# [1] "SRZ" "Schaffhausen" "Schwyz" "Seespital"
# =======
R.version # new after upgrade
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 4
minor 0.0
year 2020
month 04
day 24
svn rev 78286
language R
version.string R version 4.0.0 (2020-04-24)
nickname Arbor Day
y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
sort(y)
# [1] "SRZ" "Schaffhausen" "Schwyz" "Seespital"
stringr::str_sort(y)
# [1] "Schaffhausen" "Schwyz" "Seespital" "SRZ"
stringr::str_sort(y, locale = "C")
#[1] "SRZ" "Schaffhausen" "Schwyz" "Seespital"
# ==== Test with new 4.0.2
R.version
platform x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 4
minor 0.2
year 2020
month 06
day 22
svn rev 78730
language R
version.string R version 4.0.2 (2020-06-22)
nickname Taking Off Again
y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
sort(y)
# [1] "Schaffhausen" "Schwyz" "Seespital" "SRZ"
stringr::str_sort(y)
# [1] "Schaffhausen" "Schwyz" "Seespital" "SRZ"
stringr::str_sort(y, locale = "C")
# [1] "SRZ" "Schaffhausen" "Schwyz" "Seespital"
Run Code Online (Sandbox Code Playgroud)