gpt4 book ai didi

r - 如何在 R 中的包启动时记住一个函数

转载 作者:行者123 更新时间:2023-12-03 23:49:39 27 4
gpt4 key购买 nike

我正在研究一个包装 API 调用的 R 包。为了减少实际调用的次数并加快速度,我记住了进行 API 调用的函数。为此,我创建了以下函数,它允许设置缓存目录:

memoise_fromJSON <- function(cache_dir = tempdir()) {
memoise::memoise(jsonlite::fromJSON,
cache = memoise::cache_filesystem(cache_dir))
}

要创建我使用的内存功能
memoised_fromJSON <- memoise_fromJSON()

现在,由于我在包中多次需要 memoised 函数,我想在包启动时记住该函数。我试过
.onLoad <- function(libname, pkgname) {
memoised_fromJSON <- my_package:::memoise_fromJSON()
}

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

所以我的问题是:
  • 是否有可能在包启动时记住一个函数?
  • 如果是这样,我如何以一种在全局环境中不可见的方式记住该函数?

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

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

    最佳答案

    您正在 onLoad 中执行本地分配功能。

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

  • 通过 new.env(parent = parent.env(environment()) 创建新环境(该参数确保此环境找到在您的包命名空间内定义的对象)。
  • 在该环境中分配内存功能。
  • attach环境。现在,这通常是不受欢迎的,如果您尝试提交,实际上会从 CRAN 为您赢得一张红牌。事实上,您的 .onLoad函数不能调用 attach因为用户可能想在不附加它的情况下使用您的包裹。但我认为如果你在 .onAttach 中这样做是合法的而不是 .onLoad .不过,恐怕 CRAN 维护者可能不同意;再说一次,调用 attach 的 CRAN 包有优先权。在特定情况下,例如{开发工具}。
  • 关于r - 如何在 R 中的包启动时记住一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59537692/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com