R में "S3 तरीके" का क्या अर्थ है?


124

चूंकि मैं आर के लिए काफी नया हूं, इसलिए मुझे नहीं पता कि एस 3 तरीके और वस्तुएं क्या हैं। मैंने पाया कि S3 और S4 ऑब्जेक्ट सिस्टम हैं, और कुछ यदि संभव हो तो S3 पर S3 का उपयोग करने की सलाह देते हैं ( http://google-styleguide.googlecode.com/svn/trunk/google-r-style पर Google की R स्टाइल गाइड देखें) । html ) *। हालाँकि, मुझे S3 विधियों / वस्तुओं की सही परिभाषा नहीं पता है।

अपडेट: 2019 तक, Google की आर स्टाइल गाइड हाइपरलिंक अब यहां है

जवाबों:


85

अधिकांश प्रासंगिक जानकारी को देखकर ?S3या ?UseMethodसंक्षेप में पाया जा सकता है :

S3 पद्धति प्रेषण की एक योजना को संदर्भित करता है। आप थोड़ी देर के लिए आर का उपयोग किया है, तो आप देखते हैं कि ध्यान देंगे print, predictऔर summaryवस्तुओं के विभिन्न प्रकार के एक बहुत कुछ करने के लिए तरीके।

S3 में, यह काम करता है:

  • ब्याज की वस्तुओं के वर्ग की स्थापना (जैसे: विधि के लिए कॉल का वापसी मूल्य glmवर्ग है glm)
  • सामान्य नाम (उदाहरण के लिए के साथ एक विधि प्रदान printclassname), तो एक बिंदु है, और फिर (जैसे: print.glm)
  • काम करने के लिए इस सामान्य नाम ( print) के लिए कुछ तैयारी की गई है , लेकिन अगर आप बस मौजूदा पद्धति के नामों के अनुरूप खुद को देखना चाहते हैं, तो आपको इसकी आवश्यकता नहीं है (यदि आप करते हैं तो मैंने पहले जो मदद की थी उसे देखें) )।

देखने वाले की नजर में, और विशेष रूप से, आपके नए बनाए गए फंकी मॉडल फिटिंग पैकेज के उपयोगकर्ता, यह टाइप करने में सक्षम होने के लिए बहुत अधिक सुविधाजनक predict(myfit, type="class")है predict.mykindoffit(myfit, type="class")

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


54

आपको S3 के साथ आरंभ करने के लिए, medianफ़ंक्शन के लिए कोड देखें । medianकमांड प्रॉम्प्ट पर टाइप करने से पता चलता है कि उसके शरीर में एक लाइन है, अर्थात्

UseMethod("median")

इसका मतलब है कि यह एक S3 विधि है। दूसरे शब्दों में, आपके पास अलग- medianअलग S3 वर्गों के लिए एक अलग फ़ंक्शन हो सकता है । सभी संभव मध्ययुगीन तरीकों को सूचीबद्ध करने के लिए, टाइप करें

methods(median) #actually not that interesting.  

इस स्थिति में, केवल एक ही विधि है, डिफ़ॉल्ट, जिसे कुछ भी कहा जाता है। आप इसके लिए कोड टाइप करके देख सकते हैं

median.default

एक अधिक दिलचस्प उदाहरण printफ़ंक्शन है, जिसमें कई अलग-अलग विधियां हैं।

methods(print)  #very exciting

ध्यान दें कि कुछ विधियां *उनके नाम के बगल में हैं। इसका मतलब है कि वे कुछ पैकेज के नाम स्थान के अंदर छिपे हुए हैं। का प्रयोग करें findपता लगाने के लिए जो पैकेज वे में हैं। उदाहरण के लिए

find("acf")  #it's in the stats package
stats:::print.acf

39

से http://adv-r.had.co.nz/OO-essentials.html :

R की तीन OO प्रणालियाँ भिन्न होती हैं कि वर्गों और विधियों को कैसे परिभाषित किया जाता है:

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

  • S4 S3 के समान काम करता है, लेकिन अधिक औपचारिक है। S3 के दो प्रमुख अंतर हैं। S4 की औपचारिक कक्षा परिभाषाएँ हैं, जो प्रत्येक वर्ग के लिए प्रतिनिधित्व और विरासत का वर्णन करती हैं, और जेनरिक और विधियों को परिभाषित करने के लिए विशेष सहायक कार्य करती हैं। S4 में कई प्रेषण भी हैं, जिसका अर्थ है कि सामान्य कार्य किसी भी संख्या के तर्कों के वर्ग के आधार पर विधियां चुन सकते हैं, न कि केवल एक।

  • शॉर्ट के लिए आरसी नामक संदर्भ कक्षाएं, एस 3 और एस 4 से काफी अलग हैं। RC संदेश-पास करने वाले OO को लागू करता है, इसलिए विधियाँ कक्षाओं से संबंधित हैं, कार्य नहीं। $ का उपयोग वस्तुओं और विधियों को अलग करने के लिए किया जाता है, इसलिए विधि कॉल कैनवस $ ड्राअरक्ट ("ब्लू") जैसी दिखती है। RC ऑब्जेक्ट भी म्यूट होते हैं: वे R के सामान्य कॉपी-ऑन-संशोधित शब्दार्थ का उपयोग नहीं करते हैं, लेकिन उन्हें संशोधित किया जाता है। यह उनके बारे में तर्क करना कठिन बनाता है, लेकिन उन्हें उन समस्याओं को हल करने की अनुमति देता है जो S3 या S4 के साथ हल करना मुश्किल है।

वहाँ भी एक अन्य प्रणाली है कि काफी OO नहीं है, लेकिन यहाँ उल्लेख करना महत्वपूर्ण है:

  • आधार प्रकार, आंतरिक O- स्तर के प्रकार जो अन्य OO सिस्टम को रेखांकित करते हैं। बेस प्रकार ज्यादातर सी कोड का उपयोग करके हेरफेर किए जाते हैं, लेकिन इसके बारे में जानना महत्वपूर्ण है क्योंकि वे अन्य ओओ सिस्टम के लिए बिल्डिंग ब्लॉक प्रदान करते हैं।

11

इस सवाल पर मैं ज्यादातर सोच में पड़ गया कि नाम कहाँ से आया। यह इस विकिपीडिया लेख से प्रतीत होता है कि नाम एस प्रोग्रामिंग भाषा के संस्करण को संदर्भित करता है जो आर पर आधारित है। अन्य उत्तरों में वर्णित विधि प्रेषण योजनाएँ S से आती हैं और संस्करण के अनुसार उचित रूप से लेबल की जाती हैं।


10

प्रयत्न

methods(residuals)

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

setClass("myClass", representation(label = "character", x = "numeric", y = "numeric"))

उस वर्ग के ऑब्जेक्ट के साथ कॉल की जाने वाली विधियाँ उन सदस्यों के ऑब्जेक्ट पर निर्भर कर सकती हैं। यह एस 3 वर्गों से बहुत अलग है, जो तत्वों के एक समूह की एक सूची है।

S3 और S4 के साथ, आप एक सदस्य फ़ंक्शन को कॉल करते हैं fun(object, args)और उसके द्वारा नहीं object$fun(args)। यदि आप उत्तरार्द्ध की तरह कुछ देख रहे हैं, तो प्रोटो पैकेज पर एक नज़र डालें।


मुझे पूरा यकीन है कि ऑब्जेक्ट से संबंधित सदस्य फ़ंक्शंस और विधियों का विचार R में बहुत अधिक समझ में नहीं आता है। विधियाँ ऑब्जेक्ट से संबंधित नहीं हैं (फ़ंक्शन भी ऑब्जेक्ट हैं), लेकिन फ़ंक्शन से संबंधित हैं।
पीटरमेरिस

3

हैडली विकम (RStudio में मुख्य वैज्ञानिक) द्वारा "एडवांस्ड आर, 2 डी संस्करण" (सीआरसी प्रेस, 2019) के अनुसार कई आर ऑब्जेक्ट सिस्टम का अपडेटेड फास्ट रंडाउन है, जिसमें ऑब्जेक्ट के बारे में अध्याय के आधार पर यहां एक वेब प्रतिनिधित्व है -ऑर्डिनेटेड प्रोग्रामिंग

एडवांस्ड आर बुक कवर

2015 के पहले संस्करण में ओओ पर संबंधित अध्याय के साथ यहां एक वेब प्रतिनिधित्व है

ऊ सिस्टम के लिए दृष्टिकोण

हेडली ने ओओ प्रोग्रामिंग के लिए दो अलग-अलग तरीकों को अलग करने के लिए निम्नलिखित को परिभाषित किया है:

कार्यात्मक OOP : विधियां (कॉल करने योग्य कोड टुकड़े) जेनेरिक कार्यों (जावा / सी # सामान्य तरीकों के साथ भ्रमित नहीं होने ) से संबंधित हैं । ग्लोबल लुकअप टेबल में स्थित होने के तरीकों के बारे में सोचें। निष्पादित करने की विधि फ़ंक्शन के नाम के आधार पर रनटाइम सिस्टम द्वारा पाई जाती है और उस फ़ंक्शन को पारित किए गए एक या अधिक तर्कों के प्रकार (या ऑब्जेक्ट क्लास) (इसे "विधि प्रेषण" कहा जाता है)। सिंटेक्स-वार, विधि कॉल सामान्य फ़ंक्शन कॉल की तरह लग सकता है myfunc(object, arg1, arg2):। यह कॉल जोड़ी ("myfunc", टाइपोफ़ (ऑब्जेक्ट)) या संभवतः ("myfunc", typeof (ऑब्जेक्ट), टाइपोफ़ (arg1), टाइपोफ़ (arg2) से जुड़ी विधि की तलाश के लिए रनटाइम का नेतृत्व करेगी अगर भाषा उस का समर्थन करती है। R के S3 में जेनेरिक फंक्शन का पूरा नाम (फंक्शन-नेम, क्लास) पेयर देता है। उदाहरण के लिए: mean.DateDates के माध्य की गणना करने की विधि है। methods("mean")फ़ंक्शन नाम के साथ सामान्य विधियों को सूचीबद्ध करने का प्रयास करें mean। कार्यात्मक OOP दृष्टिकोण उदाहरण के लिए OO पायनियर स्मॉलटॉक , कॉमन लिस्प ऑब्जेक्ट सिस्टम और जूलिया में पाया जाता है । हैडली ने कहा कि "आर की तुलना में, जूलिया का कार्यान्वयन पूरी तरह से विकसित है और बहुत ही शानदार है।"

इनकैप्सुलेटेड OOP : तरीके ऑब्जेक्ट या क्लासेस के होते हैं, और मेथड कॉल आमतौर पर दिखते हैं object.method(arg1, arg2)। इसे एनकैप्सुलेटेड कहा जाता है क्योंकि ऑब्जेक्ट डेटा (फ़ील्ड्स) और व्यवहार (तरीके) दोनों को इनकैप्सुलेट करता है । ऑब्जेक्ट या ऑब्जेक्ट के क्लास विवरण से जुड़ी लुकअप तालिका में स्थित होने के तरीके के बारे में सोचें। रनटाइम विधि के नाम के आधार पर विधि को देखता है और संभवतः एक या अधिक तर्कों का प्रकार है। यह "लोकप्रिय" OO भाषाओं जैसे C ++, Java, C # में पाया जाने वाला दृष्टिकोण है।

दोनों मामलों में, यदि वंशानुक्रम समर्थित है (यह संभवतः है), रनटाइम वर्ग पदानुक्रम को ऊपर की ओर ले जा सकता है जब तक कि यह कॉल लुकिंग कुंजी के लिए एक मैच नहीं मिला है।

कैसे पता लगाया जाए कि R ऑब्जेक्ट किस सिस्टम से संबंधित है

library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"

आर ऑब्जेक्ट सिस्टम

S3

  • कार्यात्मक ओओपी दृष्टिकोण।
  • हैडली के अनुसार सबसे महत्वपूर्ण प्रणाली।
  • सबसे सरल, सबसे आम। पहले OO प्रणाली का उपयोग आर।
  • बेस आर के साथ आता है, पूरे बेस आर में उपयोग किया जाता है।
  • लागू गारंटी के बजाय सम्मेलनों पर निर्भर करता है।
  • देखें चेम्बर्स, जॉन एम, और ट्रेवर जम्मू Hastie। 1992. "एस में सांख्यिकीय मॉडल" वड्सवर्थ और ब्रूक्स / कोल एडवांस्ड बुक्स एंड सॉफ्टवेयर।
  • में विवरण "उन्नत अनुसंधान, 2 संस्करण" यहाँ

एस 4

  • कार्यात्मक ओओपी दृष्टिकोण।
  • हैडली के अनुसार तीसरी सबसे महत्वपूर्ण प्रणाली।
  • S3 का पुनर्लेखन, इसलिए S3 के समान है, लेकिन अधिक औपचारिक और अधिक सख्त: यह आपको प्रोग्राम डिजाइन के बारे में सावधानी से सोचने के लिए मजबूर करता है। बड़ी प्रणालियों के निर्माण के लिए उपयुक्त (जैसे बायोकॉन्टर प्रोजेक्ट)।
  • आधार "विधियों" पैकेज में लागू किया गया।
  • देखें: चैम्बर्स, जॉन एम। 1998. "डेटा के साथ प्रोग्रामिंग: ए गाइड टू द एस लैंग्वेज।" स्प्रिंगर।
  • में विवरण "उन्नत अनुसंधान, 2 संस्करण" यहाँ

आरसी उर्फ ​​"संदर्भ कक्षाएं"

  • एन्क्रिप्टेड OOP दृष्टिकोण।
  • बेस आर के साथ आता है।
  • S4 पर आधारित है।
  • RC ऑब्जेक्ट विशेष प्रकार के S4 ऑब्जेक्ट हैं जो "म्यूटेबल" भी हैं। आर के सामान्य कॉपी-ऑन-संशोधित शब्दार्थों का उपयोग करने के बजाय, उन्हें जगह-जगह संशोधित किया जा सकता है। ध्यान दें कि उत्परिवर्तनीय स्थिति के बारे में तर्क करना मुश्किल है और बदसूरत कीड़े का स्रोत है लेकिन कुछ अनुप्रयोगों में अधिक कुशल कोड हो सकता है।

R6

  • एन्क्रिप्टेड OOP दृष्टिकोण।
  • हेडली के अनुसार दूसरी सबसे महत्वपूर्ण प्रणाली।
  • R6 पैकेज में पाया जा सकता है (के साथ स्थापित library(R6))
  • आरसी के समान, लेकिन हल्का और बहुत तेज: यह S4 या विधियों पैकेज पर निर्भर नहीं करता है । आर वातावरण के शीर्ष पर निर्मित। भी है:
    • सार्वजनिक और निजी तरीके
    • सक्रिय बाइंडिंग (फ़ील्ड, जिसे एक्सेस करते समय, वास्तव में एक विधि कहते हैं)
    • क्लास इनहेरेंस जो पैकेज में काम करती है
    • दोनों वर्ग के तरीकों (कोड उस वर्ग के अंतर्गत आता है और के माध्यम से एक उदाहरण का उपयोग कर सकते self, private, super) और सदस्य कार्यों (क्षेत्रों के लिए सौंपे गए कार्य है, लेकिन जो तरीकों नहीं कर रहे हैं, बस कार्यों)
  • आर के "कॉपी-ऑन-संशोधित" शब्दार्थ से बचने के लिए एक मानकीकृत तरीका प्रदान करता है
  • पैकेज साइट देखें: "R6: R के लिए एन्क्रिप्टेड ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग"
  • में विवरण "उन्नत अनुसंधान, 2 संस्करण" यहाँ

अन्य

वहाँ दूसरों की तरह हैं R.oo (आर सी के समान), आद्य (प्रोटोटाइप आधारित, जावास्क्रिप्ट लगता है) और Mutatr । हालांकि, "उन्नत आर" कहता है:

आर 6 के अलावा, जिसका व्यापक रूप से उपयोग किया जाता है, ये सिस्टम मुख्य रूप से सैद्धांतिक हित हैं। उनके पास अपनी ताकत है, लेकिन कुछ आर उपयोगकर्ता उन्हें जानते और समझते हैं, इसलिए दूसरों के लिए आपके कोड को पढ़ना और योगदान करना कठिन है।

"एडवांस्ड आर, 2 डी एडिशन" में ट्रेड-ऑफ के अध्याय को भी पढ़ना सुनिश्चित करें ।

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