2015-06-11 24 views
4

我有寫過R函數ComplexResult的情況,該函數計算計算結果較高的結果,其他兩個單獨的函數稍後將使用LaterFuncALaterFuncB關於如何存儲函數的結果以便稍後在R中使用的良好做法

我想存儲的ComplexResult結果的地方,這樣既LaterFuncALaterFuncB可以使用它,它並不需要重新計算。 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) 

這樣做是否正確?我能想到的唯一的另一種方法是具有大的「包裝」功能,例如:

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

'cmplx.res < - ComplexResult(arg1,arg2)'你正在做一個分配,所以你不需要做2次。在我的實踐中,存儲大型表格/矩陣的最佳方式是在「.txt」文件中。 'write.table'和'read.table'工作非常快 –

+3

'save(object,file =「filename」)'如果你想再次使用這個對象'load(file =「filename」)' – The6thSense

回答

3

一般的答案是你應該序列化/ 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") 
+0

並使用memoise in增加物理緩存。 –

1

該分配給GlobalEnv:

CachedComplexResult <- ComplexResult(arg1, arg2) 

要保存我會用:

write.table(CachedComplexResult, file = "complex_res.txt") 

然後直接使用它:

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

本地賦值運算符['<-'](https://stat.ethz.ch/R-manual/R-devel/library/base/html/assignOps.html)將分配給封閉環境。如果這恰好在全局範圍內,那麼它確實會分配給['.GlobalEnv'](https://stat.ethz.ch/R-manual/R-devel/library/base/html/environment.html)但是,如果它發生在一個函數中,那麼它將分配給函數調用的評估環境。 – bgoldst

+0

superassignment運算符'<< - '將始終分配給全局環境,前提是在中間父級環境中沒有該名稱的閉包變量。然而,R專家經常建議不要將其作爲不好的做法,儘管我偶爾會發現它的用途。 – bgoldst

+0

是的,你說得對,我想在這種情況下,他做了兩次相同的操作:用'<-'運算符和'assign'函數。如果你想在函數內部賦值給全局函數,我同意用'assign'函數而不是'<< - '運算符更好 –

0

Your approac h適用於保存到本地內存;其他答案已解釋保存到全局內存或文件。這裏有一些想法爲什麼你會做一個或另一個。

保存到文件:這是最慢的,所以只有當你的進程是不穩定的,並且你期望它很難崩潰並且你需要從它停止的地方拿起它,或者如果你只需要保存狀態曾經有一段時間,速度/性能不是問題。

保存到全球:如果您需要訪問大型R程序中的多個點。

相關問題