1

在编写测试时,我有时想检查 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()

4

1 回答 1

0

我的第一个想法是一个很棒的包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 包于 2021-06-21 创建 (v2.0.0 )

另一个想法是使用utils::getFromNamespace

fun <- utils::getFromNamespace("fun", "pkg")
于 2021-06-21T15:19:59.323 回答