从 3.5.2 升级到 4.0.0 后,为什么 R 的排序更改了使用 load() 导入的数据?

Chr*_*oph 10 sorting r

精简版。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)

Chr*_*oph 2

总之,这是一个错误,已在 R 版本 4.0.1 中删除。正如@Roland 所想的那样。
来自克兰

在 R 4.0.0 中,sort.list(x)whenis.object(x)为 true,例如 for x <-I(letters),意外为usingmethod = "radix"。因此,例如,merge(<data.frame>)比以前慢得多;PR#17794 中报告。