2010-02-13 12 views
7

मेरे पास आर में एक प्रक्रिया है जो वस्तुओं का एक गुच्छा बनाता है, उन्हें क्रमबद्ध करता है, और उन्हें सादा पाठ फ़ाइलों में डाल देता है। यह चीजों को संभालने का एक बहुत अच्छा तरीका प्रतीत होता है क्योंकि मैं हडोप के साथ काम कर रहा हूं और सभी आउटपुट को स्टडीन और स्टडआउट के माध्यम से स्ट्रीम करने की आवश्यकता है।आर: ऑब्जेक्ट को टेक्स्ट फ़ाइल में क्रमबद्ध करें और फिर से वापस

जिस समस्या के साथ मुझे छोड़ा गया है, वह है कि इन ऑब्जेक्ट को टेक्स्ट फ़ाइल से कैसे पढ़ा जाए और वापस मेरी डेस्कटॉप मशीन पर आर में कैसे पढ़ा जाए। यहां एक कामकाजी उदाहरण दिया गया है जो चुनौती को दर्शाता है:

चलो एक टीएमपी फाइल बनाएं और इसमें एक ऑब्जेक्ट लिखें।

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

mychars वस्तु इस तरह दिखता है:

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

मैं शायद कर रहा हूँ:

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

जब पाठ के लिए लिखा यह ऐसा दिखाई देगा दायर इस वस्तु सिर्फ एक वेक्टर है कुछ स्पष्ट रूप से स्पष्ट दिख रहा है, लेकिन मैं इस फ़ाइल को आर में वापस कैसे पढ़ूं और ऑब्जेक्ट को बेअसर कर सकता हूं? जब मैं स्कैन() या रीडलाइन() दोनों को नए लाइन वर्णों को रिकॉर्ड डिलीमीटर के रूप में देखना चाहता हूं और मैं वेक्टर के साथ समाप्त होता हूं जहां प्रत्येक तत्व टेक्स्ट फ़ाइल से एक पंक्ति है। जो मैं वास्तव में चाहता हूं वह फ़ाइल की पूरी सामग्री के साथ एक टेक्स्ट स्ट्रिंग है। फिर मैं स्ट्रिंग को बेअसर कर सकता हूं।

पर्ल एक स्ट्रिंग में वापस लाइन ब्रेक पढ़ेगा, लेकिन मैं यह समझ नहीं सकता कि आर लाइन लाइन ब्रेक के तरीके को ओवरराइड कैसे करें।

उत्तर

7

जेडी, हम digest पैकेज में serialize() से raw पर/से करते हैं। यह अच्छा है क्योंकि आप एसक्यूएलएज्ड ऑब्जेक्ट्स को एसक्यूएल और अन्य स्थानों में स्टोर कर सकते हैं। मैं वास्तव में इसे आरडीएटा के रूप में भी स्टोर करूंगा जो कि 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

पीछे मुड़कर देखें तो मैं कच्चे रूप में मेरी वस्तुओं रखा जाना चाहिए था। मुझे यकीन है कि हो सकता है और ध्यान दें कि जब मैं साथ बुरा काम मेरी सबक Hadoop पर आर का उपयोग करने से सीखा होगा। यह टुकड़ा मैं याद आ रही थी readChar था की तरह लग रहा() फ़ंक्शन धन्यवाद फिर से Dirk! –

+0

सही। और मैं _completely_ हमारे RProtoBuf पैकेज को प्लग करने के लिए भूल गया जो निश्चित रूप से भी मदद करता है! अभी तक कोई विंडोज बाइनरी नहीं है क्योंकि हमारे पास आर के साथ लिंक करने के लिए उपयुक्त लाइब्रेरी का कोई मिनीगब्लू-निर्मित संस्करण नहीं है। –

संबंधित मुद्दे