R:将对象序列化为文本文件并返回

问题描述:

我在R中创建了一个对象序列化并将它们放入纯文本文件的过程。这似乎是一种非常好的方式来处理事情,因为我正在使用Hadoop,所有输出都需要通过stdin和stdout进行流式处理。R:将对象序列化为文本文件并返回

我剩下的问题是如何从文本文件中读取这些对象,然后将其返回到我的台式机上的R中。下面是一个工作示例,说明了这个挑战:

让我们创建一个tmp文件并将单个对象写入其中。这个对象只是一个载体:

outCon <- file("c:/tmp", "w") 
mychars <- rawToChar(serialize(1:10, NULL, ascii=T)) 
cat(mychars, file=outCon) 
close(outCon) 

的mychars对象看起来是这样的:

> mychars 
[1] "A\n2\n133633\n131840\n13\n10\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" 

当写入文本文件,它看起来像这样:

A 
2 
133633 
131840 
13 
10 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

我可能忽略了非常明显的东西,但是如何将该文件读回R并反序列化该对象?当我尝试scan()或readLines()时,都希望将新行字符当作记录分隔符,并且最终得到一个向量,其中每个元素都是文本文件中的一行。我真正想要的是一个包含文件全部内容的文本字符串。然后我可以反序列化字符串。

Perl会将换行符读回字符串,但我无法弄清楚如何重写R处理换行符的方式。

法学博士,我们在digest包通过serialize()到/从raw。这很好,因为你可以在SQL和其他地方存储序列化的对象。我实际上将它存储为RData,这对于load()(不解析!)和save()来说更快。

或者,如果它是RawToChar()和ASCII然后使用这样的事情(从help(digest)直取其中我们比较文件拷贝序列:

# test 'length' parameter and file input 
fname <- file.path(R.home(),"COPYING") 
x <- readChar(fname, file.info(fname)$size) # read file 
for (alg in c("sha1", "md5", "crc32")) { 
    # partial file 
    h1 <- digest(x , length=18000, algo=alg, serialize=FALSE) 
    h2 <- digest(fname, length=18000, algo=alg, serialize=FALSE, file=TRUE) 
    h3 <- digest(substr(x,1,18000) , algo=alg, serialize=FALSE) 
    stopifnot(identical(h1,h2), identical(h1,h3)) 
    # whole file 
    h1 <- digest(x , algo=alg, serialize=FALSE) 
    h2 <- digest(fname, algo=alg, serialize=FALSE, file=TRUE) 
    stopifnot(identical(h1,h2)) 
} 
与你的榜样成为该

这样:

R> outCon <- file("/tmp/jd.txt", "w") 
R> mychars <- rawToChar(serialize(1:10, NULL, ascii=T)) 
R> cat(mychars, file=outCon); close(outCon) 
R> fname <- "/tmp/jd.txt" 
R> readChar(fname, file.info(fname)$size) 
[1] "A\n2\n133633\n131840\n13\n10\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" 
R> unserialize(charToRaw(readChar(fname, file.info(fname)$size))) 
[1] 1 2 3 4 5 6 7 8 9 10 
R> 
+0

回想起来,我应该把我的对象保留为原始状态,我会确定并注意到,当我将从R on Hadoop中学到的经验融合在一起时,看起来像缺少readChar()函数再次感谢Dirk! – 2010-02-13 18:22:39

+0

没错。我完全忘记插入我们的RProtoBuf软件包,这当然也有帮助!目前还没有Windows二进制文件,因为我们没有MinGW构建的适合与R链接的库。 – 2010-02-13 18:34:29