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