![](/img/trans.png)
[英]How to have a Memoise cached function remain cached after package rebuild in 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()
才能讓它工作。
所以我的問題是:
我想,這些問題在某種程度上是相關的。 我的理解是否正確,我對.onLoad()
嘗試不起作用,因為它在.onLoad()
的環境中創建了記憶功能?
PS:我知道,我無法在加載包時更改cache_dir
,但我想設置一個合理的默認值,這樣可以毫不費力地啟動。 但是,這保留了在需要時更改緩存目錄的可能性。
您正在onLoad
函數內執行本地分配。
並且您不能簡單地執行(包-)全局分配,因為包命名空間被鎖定。 你可以做的是
new.env(parent = parent.env(environment())
創建一個新環境(該參數確保該環境找到在您的包命名空間中定義的對象)。attach
環境。 現在,這通常是不受歡迎的,如果您嘗試提交,實際上會從 CRAN 為您贏得一張紅牌。 事實上,您的.onLoad
函數不能調用attach
因為用戶可能想使用您的包而不附加它。 但我認為如果你在.onAttach
而不是.onLoad
這樣做是合法的。 不過,恐怕 CRAN 維護者可能不同意; 再說一次,在特定情況下調用attach
CRAN 包有優先權,例如 {devtools}。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.