不同的R base :: sort结果在不同的平台上

时间:2017-11-30 00:49:53

标签: r

这是一个简单但奇怪的问题。我在字符向量上使用sort

Browse[1]> x
[1] "OU anisotropic"  "OUF anisotropic" "OU isotropic"    "OUF isotropic"  
Browse[1]> sort(x)
[1] "OU anisotropic"  "OU isotropic"    "OUF anisotropic" "OUF isotropic"  
Browse[1]> sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.2

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

很简单,但是我发现sort没有给出预期的结果,在Linux,R 3.4.1。注意y与上面的x不同,但无论如何排序结果都不正确。

> y
[1] "OU anisotropic"  "OUF anisotropic" "OUF isotropic"   "OU isotropic"   
> sort(y)
[1] "OU anisotropic"  "OUF anisotropic" "OUF isotropic"   "OU isotropic"   
> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint 18.2

Matrix products: default
BLAS: /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base    

我猜这是与地方相关的?如何控制排序功能以获得一致的结果?

我尝试stringr::str_sort似乎有一致的结果,可能是因为有一个local = "en"参数。

但我认为基础排序也应该有一些方法。数据是简单的字符向量,因此不应涉及任何特殊的排序函数。

1 个答案:

答案 0 :(得分:0)

感谢Henrik的link。我猜对了它的相关和搜索的区域设置,但没有找到该帖子。

help(Comparison)有更详细的信息。令我感到困惑的是,我认为我的示例应该在不同的语言环境中排序相同,但base::sort可能会忽略某些语言环境中的空格。

我发现stringr::str_sort有一个locale = "en"参数,因此您可以跨平台获得一致的结果。