2013-08-27 65 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