如何在R中的程序包启动时记忆功能

问题描述 投票:0回答:1

我在包装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,但是我想设置一个合理的默认值,这样就可以不费吹灰之力地启动。但是,这样可以在需要时更改缓存目录。

r r-package memoise
1个回答
0
投票

您正在onLoad功能内执行local分配。

而且您不能简单地执行(package-)全局分配,因为包名称空间已锁定。您可以要做的是

  1. 通过new.env(parent = parent.env(environment())创建新环境(该参数确保该环境找到您的程序包名称空间内定义的对象)。
  2. 在该环境中分配已记忆的功能。
  3. attach环境。现在,这通常会让人皱眉,实际上,如果您尝试提交,它将为您赢得CRAN的红牌。实际上,您的.onLoad函数必须调用attach,因为用户可能想使用您的包装而不附加它。但是我认为,如果您在.onAttach中而不是在.onLoad中这样做是合法的。恐怕CRAN维护者可能不同意;再说一遍,在特定情况下(例如, {devtools}。
© www.soinside.com 2019 - 2024. All rights reserved.