如何在 R 中的包启动时记忆函数



我正在开发一个包装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()才能让它工作。

所以我的问题是:

  1. 是否有可能在包启动时记住函数?
  2. 如果是这样,我怎样才能以在全球环境中不可见的方式记忆该功能?

我想,这些问题在某种程度上是相关的。我的理解是否正确,即我对.onLoad()的尝试不起作用,因为它在.onLoad()环境中创建了记忆功能?


PS:我知道,我无法在加载包时更改cache_dir,但我想设置一个合理的默认值,这样就可以毫不费力地启动。但是,这保留了在需要时更改缓存目录的可能性。

您正在onLoad函数中执行本地赋值。

而且您不能简单地执行(包(全局分配,因为包命名空间是锁定的。你能做的

  1. 通过new.env(parent = parent.env(environment())创建新环境(该参数可确保此环境查找在包命名空间中定义的对象(。
  2. 在该环境中分配记忆功能。
  3. 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检查中没有任何注释或警告的情况下完成工作。

最新更新