我处理一个包装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,但是我想设置一个合理的默认设置,这样就可以不用再重复就可以启动了。但是,这保留了在需要时更改缓存目录的可能性。
发布于 2019-12-30 23:16:27
在onLoad函数中执行本地赋值。
而且您不能简单地执行(包-)全局赋值,因为包名称空间是锁定的。你能做的就是
namespace).
new.env(parent = parent.env(environment())创建了一个新的环境(该参数确保该环境找到包中定义的对象,即environment.
attach环境中的回忆录函数)。现在,这通常被皱眉,如果你试图提交它,它实际上会从CRAN那里给你一张红牌。实际上,您的.onLoad函数不能调用attach,因为用户可能想在不附加包的情况下使用它。但我认为,如果您在.onAttach而不是.onLoad中这样做是合法的。不过,恐怕CRAN维护人员可能不同意;不过,在特定情况下调用attach的CRAN包有优先权,例如{devtools}.https://stackoverflow.com/questions/59537692
复制相似问题