为什么testthat 2.3.2使用了不同的sort()

Chr*_*oph 6 r testthat

(这个问题也是在Github上问这里

将 R 升级到 4.0.2 后,测试似乎失败了,因为sortin的算法发生了testthat变化。以下内容显示,这base::sort()browser()是R中4.0.2罚款(见这个问题,为什么增加这个检查。):

y <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
print(sort(y))
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"
browser()
print(sort(y))
# [1] "Schaffhausen" "Schwyz"       "Seespital"    "SRZ"
Run Code Online (Sandbox Code Playgroud)

但是如果你创建一个包,调用它testsort,使用添加测试环境usethis::use_testthat()并在其中添加一个文件“test-sort.R”/testsort/tests/testthat/

test_that("test sort", {
  xx <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
  print("")
  # bowser()
  print(sort(xx))
  expect_equal(sort(xx), c("Schaffhausen", "Schwyz", "Seespital", "SRZ"))
})
Run Code Online (Sandbox Code Playgroud)

你得到

==> devtools::test()

Loading testsort
Testing testsort
v |  OK F W S | Context
/ |   0       | sort[1] ""
[1] "SRZ"          "Schaffhausen" "Schwyz"       "Seespital"   
v |   1       | sort

== Results =============================================================================
OK:       1
Failed:   0
Warnings: 0
Skipped:  0
Run Code Online (Sandbox Code Playgroud)

我在 RStudio 控制台(!)中使用debug(sort)devtools::test(),但无法弄清楚会发生什么。

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   
Run Code Online (Sandbox Code Playgroud)

目前testthat2.3.2是最新的,也就是没有更新版本的testthat。

感谢来自测试的@Ulugbek Umirov :

10.5 CRAN 注释

CRAN 将在所有 CRAN 平台上运行您的测试:Windows、Mac、Linux 和 Solaris。有几点需要牢记:

请注意,测试始终以英语 (LANGUAGE=EN) 和 C 排序顺序 (LC_COLLATE=C) 运行。这最大限度地减少了平台之间的虚假差异。

Chr*_*oph 1

跨平台的可重复性更为重要。设置排序规则以C确保测试在所有平台上给出相同的结果。

\n
\n

sort如果导致问题,处理此更改的选项(排序取决于排序规则)** 您至少有 3 个不同的选项:

\n
    \n
  1. 使用stringr::sort():新增依赖stringr

    \n
  2. \n
  3. 无需额外的包即可自定义您的功能

    \n
    myfun <- function(my_collation = "German_Switzerland.1252", ...) {\n  my_locale <- Sys.getlocale("LC_COLLATE")\n  on.exit(expr = Sys.setlocale("LC_COLLATE", my_locale))\n\n  Sys.setlocale("LC_COLLATE", my_collation)\n  r <- sort(...)\n  return(r)\n}\n
    Run Code Online (Sandbox Code Playgroud)\n

    由于没有使用新的软件包on.exit()

    \n
  4. \n
  5. 使用withr-Package它可以照顾该on.exit部分

    \n
    myfun <- function(my_collation = "German_Switzerland.1252", \xe2\x80\xa6) {\n  withr::local_collate(my_collation)\n\n  r <- sort(\xe2\x80\xa6)\n  return(r)\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
\n