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