我遇到过这样一种情况:我编写了一个R函数ComplexResult
,它计算了一个计算成本高的结果,以后会使用另外两个单独的函数LaterFuncA
和LaterFuncB
。
我想将ComplexResult
的结果存储在某处,以便LaterFuncA
和LaterFuncB
都可以使用它,而且不需要重新计算。 ComplexResult
的结果是一个大矩阵,只需要计算一次,然后再重新使用。
# 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)
这是完全正确的事吗?我能想到的另一种方法是拥有一个大的“包装”功能,例如:
MyWrapperFunction <- function(arg1, arg2) {
cmplx.res <- ComplexResult(arg1, arg2)
res.a <- LaterFuncA(cmplx.res)
res.b <- LaterFuncB(cmplx.res)
# do more stuff here ...
}
思考?我是否正朝着正确的方向前进?或者是选项C哪个更狡猾? :)
答案 0 :(得分:3)
一般的答案是你应该对你的大对象进行Serialize / deSerialize以供进一步使用。 R方法是使用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")
答案 1 :(得分:1)
这分配给GlobalEnv:
CachedComplexResult <- ComplexResult(arg1, arg2)
要存储,我会使用:
write.table(CachedComplexResult, file = "complex_res.txt")
然后直接使用它:
LaterFuncA(read.table("complex_res.txt"))
答案 2 :(得分:0)
您的方法适用于保存到本地内存;其他答案已解释保存到全局内存或文件。以下是关于为什么你会做其中一个的一些想法。
保存到文件:这是最慢的,所以只有当你的进程是易变的并且你希望它崩溃并且你需要从它停止时拾取它们时,或者如果你只需要保存状态一次在一段时间里,速度/性能不是一个问题。
保存到全局:如果您需要从大型R程序中的多个位置进行访问。