我想使用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似乎不适用。如何在内存中表示函数以使其工作?
发布于 2015-01-21 15:57:51
您的代码不使用回忆录函数。它调用原来的函数,导致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创建了所有参数的散列,并将其用作内存缓存的键,即使这些都是函数。
https://stackoverflow.com/questions/28071355
复制相似问题