首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以函数为参数的函数的记忆

以函数为参数的函数的记忆
EN

Stack Overflow用户
提问于 2015-01-21 15:50:53
回答 1查看 607关注 0票数 0

我想使用Rmemoise对以下函数进行一些回忆录,并将其作为参数函数:

代码语言:javascript
复制
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似乎不适用。如何在内存中表示函数以使其工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-21 15:57:51

您的代码不使用回忆录函数。它调用原来的函数,导致1秒的睡眠。

如果您尝试使用system.time(quickFunc(2, func, 3)),您将看到第二次没有延迟。

memoise只使用函数参数,并返回一个函数,该函数要么返回缓存的值,要么调用输入函数来创建它。而

代码语言:javascript
复制
m<-memoise(5)

不会引发错误,尝试调用它(如使用m(5))将返回以下错误

代码语言:javascript
复制
Error in mm() : could not find function "f"

只需输入memoise即可检查函数的代码。结果

代码语言:javascript
复制
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创建了所有参数的散列,并将其用作内存缓存的键,即使这些都是函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28071355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档