2013-08-27 105 views
1

我有一個列表,Z,其中每個Z[[i]]是一個ffdf對象。ffdf對象列表的序列化

我的問題是如何將Z保存到磁盤以供將來的會話使用,可能使用的內容如save.ffdf

Z <- list() 
for(i in 1:10) { 
    Z[[i]] <- as.ffdf(data.frame(array(1,dim=c(2,10)))) 
} 

is(Z[[1]]) 
is(Z) 
+0

爲什麼不簡單地使用'save(Z,file =「Z.Rdata」)'......當我嘗試它時工作正常?! – holzben

+1

@holzbrn因爲ff文件保存在臨時目錄中並將被清除。在你重新加載''Z.Rdata''之後,嘗試輸入'Z [[1]]',你會得到一些東西,比如'打開C:/ Users /..../ AppData/Local/Temp/RtmpO47OSM/ffdf5645baa5ac8.ff'。 – Jase

+0

啊,好的!我剛剛重新開始會話,而不是電腦!對不起。 – holzben

回答

2

您可以使用ffsave()保存對象的列表,但它預計,在當前的環境下得到解決的名單。但是,您可以編寫自己的幫助函數,將列表中的每個對象(df)放入一個變量中,並使用ffsave來保存這些對象。事情是這樣的:

saveList <- function(lst, fname) { 
    outlist = c() 
    for (i in 1:length(lst)) { 
     name = paste0('out_',i) 
     outlist = c(outlist, name) 
     assign(name, lst[[i]]) 
    } 
    ffsave(list=outlist, file=fname) 
} 

當加載該文件與ffload()你會得到一堆對象的名稱OUT_1,輸出2插孔的,...在當前的環境。你可能不希望這樣,所以你需要另一個輔助函數來把東西放回列表:

loadList <- function(fname) { 
    ffload(fname) 
    objs = ls(pattern="out") 
    outlist = list() 
    for (o in objs) { 
     idx= as.integer(strsplit(o,"_")[[1]][2]) 
     outlist[[idx]] = get(o) 
    } 
    outlist 
} 

注:源代碼必須修改/擴展如果要改爲使用的數字名稱索引值。

+0

我得到錯誤'系統錯誤(cmd,input = filelist,intern = TRUE):'使用'saveList'時找不到'zip' – Jase

+0

這是'ffsave()'中的問題;它使用'zip'來壓縮它的文件。如果您的路徑上沒有「zip」,則會出現此錯誤。 – f3lix

+0

「你的路徑上的zip」是什麼意思? – Jase