我正在开发一个包装API调用的R包。为了减少实际调用的数量并加快速度,我记住了进行 API 调用的函数。为此,我创建了以下函数,该函数允许设置缓存目录:
memoise_fromJSON <- function(cache_dir = tempdir()) {
memoise::memoise(jsonlite::fromJSON,
cache = memoise::cache_filesystem(cache_dir))
}
创建我使用的记忆函数
memoised_fromJSON <- memoise_fromJSON()
现在,由于我在包中多次需要记忆函数,我想在包启动时记忆函数。我试过了
.onLoad <- function(libname, pkgname) {
memoised_fromJSON <- my_package:::memoise_fromJSON()
}
但我仍然需要运行memoised_fromJSON <- memoise_fromJSON()
才能让它工作。
所以我的问题是:
- 是否有可能在包启动时记住函数?
- 如果是这样,我怎样才能以在全球环境中不可见的方式记忆该功能?
我想,这些问题在某种程度上是相关的。我的理解是否正确,即我对.onLoad()
的尝试不起作用,因为它在.onLoad()
环境中创建了记忆功能?
PS:我知道,我无法在加载包时更改cache_dir
,但我想设置一个合理的默认值,这样就可以毫不费力地启动。但是,这保留了在需要时更改缓存目录的可能性。
您正在onLoad
函数中执行本地赋值。
而且您不能简单地执行(包(全局分配,因为包命名空间是锁定的。你能做的是
- 通过
new.env(parent = parent.env(environment())
创建新环境(该参数可确保此环境查找在包命名空间中定义的对象(。 - 在该环境中分配记忆功能。
attach
环境。现在,这通常是不受欢迎的,如果您尝试提交它,实际上会从 CRAN 获得红牌。事实上,.onLoad
函数不能调用attach
因为用户可能希望在不附加包的情况下使用包。但我认为如果你在.onAttach
而不是.onLoad
这样做是合法的.恐怕 CRAN 维护者可能不同意;再说一次,在特定情况下调用attach
的 CRAN 包有优先权,例如 {devtools}。
为什么不直接在你的 R 源中声明记忆函数呢?
#' Memoised version of [jsonlite::fromJSON]
#' @inherit jsonlite::fromJSON
#'
#' @export
memoised_fromJSON <- memoise::memoise(jsonlite::fromJSON,
cache = memoise::cache_filesystem(tempdir()))
这应该可以在R CMD检查中没有任何注释或警告的情况下完成工作。