需要检查已记录的软件包功能以使它正常运行,而已被记录

问题描述 投票:1回答:1

假设我有一个具有以下功能的软件包:

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

作为记录,以下是NAMESPACEDESCRIPTION文件的相关部分:

# NAMESPACE
export(foo)
importFrom(memoise,memoise)

# DESCRIPTION [...]
Imports:
    memoise

这里发生了什么,我应该怎么做才能从包中一开始就做备忘录?

假设我有一个具有以下功能的软件包:foo

r memoization memoise
1个回答
0
投票

这看起来像memoise程序包中的错误。当您使用自己的程序包时,R可能会将调试信息(称为srcref)添加到函数中。关于这些的某种原因导致每次调用该函数时,哈希值都以不同的方式出现,因此它永远不会识别出您正在使用相同的参数进行调用。

© www.soinside.com 2019 - 2024. All rights reserved.