Created
January 20, 2012 14:30
-
-
Save jbryer/1647595 to your computer and use it in GitHub Desktop.
Example of object oriented programming in R
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#' 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='')) | |
} | |
if(FALSE) { #Test code that won't be run when sourcing this file | |
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]') | |
} |
Author
jbryer
commented
Jun 10, 2012
via email
I think the problem is that you need to use '[[' to assign into the list.
f = list()
f[[1]] = EmailClass(name="Jason", "[email protected]")
…-Jason
On Mon, May 28, 2012 at 11:57 PM, ozjimbob ***@***.*** wrote:
I'm still trying to get my head around the best way to do OO in R, and this looks fairly simple. My question is - what if you want to want to generate a sequence of objects of a given class? Say, instead of emails, the object is a an animal in a simulation. You want to generate hundreds of animals to start with, and have the ability to add new animals to the population, or remove them. From what I've been able to figure out, you can't create sequential lists of "environments".
<pre>
>f=list()
>f[1]=EmailClass(name="Jason", ***@***.***")
Error in f[1] = EmailClass(name = "Jason", ***@***.***") :
environments cannot be coerced to other types
</pre>
---
Reply to this email directly or view it on GitHub:
https://gist.github.com/1647595
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment