(这个问题也是在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) 运行。这最大限度地减少了平台之间的虚假差异。
跨平台的可重复性更为重要。设置排序规则以C确保测试在所有平台上给出相同的结果。
sort如果导致问题,处理此更改的选项(排序取决于排序规则)** 您至少有 3 个不同的选项:
使用stringr::sort():新增依赖stringr包
无需额外的包即可自定义您的功能
\nmyfun <- 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}\nRun Code Online (Sandbox Code Playgroud)\n由于没有使用新的软件包on.exit()
使用withr-Package它可以照顾该on.exit部分
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}\nRun Code Online (Sandbox Code Playgroud)\n