假设我有一个具有以下功能的软件包:
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 package(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
这里发生了什么,我应该怎么做才能从包中一开始就做备忘录?
假设我有一个具有以下功能的软件包:foo
这看起来像memoise
程序包中的错误。当您使用自己的程序包时,R可能会将调试信息(称为srcref
)添加到函数中。关于这些的某种原因导致每次调用该函数时,哈希值都以不同的方式出现,因此它永远不会识别出您正在使用相同的参数进行调用。