आर और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग


80

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग एक तरह से या किसी अन्य आर में बहुत संभव है। हालांकि, उदाहरण के लिए, पायथन के विपरीत, ऑब्जेक्ट ओरिएंटेशन को प्राप्त करने के कई तरीके हैं:

मेरा सवाल यह है कि:

R में OO प्रोग्रामिंग के इन तरीकों में क्या प्रमुख अंतर हैं?

आदर्श रूप से यहां के उत्तर आर प्रोग्रामर के लिए एक संदर्भ के रूप में काम करेंगे, जो यह तय करने की कोशिश कर रहे हैं कि कौन से ओओ प्रोग्रामिंग तरीके उनकी आवश्यकताओं के अनुरूप हैं।

जैसे, मैं विस्तार से पूछ रहा हूं, अनुभव के आधार पर एक उद्देश्यपूर्ण तरीके से प्रस्तुत किया गया है, और तथ्यों और संदर्भ के साथ समर्थित है। यह स्पष्ट करने के लिए बोनस अंक कि ये विधियाँ मानक OO प्रथाओं के नक्शे कैसे हैं


1
संदर्भ कक्षाओं की जानकारी: stackoverflow.com/questions/5137199/…
अरी बी। फ्रीडमैन

धन्यवाद, क्या आप उत्तर के रूप में लिंक को फिर से तैयार कर सकते हैं? यह अच्छा होगा यदि आप संदर्भ वर्गों का एक छोटा सारांश शामिल कर सकते हैं, और वे S3 / S4 वर्गों के संबंध में बेहतर क्यों हैं।
पॉल हीमस्ट्रा

एक छोटा पक्षी मेरे कान में फुसफुसाया कि इस पर एक किताब जॉन चैम्बर्स द्वारा आगामी होगी। लेकिन किसी को भी मैंने यह नहीं बताया कि ... ;-)
डिर्क एडल्डबुलेटेल

1
रिफ़ेन्सेंस क्लासेस के बारे में कुछ और जानकारी के साथ उसी छोटे से बीड़ी का जवाब नीचे दिया जा सकता है;)
पॉल हीमस्ट्रा

जवाबों:


34

S3 कक्षाएं

  • वास्तव में ऑब्जेक्ट्स नहीं, एक नामकरण सम्मेलन का अधिक
  • के आसपास आधारित है। वाक्यविन्यास: प्रिंट, printकॉल print.lm print.anova, आदि के लिए और यदि नहीं मिला,print.default

S4 कक्षाएं

संदर्भ कक्षाएं

आद्य

  • ggplot2 मूल रूप से प्रोटो में लिखा गया था, लेकिन अंततः S3 का उपयोग करके फिर से लिखा जाएगा।
  • नीट कॉन्सेप्ट (प्रोटोटाइप, कक्षाएं नहीं), लेकिन व्यवहार में मुश्किल लगता है
  • Ggplot2 का अगला संस्करण इससे दूर जा रहा है
  • अवधारणा और कार्यान्वयन का विवरण

R6 कक्षाएं

  • संदर्भ से
  • S4 वर्गों पर निर्भर नहीं करता है
  • " R6 वर्ग बनाना संदर्भ वर्ग के समान है, सिवाय इसके कि फ़ील्ड और विधियों को अलग करने की कोई आवश्यकता नहीं है, और आप फ़ील्ड के प्रकार निर्दिष्ट नहीं कर सकते।"

1
एडिट करने के लिए बेझिझक अगर आपके पास जोड़ने के लिए अन्य मतभेद हैं, तो मैं रोने नहीं जा रहा हूं अगर यह CW हो जाता है :-)
एर बी। फ्रीडमैन

3
मत भूलोlibrary("fortunes"); fortune("strait")
बेन बोल्कर

1
यहां एस 4 वर्गों पर एक चर्चा: stackoverflow.com/questions/3602154/… । सामान्य भावना से लगता है कि वे अधिक परेशान हैं तो वे एक फायदा पहुंचाते हैं।
पॉल हीमस्ट्रा

दिलचस्प बात यह है कि नई R6 कक्षाएं स्पष्ट रूप से स्वीकार करती हैं कि उस संख्या का उपयोग करने से बचते हुए संदर्भ कक्षाएं R5 थीं। विवाद (नए सिरे से) शुरू होने दें।
अरी बी। फ्रीडमैन

1
R5 नाम मूल रूप से संदर्भ वर्गों के डेवलपर्स के अलावा अन्य लोगों द्वारा मजाक के रूप में इस्तेमाल किया गया था। R6 नाम "R5" की एक पावती है, लेकिन इसका अर्थ यह नहीं है कि R5 नाम का कोई आधिकारिक समर्थन है।
WCH

19

3/8/12 को संपादित करें: नीचे दिया गया उत्तर मूल रूप से पोस्ट किए गए प्रश्न के एक टुकड़े का जवाब देता है जिसे बाद में हटा दिया गया है। मैंने अपने उत्तर के लिए संदर्भ प्रदान करने के लिए इसे नीचे कॉपी किया है:

जावा या पायथन में उपयोग किए जाने वाले अधिक मानक OO तरीकों के लिए अलग-अलग OO तरीके कैसे मैप करते हैं?


मेरा योगदान आपके दूसरे प्रश्न से संबंधित है, R का OO तरीकों को अधिक मानक OO विधियों में कैसे मैप करता है। जैसा कि मैंने अतीत में इस बारे में सोचा है, मैं बार-बार दो मार्ग से लौटा हूं, एक फ्रेडरिक लेइस्क द्वारा, और दूसरा जॉन चैम्बर्स द्वारा। दोनों आर्टिकुलेटिंग का एक अच्छा काम करते हैं क्यों आर में ओओ जैसी प्रोग्रामिंग कई अन्य भाषाओं की तुलना में एक अलग स्वाद है।

सबसे पहले, फ्रेडरिक लेश्चर, "क्रिएटिंग आर पैकेज्स: ए ट्यूटोरियल" ( चेतावनी: पीडीएफ ) से:

एस दुर्लभ है क्योंकि यह दोनों इंटरैक्टिव है और इसमें ऑब्जेक्ट-ओरिएंटेशन के लिए एक सिस्टम है। डिजाइनिंग कक्षाएं स्पष्ट रूप से प्रोग्रामिंग हैं, फिर भी एस को एक इंटरैक्टिव डेटा विश्लेषण वातावरण के रूप में उपयोगी बनाने के लिए, यह समझ में आता है कि यह एक कार्यात्मक भाषा है। "वास्तविक" ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (ओओपी) भाषाओं में सी ++ या जावा क्लास और मेथड परिभाषाएं कसकर एक साथ बंधी हैं, विधियां कक्षाओं का हिस्सा हैं (और इसलिए ऑब्जेक्ट्स)। हम पूर्व-परिभाषित कक्षाओं के लिए उपयोगकर्ता-परिभाषित तरीकों की तरह वृद्धिशील और इंटरैक्टिव परिवर्धन चाहते हैं। जब भी हम डेटा सेट का विश्लेषण करते हैं, तो ये परिवर्धन कमांड लाइन प्रॉम्प्ट पर फ्लाई पर भी किए जा सकते हैं। एस वस्तु अभिविन्यास और इंटरैक्टिव उपयोग के बीच एक समझौता करने की कोशिश करता है, और हालांकि समझौता उन सभी लक्ष्यों के संबंध में कभी भी इष्टतम नहीं होता है जो वे पहुंचने की कोशिश करते हैं, वे अक्सर अभ्यास में आश्चर्यजनक रूप से अच्छी तरह से काम करते हैं।

दूसरा मार्ग जॉन चैम्बर्स की शानदार पुस्तक "सॉफ्टवेयर फॉर डेटा एनालिसिस" से आया है । ( उद्धृत उद्धरण के लिए लिंक ):

OOP प्रोग्रामिंग मॉडल एस भाषा से अलग है, लेकिन पहला बिंदु, भले ही एस और कुछ अन्य कार्यात्मक भाषाएं कक्षाओं और विधियों का समर्थन करती हैं। एक ओओपी प्रणाली में विधि परिभाषाएं वर्ग के लिए स्थानीय हैं; कोई आवश्यकता नहीं है कि किसी विधि के लिए समान नाम का अर्थ असंबंधित वर्ग के लिए समान है। इसके विपरीत, R में विधि परिभाषाएँ एक वर्ग परिभाषा में नहीं रहती हैं; वैचारिक रूप से, वे सामान्य कार्य से जुड़े हैं। कक्षा की परिभाषाएं विधि चयन का निर्धारण, सीधे या उत्तराधिकार के माध्यम से दर्ज करती हैं। ओओपी मॉडल के लिए उपयोग किए जाने वाले प्रोग्रामर कभी-कभी निराश या भ्रमित होते हैं कि उनकी प्रोग्रामिंग सीधे आर में स्थानांतरित नहीं होती है, लेकिन यह नहीं हो सकता है। विधियों का कार्यात्मक उपयोग अधिक जटिल है, लेकिन सार्थक कार्यों के लिए अधिक अभ्यस्त है, और इसे OOP संस्करण में कम नहीं किया जा सकता है।


14

S3 और S4 ओओ प्रोग्रामिंग के लिए आधिकारिक (यानी बिल्ट इन) दृष्टिकोण प्रतीत होते हैं। मैंने निर्माता फ़ंक्शन / विधि में एम्बेडेड फ़ंक्शन के साथ S3 के संयोजन का उपयोग करना शुरू कर दिया है। मेरा लक्ष्य एक वस्तु $ विधि () प्रकार सिंटैक्स था ताकि मेरे पास अर्ध-निजी क्षेत्र हों। मैं अर्ध-निजी कहता हूं क्योंकि वास्तव में उन्हें छिपाने का कोई तरीका नहीं है (जहां तक ​​मुझे पता है)। यहाँ एक सरल उदाहरण है जो वास्तव में कुछ भी नहीं करता है:

#' Constructor
EmailClass <- function(name, email) {
    nc = list(
        name = name,
        email = email,
        get = function(x) nc[[x]],
        set = function(x, value) nc[[x]] <<- value,
        props = list(),
        history = list(),
        getHistory = function() return(nc$history),
        getNumMessagesSent = function() return(length(nc$history))
    )
    #Add a few more methods
    nc$sendMail = function(to) {
        cat(paste("Sending mail to", to, 'from', nc$email))
        h <- nc$history
        h[[(length(h)+1)]] <- list(to=to, timestamp=Sys.time())
        assign('history', h, envir=nc)
    }
    nc$addProp = function(name, value) {
        p <- nc$props
        p[[name]] <- value
        assign('props', p, envir=nc)
    }
    nc <- list2env(nc)
    class(nc) <- "EmailClass"
    return(nc)
}

#' Define S3 generic method for the print function.
print.EmailClass <- function(x) {
    if(class(x) != "EmailClass") stop();
    cat(paste(x$get("name"), "'s email address is ", x$get("email"), sep=''))
}

और कुछ परीक्षण कोड:

    test <- EmailClass(name="Jason", "jason@bryer.org")
    test$addProp('hello', 'world')
    test$props
    test
    class(test)
    str(test)
    test$get("name")
    test$get("email")
    test$set("name", "Heather")
    test$get("name")
    test
    test$sendMail("jbryer@excelsior.edu")
    test$getHistory()
    test$sendMail("test@domain.edu")
    test$getNumMessagesSent()

    test2 <- EmailClass("Nobody", "dontemailme@nowhere.com")
    test2
    test2$props
    test2$getHistory()
    test2$sendMail('nobody@exclesior.edu')

यहाँ एक ब्लॉग पोस्ट की एक कड़ी है जो मैंने इस दृष्टिकोण के बारे में लिखा है: http://bryer.org/2012/object-oriented-programming-in-r मैं इस दृष्टिकोण के लिए टिप्पणियों, आलोचनाओं और सुझावों का स्वागत करूँगा क्योंकि मैं आश्वस्त नहीं हूं। अपने आप से अगर यह सबसे अच्छा तरीका है। हालाँकि, जिस समस्या के समाधान के लिए मैं प्रयास कर रहा था, उसने बहुत काम किया है। विशेष रूप से, मेकआर पैकेज ( http://jbryer.github.com/makeR ) के लिए मैं उपयोगकर्ताओं को सीधे डेटा फ़ील्ड बदलना नहीं चाहता था क्योंकि मुझे यह सुनिश्चित करने की आवश्यकता थी कि एक XML फ़ाइल जो मेरी वस्तु स्थिति का प्रतिनिधित्व करती है सिंक में रहेगी। यह पूरी तरह से तब तक काम करता था जब तक उपयोगकर्ता प्रलेखन में मेरे द्वारा बताए गए नियमों का पालन करते हैं।


10
आप उपरोक्त कोड के साथ "हाथ से" संदर्भ कक्षाओं का फिर से आविष्कार कर रहे हैं ... यह बस बात को थोड़ा और अधिक नाजुक बनाता है।
साइमन अर्बनक

धन्यवाद साइमन। जब तक मैंने यह पोस्ट किया, तब तक मैं ReferenceClasses से अनजान था।
13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.