我在包装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
功能内执行local分配。
而且您不能简单地执行(package-)全局分配,因为包名称空间已锁定。您可以要做的是
new.env(parent = parent.env(environment())
创建新环境(该参数确保该环境找到您的程序包名称空间内定义的对象)。attach
环境。现在,这通常会让人皱眉,实际上,如果您尝试提交,它将为您赢得CRAN的红牌。实际上,您的.onLoad
函数必须调用attach
,因为用户可能想使用您的包装而不附加它。但是我认为,如果您在.onAttach
中而不是在.onLoad
中这样做是合法的。恐怕CRAN维护者可能不同意;再说一遍,在特定情况下(例如, {devtools}。