首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中的包启动时记忆一个函数

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

Stack Overflow用户
提问于 2019-12-30 22:52:35
回答 1查看 286关注 0票数 4

我处理一个包装API调用的R包。为了减少实际调用的次数并加快速度,我回忆了进行API调用的函数。为此,我创建了以下函数,允许设置缓存目录:

代码语言:javascript
复制
memoise_fromJSON <- function(cache_dir = tempdir()) {
  memoise::memoise(jsonlite::fromJSON,
                   cache = memoise::cache_filesystem(cache_dir))
}

创建我使用的回忆录功能

代码语言:javascript
复制
memoised_fromJSON <- memoise_fromJSON()

现在,由于我需要回忆录功能多次在我的包,我想回忆录功能在软件包启动。我试过了

代码语言:javascript
复制
.onLoad <- function(libname, pkgname) {
  memoised_fromJSON <- my_package:::memoise_fromJSON()
}

但我仍然需要运行memoised_fromJSON <- memoise_fromJSON()才能让它正常工作。

所以我的问题是:

  1. 是否有可能在软件包启动时回忆录一个函数?如果是的话,我怎么能以一种在全球环境中看不到的方式来回忆这个函数?

我想这些问题是有关联的。我的理解是,我对.onLoad()的尝试不起作用,因为它在.onLoad()环境中创建了回忆录函数。

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

EN

回答 1

Stack Overflow用户

发布于 2019-12-30 23:16:27

onLoad函数中执行本地赋值。

而且您不能简单地执行(包-)全局赋值,因为包名称空间是锁定的。你能做的就是

namespace).

  • Assign

  • 通过new.env(parent = parent.env(environment())创建了一个新的环境(该参数确保该环境找到包中定义的对象,即environment.

  • attach环境中的回忆录函数)。现在,这通常被皱眉,如果你试图提交它,它实际上会从CRAN那里给你一张红牌。实际上,您的.onLoad函数不能调用attach,因为用户可能想在不附加包的情况下使用它。但我认为,如果您在.onAttach而不是.onLoad中这样做是合法的。不过,恐怕CRAN维护人员可能不同意;不过,在特定情况下调用attach的CRAN包有优先权,例如{devtools}.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59537692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档