oop - आर और ऑब्जेक्ट उन्मुख प्रोग्रामिंग




r (2)

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

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

आर में ओओ प्रोग्रामिंग के इन तरीकों में अंतर क्या अंतर है?

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

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


ओ 3 प्रोग्रामिंग के लिए एस 3 और एस 4 आधिकारिक (यानि निर्मित) दृष्टिकोण प्रतीत होते हैं। मैंने कन्स्ट्रक्टर फ़ंक्शन / विधि में एम्बेडेड फ़ंक्शंस के साथ 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", "[email protected]")
    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("[email protected]")
    test$getHistory()
    test$sendMail("[email protected]")
    test$getNumMessagesSent()

    test2 <- EmailClass("Nobody", "[email protected]")
    test2
    test2$props
    test2$getHistory()
    test2$sendMail('[email protected]')

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


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

विभिन्न ओओ विधियों को जावा या पायथन जैसे प्रयोग किए जाने वाले अधिक मानक ओओ विधियों के लिए कैसे मानचित्रित किया जाता है?

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

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

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

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

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





r