【问题标题】:How to memoise a function at package startup in R如何在 R 中的包启动时记忆一个函数
【发布时间】:2020-04-19 14:30:37
【问题描述】:

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

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

创建我使用的记忆函数

memoised_fromJSON <- memoise_fromJSON()

现在,由于我需要在我的包中多次使用 memoised 函数,我想在包启动时 memoise 函数。我试过了

.onLoad <- function(libname, pkgname) {
  memoised_fromJSON <- my_package:::memoise_fromJSON()
}

但我仍然需要运行 memoised_fromJSON &lt;- memoise_fromJSON() 才能让它工作。

所以我的问题是:

  1. 是否有可能在包启动时记忆函数?
  2. 如果是这样,我怎样才能以在全局环境中不可见的方式记忆该函数?

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


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

【问题讨论】:

    标签: r r-package memoise


    【解决方案1】:

    您正在onLoad 函数内执行本地 赋值。

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

    1. 通过new.env(parent = parent.env(environment()) 创建一个新环境(该参数确保该环境找到在您的包命名空间中定义的对象)。
    2. 在该环境中分配记忆函数。
    3. attach 环境。现在,这通常是不受欢迎的,如果你试图提交它,实际上会让你从 CRAN 获得一张红牌。事实上,你的.onLoad 函数不能调用attach,因为用户可能想使用你的包而不附加它。但我认为如果你在.onAttach 而不是.onLoad 中这样做是合法的。恐怕 CRAN 维护者可能不同意。再说一次,在特定情况下调用 attach 的 CRAN 包有优先权,例如{devtools}。

    【讨论】:

      【解决方案2】:

      你的包里可以有一个memoised函数,不需要.onLoad() sorcery:

      在您的任何脚本中都有:

      memoised_fromJSON <- memoise::memoise(
        jsonlite::fromJSON, 
        cache = memoise::cache_filesystem(cache_dir))
      

      您可以在.onLoad 期间将对象添加到您的命名空间,尽管您在这里不需要它,这样做的方法是:

      .onLoad <- function(libname, pkgname) {
        your_object <- your_object_builder()
        ns <- asNamespace(pkgname)
        namespaceExport(ns, "your_object ")
      }
      

      如果你需要导出它,使用 {roxygen2} 你需要在你的脚本中:

      #' your title
      #' @whatever tags you need
      #' @export
      your_object <- NULL
      

      【讨论】:

        猜你喜欢
        • 2021-12-23
        • 2014-08-20
        • 2015-09-05
        • 1970-01-01
        • 2019-06-02
        • 1970-01-01
        • 2021-10-23
        • 2020-04-07
        • 2010-09-20
        相关资源
        最近更新 更多