问题描述
在编写测试时,我有时想检查 R 对冲突的反应。
例如,我的包中包含一个与 compact()
冲突的 purrr::compact()
函数,并且我编写了一些代码以便后者仍用于常规列表。
在我的测试中,如果我的包被加载,我想检查 purrr::compact()
是否仍然适用于常规列表。
因此,我写了一个看起来有点像这样的单元测试:
test_that("Test A",{
library(purrr,include.only="compact",warn.conflicts=FALSE)
compact = crosstable::compact
x = list(a = "a",b = NULL,c = integer(0),d = NA,e = list())
expect_identical(compact(x),list(a="a",d=NA))
})
但是,library()
调用具有全局影响,会与其他一些不相关的测试混淆。
有没有办法在本地导入库?
我在考虑 rlang::local_options()
之类的东西。
解决方法
我的第一个想法是一个很棒的包 withr
,它可以帮助解决所有与临时相关的问题。考虑到命名空间仍然存在,loadedNamespaces()
。
.GlobalEnv 的用法示例:
search()
#> [1] ".GlobalEnv" "package:stats" "package:graphics"
#> [4] "package:grDevices" "package:utils" "package:datasets"
#> [7] "package:methods" "Autoloads" "tools:callr"
#> [10] "package:base"
withr::with_package("dplyr",{airquality %>% mutate(n = 2) %>% head()})
#> Ozone Solar.R Wind Temp Month Day n
#> 1 41 190 7.4 67 5 1 2
#> 2 36 118 8.0 72 5 2 2
#> 3 12 149 12.6 74 5 3 2
#> 4 18 313 11.5 62 5 4 2
#> 5 NA NA 14.3 56 5 5 2
#> 6 28 NA 14.9 66 5 6 2
mutate
#> Error in eval(expr,envir,enclos): object 'mutate' not found
search()
#> [1] ".GlobalEnv" "package:stats" "package:graphics"
#> [4] "package:grDevices" "package:utils" "package:datasets"
#> [7] "package:methods" "Autoloads" "tools:callr"
#> [10] "package:base"
由 reprex package (v2.0.0) 于 2021 年 6 月 21 日创建
另一个想法是 utils::getFromNamespace
的用法:
fun <- utils::getFromNamespace("fun","pkg")