簡體   English   中英

如何在 R 中的包啟動時記住一個函數

[英]How to memoise a function at package startup in R

我正在研究一個包裝 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()才能讓它工作。

所以我的問題是:

  1. 是否有可能在包啟動時記住一個函數?
  2. 如果是這樣,我如何以一種在全局環境中不可見的方式記住該函數?

我想,這些問題在某種程度上是相關的。 我的理解是否正確,我對.onLoad()嘗試不起作用,因為它在.onLoad()的環境中創建了記憶功能?


PS:我知道,我無法在加載包時更改cache_dir ,但我想設置一個合理的默認值,這樣可以毫不費力地啟動。 但是,這保留了在需要時更改緩存目錄的可能性。

您正在onLoad函數內執行本地分配。

並且您不能簡單地執行(包-)全局分配,因為包命名空間被鎖定。 可以做的是

  1. 通過new.env(parent = parent.env(environment())創建一個新環境(該參數確保該環境找到在您的包命名空間中定義的對象)。
  2. 在該環境中分配記憶功能。
  3. attach環境。 現在,這通常是不受歡迎的,如果您嘗試提交,實際上會從 CRAN 為您贏得一張紅牌。 事實上,您的.onLoad函數不能調用attach因為用戶可能想使用您的包而不附加它。 但我認為如果你在.onAttach而不是.onLoad這樣做是合法的。 不過,恐怕 CRAN 維護者可能不同意; 再說一次,在特定情況下調用attach CRAN 包有優先權,例如 {devtools}。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM