R 的自然排序在部署上有所不同(可能 OS/Locale 问题)

Natural sorting with R differs on deployment (maybe OS/Locale issue)

我正在使用此处找到的包“naturalsort”:https://github.com/kos59125/naturalsort据我所知,自然排序并不是在 R 中其他地方以良好方式实现的东西,所以我很高兴找到这个包.

我使用 naturalsort 函数对文件名进行排序,就像 windows 资源管理器一样,它在本地运行良好。

但是,当我在 Google 云 运行 上使用 Docker 部署的生产环境中使用它时,排序会发生变化。我不知道这是由于区域设置的变化(我来自丹麦)还是由于我的 windows PC 和 Docker/Google 云 运行 之间的 OS 差异]部署。

我已经在 R:

中创建了一个准备 运行 的示例
######## Code start ###########
require(plumber)
require(naturalsort) #for name sorting

#* Retrieve sorted string list
#* @get /sortstrings
#* @param nothing
function(nothing) {
  
  print(nothing)
  
  test <- c("0.jpg", "file (4_5_1).jpeg", "1 tall thin image.jpeg",
            "8.jpeg", "8.jpg", "file (2.1.2).jpeg", "file (0).jpeg", "3.jpeg",
            "file (1).jpeg", "file (2.1.1).jpeg", "file (0) (3).jpeg", "file (2).jpeg",
            "file (2.1).jpeg", "file (4_5).jpeg", "file (4).jpeg", "file (39).jpeg")
  
  print("Direct sort")
  print(naturalsort(text = test))
  
  sorted_strings <- naturalsort(text = test)
  
  return(sorted_strings) 
}
######## Code end ###########

我希望它能像下面这样对文件名进行排序,当 运行 直接在脚本中以及通过管道工 运行 API 时,它都会在本地执行此操作:

    c("0.jpg", 
  "1 tall thin image.jpeg", 
  "3.jpeg", 
  "8.jpeg", 
  "8.jpg", 
  "file (0) (3).jpeg", 
  "file (0).jpeg", 
  "file (1).jpeg", 
  "file (2).jpeg", 
  "file (2.1).jpeg", 
  "file (2.1.1).jpeg", 
  "file (2.1.2).jpeg", 
  "file (4).jpeg", 
  "file (4_5).jpeg", 
  "file (4_5_1).jpeg", 
  "file (39).jpeg"
  )

但它是这样排序的:

c("0.jpg",
"1 tall thin image.jpeg",
"3.jpeg",
"8.jpeg",
"8.jpg",
"file (0) (3).jpeg",
"file (0).jpeg",
"file (1).jpeg",
"file (2.1.1).jpeg",
"file (2.1.2).jpeg",
"file (2.1).jpeg",
"file (2).jpeg",
"file (4_5_1).jpeg",
"file (4_5).jpeg",
"file (4).jpeg",
"file (39).jpeg")

这不像 windows 资源管理器。

尝试在 naturalsort 调用之前修复整理顺序。它因语言环境而异,并且会影响字符串的比较方式(以及排序方式)。

## Get initial value
lcc <- Sys.getlocale("LC_COLLATE")

## Use fixed value
Sys.setlocale("LC_COLLATE", "C")

sorted_strings <- naturalsort(text = test)

## Restore initial value
Sys.setlocale("LC_COLLATE", lcc)

您可以在 ?sort?Comparison?locales 以及更多 here 中找到一些详细信息。