r语言 - 更改包命名空间中的变量



我有一个包,在加载时为包命名空间分配了一个变量,如下所示:

.onLoad <- function(libname, pkgname){
assign(".myvar", 
"foo", 
envir = parent.env(environment()))
}
在我的包中,我像这样使用变量:
myfn <- function(){
print(.myvar)
}

现在,在测试期间,我需要在运行测试之前更改变量。

test_that("myfn works correctly", {
myvar_tmp <- .myvar
withr::defer(assign(".myvar", myvar_tmp , pos = "package:mypackage"))
assign(".myvar", "bar", pos = "package:mypackage")

expect_equal(myfn(), "bar")
})
然而,当我运行这个测试时,我得到:
── Failure (Line 6): myfn works correctly ──────────────────────────────────────
myfn() not equal to "bar".
1/1 mismatches
x[1]: "foo"
y[1]: "bar"

显然,我没有正确地更新.myvar,myfn仍然在加载时拾取值。

当我尝试在测试之外设置变量时,

> assign(".myvar", "bar", pos = "package:mypackage")
> .myvar
# [1] "bar"

,这似乎是包变量,而不是另一个命名空间中的变量:

pryr::where(".myvar")
<environment: package:mypackage>
attr(,"name")
[1] "package:mypackage"
attr(,"path")
[1] "/home/user/Documents/mypackage"
但是,当我调用函数 时
> myfn()
#[1] "foo"

不使用新值,而是使用加载时指定的值。

问题:在这种情况下,更新包名称空间中的变量的正确方法是什么?


PS这是一个演示原理的示例,因为实际用例更复杂。我意识到我不清楚为什么要在测试中更改变量,但对于实际用例来说,这是必要的。

问题似乎与赋值语句的格式有关。而不是

assign(".myvar", "bar", pos = "package:mypackage")

我使用,

assign(".myvar", "bar", pos = asNamespace("mypackage"))

,这解决了问题。

最新更新