Запоминание функции, принимающей функцию в качестве аргумента

Я хочу сделать некоторые памятки, используя R пакет 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 ответ

Решение

Ваш код не использует запомненную функцию. Вызывает оригинальную функцию, которая приводит к 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 создает хэш всех аргументов и использует его в качестве ключа для кэша в памяти, даже если это функции.

Другие вопросы по тегам