关于如何存储函数结果以供以后在R中使用的良好实践

关于如何存储函数结果以供以后在R中使用的良好实践,r,functional-programming,R,Functional Programming,在这种情况下,我编写了一个R函数,ComplexResult,该函数计算出一个计算代价很高的结果,其他两个单独的函数稍后将使用该结果,LaterFuncA和LaterFuncB 我想将ComplexResult的结果存储在某个地方,这样LaterFuncA和LaterFuncB都可以使用它,而不需要重新计算它。ComplexResult的结果是一个大矩阵,只需计算一次,以后再重新使用 R是我第一次涉足函数式编程领域,所以我很想了解它认为的良好实践是什么。我的第一条思路如下: # run Comp

在这种情况下,我编写了一个R函数,
ComplexResult
,该函数计算出一个计算代价很高的结果,其他两个单独的函数稍后将使用该结果,
LaterFuncA
LaterFuncB

我想将
ComplexResult
的结果存储在某个地方,这样
LaterFuncA
LaterFuncB
都可以使用它,而不需要重新计算它。
ComplexResult
的结果是一个大矩阵,只需计算一次,以后再重新使用

R是我第一次涉足函数式编程领域,所以我很想了解它认为的良好实践是什么。我的第一条思路如下:

# run ComplexResult and get the result
cmplx.res <- ComplexResult(arg1, arg2)

# store the result in the global environment. 
# NB this would not be run from a function 
assign("CachedComplexResult", cmplx.res, envir = .GlobalEnv)
#运行ComplexResult并获取结果

cmplx.res一般的答案是应该序列化/反序列化大对象以供进一步使用。实现这一点的方法是使用
saveRDS/readRDS

## save a single object to file
saveRDS(cmplx.res, "cmplx.res.rds")
## restore it under a different name
cmplx2.res <- readRDS("cmplx.res.rds")
##将单个对象保存到文件
saveRDS(cmplx.res,“cmplx.res.rds”)
##以其他名称还原它

cmplx2.res此分配给GlobalEnv:

CachedComplexResult <- ComplexResult(arg1, arg2)
然后直接使用它:

LaterFuncA(read.table("complex_res.txt"))

您的方法适用于保存到本地内存;其他答案解释了如何保存到全局内存或文件。下面是一些关于你为什么要这样做或那样做的想法

保存到文件:这是最慢的,所以只有当您的进程不稳定,并且您希望它会严重崩溃,并且您需要从它停止的地方重新开始时,或者如果您只是偶尔需要保存一次状态,而速度/性能不是一个问题时,才需要这样做


保存到全局:如果需要从大型R程序中的多个点进行访问。

使用
cmplx.res
Save(object,file=“filename”)
如果要再次使用对象
load(file=“filename”)
本地分配操作符将分配给封闭环境。如果这恰好在全局范围内,那么它将确实分配给,但是,如果它发生在函数内部,那么它将分配给函数调用的求值环境。superassignment操作符
是的,您是对的,我想在本例中,他做了两次相同的操作:使用
并在物理缓存之外使用memoise。
write.table(CachedComplexResult, file = "complex_res.txt")
LaterFuncA(read.table("complex_res.txt"))