Saturday, May 30, 2015

S4: object-oriented design in R

Create a class.

setClass("professor",
         representation(name  = "character",
                        field = "character",
                        age   = "numeric"))

Create a concrete object for the class.

derman <- new("professor",
              name  = "Derman",
              field = "quant",
              age   = 71)

S4: object-oriented design in R

Print the whole object.

derman
## An object of class "professor"
## Slot "name":
## [1] "Derman"
## 
## Slot "field":
## [1] "quant"
## 
## Slot "age":
## [1] 71

S4: object-oriented design in R

Access specific slot/member variable.

derman@field
## [1] "quant"

Write your own show method

Overriding the default show method.

setMethod("show", signature(object = "professor"), function(object){
  print(paste("Hello, I am Professor", object@name))
})
## [1] "show"
derman
## [1] "Hello, I am Professor Derman"

Write a method for the class

First make a generic function.

setGeneric("changeJob", function(object, newJob) {
  standardGeneric("changeJob")
})
## [1] "changeJob"

Then dispatch a specific method for the professor class.

setMethod("changeJob", signature(object = "professor"),
          function(object, newJob) {
            object@field = newJob
            object
})
## [1] "changeJob"

Demonstration

derman@field
## [1] "quant"
derman <- changeJob(derman, "art")
derman@field
## [1] "art"

Data frame in R

Or, if you work with standardized variable names in large quantity, data frame might be a nicer choice.

name      <- c("derman", "duffie")
field     <- c("physics", "finance") 
professor <- data.frame(name, field)
professor
##     name   field
## 1 derman physics
## 2 duffie finance

There are lots of cool functions/packages to facilitate your work with data frame…

Further pointers