{count, plural, one {कोर्स} other {कोर्स}}
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) एक प्रोग्रामिंग पैराजाइम है जिसमें सॉफ्टवेयर को फंक्शन्स के बजाय डेटा या ऑब्जेक्ट्स के इर्द-गिर्द डिज़ाइन करने के लिए अलग-अलग विधियों का उपयोग किया जाता है। OOP के संदर्भ में मेथड, दरअसल, एक function ही होता है। इसे ऑब्जेक्ट-ओरिएंटेड इसलिए कहा जाता है क्योंकि सारी प्रोसेसिंग ऑब्जेक्ट्स और फील्ड्स के इर्द-गिर्द घूमती है। हर ऑब्जेक्ट के अलग-अलग गुण (attributes) और व्यवहार (behavior) होते हैं।
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में, पूरे प्रोग्राम को अलग-अलग क्लासेस में बाँटा जा सकता है ताकि प्रोग्राम के निष्पादन को जल्दी समझा जा सके। R एक फंक्शनल प्रोग्रामिंग भाषा है, और OOP बड़े सिस्टम संबंधी समस्याओं को मैनेज करने में मदद करेगा। OOP का उपयोग आमतौर पर GUI एप्लिकेशंस, खासकर वेब-एप्लिकेशंस, को मैनेज करने में होता है। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग डेटा विश्लेषण के लिए टूल बनाने में अच्छी है, लेकिन स्वयं डेटा विश्लेषण के लिए उतनी उपयुक्त नहीं।
OOP के सिस्टम
मुख्य रूप से OOP के दो प्रमुख सिस्टम होते हैं, जो नीचे वर्णित हैं:
- S3 क्लासेस: ये आपको फंक्शन्स को ओवरलोड करने देती हैं।
- S4 क्लासेस: ये आपको डेटा को सीमित करने देती हैं, क्योंकि प्रोग्राम को डीबग करना काफी कठिन हो सकता है।
नोट: इन क्लासेस पर विस्तार से चर्चा आगे की धारा में की जाएगी।
R में ऑब्जेक्ट्स
ऑब्जेक्ट्स, क्लास के instance होते हैं। साथ ही, R में सब कुछ एक ऑब्जेक्ट है और अधिक जानने के लिए R में डेटा टाइप्स देखें। इनके अपने attributes भी हो सकते हैं, जैसे class, attributes, dimnames, names आदि।
उदाहरण के लिए, ऑब्जेक्ट्स को <-, का उपयोग करके मान सौंपे जाते हैं। निम्नलिखित कोड स्निपेट पर विचार करें जहाँ 'a1' और 'a2' वे वेरिएबल हैं जिनमें संख्यात्मक मान दिए गए हैं।
a1 <- 10
a2 <- 20
किसी ऑब्जेक्ट को संख्याओं के एक सेट के रूप में भी असाइन किया जा सकता है, जहाँ 'a3' ऐसा ऑब्जेक्ट है जिसमें अलग-अलग संख्याओं का एक वेक्टर है।
a3 <- c(10,20,30)
यहाँ c 10, 20, 30 संख्याओं को एक वेक्टर में समाहित करता है।
एक वास्तविक जीवन का उदाहरण लें, जैसे एक छात्र, जिसके गुणों में नाम, आयु, कक्षा और लिंग शामिल हैं; शिक्षक के पास नाम, आयु और लिंग हैं।
st_name <- "andrew"
st_age <- 16
st_class <- 10
st_gender <- "male"
t_name <- "angelina"
t_age <- 26
t_gender <- "female"
student <- c(st_name, st_age, st_class, st_gender)
teacher <- c(t_name, t_age, t_gender)
print(student)
print(teacher)
[1] "andrew" "16" "10" "male"
[1] "angelina" "26" "female"
उपरोक्त कोड निम्नलिखित आउटपुट देता है:
"andrew" "16" "10" "male"
"angelina" "26" "female"
ऊपर दिए गए कोड में, आप विभिन्न प्रकार के ऑब्जेक्ट्स का उदाहरण देख सकते हैं। 'student' और 'teacher' ऑब्जेक्ट, जिन्हें वेरिएबल भी कहा जाता है, में 'character' और 'double' प्रकार के मान हैं।
R में क्लास
क्लास वह ब्लूप्रिंट है जो ऑब्जेक्ट बनाने में मदद करता है और उसके मेंबर वेरिएबल्स तथा उनके attributes को समाहित करता है।
जैसा कि पिछली धारा में चर्चा की गई, R में दो क्लास सिस्टम हैं: S3 और S4।
S3 क्लास
ये क्लासेस फंक्शन्स को generic और methods में बाँटकर ओवरलोड करने में मदद करती हैं।
functions = generic + methods
S3, C#, Java आदि जैसी अन्य प्रोग्रामिंग भाषाओं से काफी अलग है। क्योंकि इसे लागू करना बहुत सरल है, यह डिस्पैच के लिए केवल पहले आर्ग्युमेंट का उपयोग करता है। यही कारण है कि प्रोग्रामर के दृष्टिकोण से इसे बहुत अधिक ज्ञान की आवश्यकता नहीं होती।
S3, generic डॉट class की सख्त नेमिंग कन्वेंशन पर काम करता है।
generic.class
मेथड्स के आर्ग्युमेंट्स में generic के आर्ग्युमेंट्स होने चाहिए, और मेथड में ...arg शामिल होना चाहिए।
S3 क्लास का निर्माण और उदाहरण
नीचे दिए गए उदाहरण में आप S3 क्लास का निर्माण देखेंगे, जिसमें एक सूची (list) बनती है जहाँ कम्पोनेंट्स को उचित क्लास नाम के साथ पास किया जाता है और फिर परिणाम प्रिंट किया जाता है।
निम्न उदाहरण दिखाता है कि 'studentBio' एक सूची है जहाँ कम्पोनेंट्स 'student_name', 'student_age' और 'student_contact' के रूप में दिए गए हैं। क्लास का नाम 'Student Info' है, और 'studentBio' नई बनी क्लास है जिसके मान नीचे प्रदर्शित हैं।
studentBio <- list(studentName = "Harry Potter", studentAge = 19, studentContact="London")
class(studentBio) <- "StudentInfo"
studentBio
$studentName
[1] "Harry Potter"
$studentAge
[1] 19
$studentContact
[1] "London"
attr(,"class")
[1] "StudentInfo"
ऊपर दिया गया कोड नीचे जैसा आउटपुट देता है:
$studentName
"Harry Potter"
$studentAge
19
$studentContact
"London"
attr(,"class")
"StudentInfo"
यदि आप R में functions लिखने में सहज नहीं हैं, तो R में Functions उपयोग करने पर यह ट्यूटोरियल पढ़ें!
S3 में अपना Generic मेथड बनाना
आप नीचे दिए गए कोड का उपयोग करके अपना generic function लागू करेंगे।
नीचे का कोड 'contact' नामक generic function दिखाता है जहाँ ऑब्जेक्ट के साथ पास किया गया function उसे असाइन होता है। साथ ही, 'UseMethod' का उपयोग उसी generic function 'contact' के साथ किया जाता है जहाँ मेथड का 'dispatching' होता है — यह वह प्रक्रिया है जिसमें पास किए गए आर्ग्युमेंट्स के आधार पर परिणाम बदलता है।
contact <- function(object) {
UseMethod("contact")
}
आइए उस विशेष क्लास के लिए एक मेथड बनाते हैं जिसे आपने पहले बनाया था, जिसका नाम 'StudentInfo' है। 'contact' मेथड को डॉट नोटेशन के साथ क्लास 'StudentInfo' के साथ उपयोग किया जाता है, जहाँ function बॉडी में attribute 'studentContact' की पहुँच '$' का उपयोग करके की जाती है।
contact.StudentInfo <- function(object) {
cat("Your contact is", object$studentContact, "\n")
}
contact(studentBio)
Your contact is London
ऊपर का कोड object$studentContact का उपयोग करता है, जहाँ फंक्शन को पास किया गया ऑब्जेक्ट '$' के साथ attribute 'studentContact' तक पहुँचने के लिए प्रयोग होता है, जिसका परिणाम नीचे जैसा आता है।
Your contact is London
S4 क्लास
S4 क्लास अधिक सख्त, पारंपरिक और ऑब्जेक्ट-ओरिएंटेड कांसेप्ट्स से निकटता से संबंधित है। S4 की क्लासेस औपचारिक क्लास परिभाषाओं द्वारा दर्शाई जाती हैं। विशेष रूप से, S4 में मेथड्स और जेनेरिक्स के लिए setter और getter functions होते हैं। S3 क्लास की तुलना में, S4 बहु-डिस्पैच (multiple dispatch) को सक्षम कर सकता है।
आइए ऊपर चर्चा की गई R की क्लासेस को बनाकर देखें और उदाहरण सहित चर्चा करें।
S4 क्लास को set class फंक्शन का उपयोग करके परिभाषित किया जाता है।
setClass()
S4 क्लास का निर्माण और उदाहरण
जैसा कि पहले चर्चा की गई, S4 क्लास को setClass() मेथड से परिभाषित किया जाता है। आप setClass() मेथड का उपयोग करके S4 क्लास बनाएँगे और परिभाषित करेंगे। हम एक सबरूटीन का उपयोग करेंगे ताकि डेटा की एकरूपता (validation) की जाँच हो सके और डिफॉल्ट मान (paradigm) भी सेट किए जा सकें।
नीचे क्लास और उसके स्लॉट्स को परिभाषित करने का कोड है:
निम्न कोड एक क्लास को परिभाषित करने के लिए उपयोग होता है, जिसे 'prototype' भी कहा जाता है, जहाँ स्लॉट्स परिभाषित हैं—क्लास का नाम 'employee' है, name एक character, id numeric, और contact character है।
setClass("employee", slots=list(name="character", id="numeric", contact="character"))
निम्न कोड S4 के विशिष्ट instance या ऑब्जेक्ट्स बना सकता है।
आइए 'new' का उपयोग करके एक ऑब्जेक्ट बनाते हैं, जिसके अंदर क्लास नाम 'employee' है और name, id तथा contact जैसे स्लॉट्स को मान दिए गए हैं।
obj <- new("employee",name="Steven", id=1002, contact="West Avenue")
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1002
Slot "contact":
[1] "West Avenue"
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1002
Slot "contact":
"West Avenue"
ऊपर का आउटपुट दिखाता है कि बना हुआ ऑब्जेक्ट "employee" क्लास का है और "name" स्लॉट में "Steven", "id" स्लॉट में 1002 और "contact" स्लॉट में "West Avenue" मान है।
फंक्शन और कमांड्स
यह जाँचने के लिए कि कोई ऑब्जेक्ट S4 ऑब्जेक्ट है या नहीं, निम्न दो कमांड्स का उपयोग किया जा सकता है:
'is.object(obj)' कमांड यह जाँचता है कि कोई वेरिएबल या instance किसी ऑब्जेक्ट को संदर्भित करता है या नहीं।
is.object(obj)
TRUE
ऊपर का कोड निम्नलिखित आउटपुट देता है:
TRUE
'is.S4(obj)' कमांड यह जाँचता है कि कोई वेरिएबल या instance S4 ऑब्जेक्ट है या नहीं।
isS4(obj)
TRUE
ऊपर का कोड निम्नलिखित आउटपुट देता है:
TRUE
स्लॉट मानों तक पहुँचना और उन्हें संशोधित करना
स्लॉट तक पहुँचना
स्लॉट तक पहुँचने के लिए "$" के बजाय "@" का उपयोग किया जा सकता है।
'obj@name' का उपयोग किया जाता है जहाँ ऑब्जेक्ट के नाम के साथ स्लॉट का नाम देकर 'Steven' तक पहुँचा जाता है, और इसी प्रकार 'obj@id' के लिए भी किया जाता है।
obj@name
obj@id
'Steven'
1002
ऊपर का कोड निम्नलिखित आउटपुट देता है:
'Steven'
1002
स्लॉट संशोधित करना
आइए असाइनमेंट ऑपरेटर ("<-") का उपयोग करके स्लॉट मान को संशोधित करें, जहाँ 'obj@contact' को नया मान "North Avenue" असाइन किया जाता है।
obj@contact <- "North Avenue"
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1002
Slot "contact":
[1] "North Avenue"
ऊपर का कोड निम्नलिखित आउटपुट देता है:
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1002
Slot "contact":
"North Avenue"
ऊपर का आउटपुट दिखाता है कि "contact" स्लॉट का मान पहले "West Avenue" से बदलकर "North Avenue" हो गया है।
वैकल्पिक रूप से, मान बदलने के लिए 'slot()' का उपयोग करने का विकल्प है।
'slot(obj, "id")' इंगित करता है कि स्लॉट "id" का मान 1004 असाइनमेंट के साथ बदला जाए, और परिणाम 'obj' से प्रिंट किया जाता है।
slot(obj,"id") <- 1004
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1004
Slot "contact":
[1] "North Avenue"
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1004
Slot "contact":
"North Avenue"
ऊपर का आउटपुट दिखाता है कि "id" स्लॉट का मान पहले 1002 से बदलकर 1004 हो गया है।
S4 में अपना Generic मेथड बनाना
आइए एक फंक्शन बनाएँ जो हमारी आवश्यकता के अनुसार आउटपुट प्रिंट करने में मदद करता है, जहाँ 'setMethod()' और 'show()' नामक generic function का उपयोग किया जाता है। साथ ही, सभी स्लॉट्स के मान '@' द्वारा एक्सेस किए जाते हैं और उनके नाम प्रिंट किए जाते हैं। अंत में, 'obj' की मदद से आउटपुट प्राप्त होता है।
setMethod("show",
"employee",
function(object) {
cat("Name:",object@name, "\n")
cat("Id:",object@id, "\n")
cat("Contact:", object@contact, "\n")
}
)
obj
Name: Steven
Id: 1004
Contact: North Avenue
Name: Steven
Id: 1004
Contact: North Avenue
ऊपर का आउटपुट दिखाता है कि परिणाम स्लॉट नामों के साथ उनके संबंधित स्लॉट मानों के रूप में प्रिंट हुए हैं।
बधाई हो
बधाई हो, आप इस ट्यूटोरियल के अंत तक पहुँच गए हैं!
इस ट्यूटोरियल में, आपने ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP), R के ऑब्जेक्ट्स, S3 और S4 जैसी अलग-अलग क्लासेस, उनके निर्माण, जेनेरिक फंक्शन बनाने के उदाहरण और बहुत कुछ के बारे में सीखा।
यदि आप R के बारे में और सीखना चाहते हैं, तो DataCamp के ये कोर्स देखें: