2014-08-29 7 views
12

पर्ल (और शायद अन्य लैंगुग्स) में, आप उपयोगकर्ता के परिभाषित व्यवहार के साथ अपने अंतर्निहित व्यवहार को प्रतिस्थापित करने के लिए एक चर "टाई" कर सकते हैं। उदाहरण के लिए, एक हैश तालिका कस्टम "प्राप्त करें" और "fetch" subroutines से बंधी जा सकती है, उदाहरण के लिए, बर्कलेडीबी से पूछताछ करें ताकि डेटा लगातार और सीमित न हो, लेकिन फिर भी दिखता है और पर्ल को नियमित हैश की तरह कार्य करता है।क्या आप आर में डेटा.फ्रेम के "टाई" या वैकल्पिक कार्यान्वयन प्रदान कर सकते हैं?

आर के साथ कुछ ऐसा ही संभव है? विशेष रूप से, मैं सोच रहा था, के बाद से एक data.frame ज्यादा एक संबंधपरक DB में एक मेज की तरह दिखता है, कि एक data.frame SQLite तरह कुछ से बंधा रहे थे, यह बहुत बड़े डेटा फ्रेम को संभालने के लिए आर सक्षम होगा (मैं 100GB + SQLite में भरा है) बिना कोड परिवर्तन के।

+2

कोशिश पैकेज 'अपने वास्तविक समस्या के लिए sqldf', लेकिन मुझे लगता है कि तुम क्या प्रस्ताव कर रहे हैं एस 3 वर्ग तंत्र है। – James

+1

पैकेज 'ff' और' ffbase' जांचें, वे बिल्कुल उस सिद्धांत पर बनाए गए हैं। –

+4

'data.table' और' dplyr' की नई 'tbl_ *' साथ ही – hrbrmstr

उत्तर

2

के रूप में टिप्पणी का कहना है, पैकेज के एक मुट्ठी भर पहले से ही इस विचार (या समान) पर बनाए गए हैं।

data.table और dplyr बहुत बड़े डेटा से निपटने में असाधारण रूप से अच्छे हैं। फ्रेम और उन्हें पूछताछ। यदि डेटा.फ्रेम वास्तव में> 100 जीबी है, तो मैं डेटा.table की अनुशंसा करता हूं जो सीमा nrow-> Inf में dplyr को बेहतर प्रदर्शन करता है। स्टैक ओवरफ्लो पर दोनों को उत्कृष्ट समर्थन होना चाहिए, आपको इसकी आवश्यकता होनी चाहिए।

हालांकि, वास्तव में आपके सवाल का जवाब देने के लिए (और इस सवाल के भविष्य के पाठकों के लिए उपयोगी होने के लिए): हाँ यह आर के साथ एक समारोह अधिभार के लिए एक विकल्प के व्यवहार प्रदान करने के लिए संभव है। यह वास्तव में एस 3 प्रेषण प्रणाली के साथ बहुत आसान है। मैं और जानने के लिए this ressource की सलाह देते हैं।

मैं आपको संघीय संस्करण दूंगा: यदि आपके पास "myclass" वर्ग का ऑब्जेक्ट है, तो आप जो भी चाहते हैं उसे करने के लिए आप एक फ़ंक्शन f.myclass लिख सकते हैं।

f <- function(obj, ...) UseMethod("f", obj, ...) 

जब आप f(obj) फोन, समारोह है कि UseMethod फोन करेगा obj के वर्ग पर निर्भर करता है:

तो फिर तुम सामान्य समारोह च परिभाषित करते हैं।

obj वर्ग "MyClass" का है, तो f.myclass obj पर बुलाया जाएगा।

समारोह आप को फिर से परिभाषित करना चाहते हैं पहले से ही मौजूद है, तो plot कहते हैं, तो आप बस plot.myclass परिभाषित कर सकते हैं जो उपयोग किया जाएगा जब आप एक "MyClass" वस्तु पर plot कहते हैं। जेनेरिक फ़ंक्शन पहले से मौजूद है, इसे फिर से परिभाषित करने की आवश्यकता नहीं है।

किसी ऑब्जेक्ट की श्रेणी को बदलने के लिए (या मौजूदा कक्षा में नई कक्षा को जोड़ना, जो उस व्यवहार को तोड़ने के लिए अधिक आम है जिसे आप बदलना नहीं चाहते हैं), तो आप class<- का उपयोग कर सकते हैं।

यहां एक मूर्ख उदाहरण है।

> print.myclass <- function(x) { 
    print("Hello!")} 

> df <- data.frame(a=1:3) 
> class(df) 
[1] "data.frame" 
> df #equivalent to print(df) 
    a 
1 1 
2 2 
3 3 

> class(df) <- append(class(df), "myclass") 
> class(df) 
[1] "data.frame" "myclass" 

> class(df) <- "myclass" 
> class(df) 
[1] "myclass" 
> df 
[1] "Hello!" 
> str(df) # checking the structure of df: the data is still there of course 
List of 1 
$ a: int [1:3] 1 2 3 
- attr(*, "row.names")= int [1:3] 1 2 3 
- attr(*, "class")= chr "myclass" 

कुछ बारीकियों, अगर वहाँ कई वर्गों रहे हैं जो की तरह समारोह कहा जाता है क्या आदेश, आदि मैं तुम्हें S3 प्रणाली का एक विस्तृत विवरण का उल्लेख में, कर रहे हैं।

कि आप कार्यों का व्यवहार कैसे फिर से परिभाषित करेंगे। उन्हें f.myclass के रूप में दोबारा लिखें और फिर कक्षा "myclass" की वस्तुएं बनाएं।

वैकल्पिक रूप से, आप f.targetclass को फिर से परिभाषित कर सकता है।उदाहरण के लिए, फिर से print और data.frame साथ:

> print.data.frame <- function(x) { 
     print(paste("data.frame with columns:", paste(names(x), collapse = ", ")))} # less silly example! 
> df <- data.frame(a=1:3, b=4:6) 
> df 
[1] "data.frame with columns: a, b" 
संबंधित मुद्दे