我有一個功能,有列表輸出。每次運行它時,我都想用保存導出結果。幾次運行後,我想讀取文件並比較結果。我這樣做,因爲我不知道會有多少任務,也許我會用不同的計算機來計算每個任務。那麼我應該如何命名已存檔的對象,以便我可以將它們全部讀入?命名存檔對象的最佳做法是什麼?
我最好的猜測是在保存之前動態地命名變量,並跟蹤對象名稱,但我已經閱讀無處不在,這是一個很大的禁忌。
那麼我該如何解決這個問題呢?
我有一個功能,有列表輸出。每次運行它時,我都想用保存導出結果。幾次運行後,我想讀取文件並比較結果。我這樣做,因爲我不知道會有多少任務,也許我會用不同的計算機來計算每個任務。那麼我應該如何命名已存檔的對象,以便我可以將它們全部讀入?命名存檔對象的最佳做法是什麼?
我最好的猜測是在保存之前動態地命名變量,並跟蹤對象名稱,但我已經閱讀無處不在,這是一個很大的禁忌。
那麼我該如何解決這個問題呢?
您可能想要使用saveRDS
和readRDS
函數代替save
和load
。 RDS版本功能將保存並讀取沒有附加名稱的單個對象。您可以創建對象並將其保存到文件中(使用paste0
或sprintf
創建唯一名稱),然後在處理結果時,您可以一次讀入一個對象,或者將多個對象讀入列表以使用它們。
您可以使用範圍來隱藏函數內檢索到的名稱,所以首先你可能列表保存到文件:
mybiglist <- list(fred=1, john='dum di dum', mary=3)
save(mybiglist, file='mybiglist1.RData')
然後你就可以通過函數在載入它,並給它的任何名稱你喜歡的是它裏面的另一個列表或只是一個普通的對象:
# Use the fact that load returns the name of the object loaded
# and that scope will hide this object
myspecialload <- function(RD.fnam) {
return(eval(parse(text=load(RD.fnam))))
}
# now lets reload that file but put it in another object
mynewbiglist <- myspecialload('mybiglist1.RData')
mynewbiglist
$fred
[1] 1
$john
[1] "dum di dum"
$mary
[1] 3
注意,這不是一個真正的通用的「使用它的任何地方」類型的功能,作爲與多個對象的RDATA文件,它似乎返回最後對象保存...所以現在每個文件最好堅持一個列表對象!
有一次我給了幾個RData文件,它們都只有一個變量叫做x。爲了在我的工作區中讀取所有這些變量,我將每個變量順序地加載到它的環境中,並且使用get()來讀取它的值。
tenv <- new.env()
load("file_1.RData", envir = tenv)
ls(tenv) # x
myvar1 <- get(ls(tenv), tenv)
rm(tenv)
....
此代碼可以爲每個文件重複。