假设我有一个具有以下功能的包:
foo <- function() {
Sys.sleep(1) # really expensive operation
return(1)
}
每次运行的函数值总是相同的,所以我想使用记忆。
我以为我可以简单地做
foo <- memoise::memoise(function() {
Sys.sleep(1) # really expensive operation
return(1)
})
但是,这不起作用。
我的意思是,将它作为 GlobalEnv 函数运行,它可以工作:
foo <- memoise::memoise(function() {
Sys.sleep(1)
return(1)
})
system.time(foo())
#> user system elapsed
#> 0 0 1
system.time(foo())
#> user system elapsed
#> 0.01 0.00 0.01
由reprex 包(v0.3.0)于 2019 年 12 月 23 日创建
但是,如果它在一个包中,我会得到非常奇怪的行为。基本上,记忆并没有发挥作用,我一直得到相同的成本。但是,如果我打印函数定义,它就会开始工作!
system.time(bar::foo())
#> user system elapsed
#> 0.47 0.08 2.55
system.time(bar::foo())
#> user system elapsed
#> 0 0 2
system.time(bar::foo())
#> user system elapsed
#> 0.02 0.00 2.02
system.time(bar::foo())
#> user system elapsed
#> 0.01 0.00 2.02
bar::foo
#> Memoised Function:
#> function() {
#> Sys.sleep(2)
#> return (1)
#> }
#> <environment: namespace:bar>
system.time(bar::foo())
#> user system elapsed
#> 0 0 2
system.time(bar::foo())
#> user system elapsed
#> 0 0 0
system.time(bar::foo())
#> user system elapsed
#> 0 0 0
system.time(bar::foo())
#> user system elapsed
#> 0 0 0
NAMESPACE
作为记录,以下是和DESCRIPTION
文件的相关部分:
# NAMESPACE
export(foo)
importFrom(memoise,memoise)
# DESCRIPTION [...]
Imports:
memoise
这里发生了什么,我应该怎么做才能让我的包中的记忆从一开始就起作用?