簡體   English   中英

記住以函數為參數的函數

[英]Memoise a function taking a function as argument

我想對以下函數使用Rmemoise來做一些memoise ,以函數作為參數:

library(memoise)

func      = function(x) x
slowFunc  = function(a,f,b=2) {Sys.sleep(1); a+b}
quickFunc = memoise(slowFunc)

> system.time(slowFunc(2, func, 3))
   user  system elapsed 
      0       0       1 
> system.time(slowFunc(2, func, 3))
   user  system elapsed 
   0.00    0.00    0.99 

有兩個連續的呼叫,第二個按時返回1秒鍾,而我本可以期望瞬間發生。

這很奇怪,但似乎當參數是函數時, memoise並不適用...在內存中如何表示該函數以使其起作用?

您的代碼不使用備注功能。 它調用原始函數,導致1秒鍾的睡眠。

如果嘗試使用system.time(quickFunc(2, func, 3))您將看到第二次沒有延遲。

memoise 與函數參數一起使用,並返回一個函數,該函數要么返回緩存的值,要么調用輸入函數來創建它。

m<-memoise(5)

不會引發錯誤,嘗試調用它(例如,使用m(5) )將返回以下錯誤

Error in mm() : could not find function "f"

您可以通過簡單地輸入memoise來檢查函數的代碼。 結果

function (f) 
{
    cache <- new_cache()
    memo_f <- function(...) {
        hash <- digest(list(...))
        if (cache$has_key(hash)) {
            cache$get(hash)
        }
        else {
            res <- f(...)
            cache$set(hash, res)
            res
        }
    }
    attr(memo_f, "memoised") <- TRUE
    return(memo_f)
}

顯示memoise會創建所有參數的哈希,並將其用作內存中緩存的鍵,即使這些是函數也是如此。

暫無
暫無

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

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