导入只有局部副作用的包

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...