2010-02-13 61 views
7

我在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處理換行符的方式。

回答

7

法學博士,我們在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

相關問題