Skip to content

Instantly share code, notes, and snippets.

@jbryer
Created January 20, 2012 14:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jbryer/1647595 to your computer and use it in GitHub Desktop.
Save jbryer/1647595 to your computer and use it in GitHub Desktop.
Example of object oriented programming in R
#' 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", "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')
}
@ozjimbob
Copy link

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".

>f=list()
>f[1]=EmailClass(name="Jason", "jason@bryer.org")
Error in f[1] = EmailClass(name = "Jason", "jason@bryer.org") : 
  environments cannot be coerced to other types

@jbryer
Copy link
Author

jbryer commented Jun 10, 2012 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment