如何让 Memoise 缓存函数在 R 中的包重建后保持缓存
How to have a Memoise cached function remain cached after package rebuild in R
我使用 Memoise 包来缓存我正在开发的 R 包中的函数调用。在开发过程中,我会定期重建我的包。但每次我这样做时,缓存的函数调用都会被遗忘。关于如何缓存这些函数调用的任何建议?最好使用 Memoise 包。但如果不可能,我们将不胜感激。
要从头开始复制,请执行以下操作:
第 1 部分 - 创建包
在交互式 R 控制台上,创建一个名为 "TmpTestPackage1" 的包。 (这将在您当前的工作目录中创建一个名为 "TmpTestPackage1" 的目录):
> library("devtools")
> create("TmpTestPackage1")
创建文件 ./TmpTestPackage1/R/SomeCode.R 并插入内容:
library("memoise")
longFunction = function() {
Sys.sleep(5)
return(7)
}
cachedLongFunction = memoise::memoise(longFunction)
someOtherFunction = function() {
return(cachedLongFunction())
}
现在在 R 控制台上(从 TmpTestPackage1 目录的父目录,devtools 仍然可用):
> library("devtools")
> install("TmpTestPackage1")
第 2 部分 - 重现我的问题
> library("TmpTestPackage1")
> someOtherFunction() # This waits for 5 seconds as expected
> someOtherFunction() # Now completes almost immediately because
# the function call is cached. Good.
> install("TmpTestPackage1")
> someOtherFunction() # This waits 5 seconds again! I want it to
# still be cached however.
默认情况下缓存在内存中,自从 R 会话重新启动后在包重建中被清除。
您可以在 memoise
中使用文件系统缓存,例如将缓存保存在 inst
文件夹中。
我使用 Memoise 包来缓存我正在开发的 R 包中的函数调用。在开发过程中,我会定期重建我的包。但每次我这样做时,缓存的函数调用都会被遗忘。关于如何缓存这些函数调用的任何建议?最好使用 Memoise 包。但如果不可能,我们将不胜感激。
要从头开始复制,请执行以下操作:
第 1 部分 - 创建包
在交互式 R 控制台上,创建一个名为 "TmpTestPackage1" 的包。 (这将在您当前的工作目录中创建一个名为 "TmpTestPackage1" 的目录):
> library("devtools")
> create("TmpTestPackage1")
创建文件 ./TmpTestPackage1/R/SomeCode.R 并插入内容:
library("memoise")
longFunction = function() {
Sys.sleep(5)
return(7)
}
cachedLongFunction = memoise::memoise(longFunction)
someOtherFunction = function() {
return(cachedLongFunction())
}
现在在 R 控制台上(从 TmpTestPackage1 目录的父目录,devtools 仍然可用):
> library("devtools")
> install("TmpTestPackage1")
第 2 部分 - 重现我的问题
> library("TmpTestPackage1")
> someOtherFunction() # This waits for 5 seconds as expected
> someOtherFunction() # Now completes almost immediately because
# the function call is cached. Good.
> install("TmpTestPackage1")
> someOtherFunction() # This waits 5 seconds again! I want it to
# still be cached however.
默认情况下缓存在内存中,自从 R 会话重新启动后在包重建中被清除。
您可以在 memoise
中使用文件系统缓存,例如将缓存保存在 inst
文件夹中。