R S4 Class - r - learn r - r programming
- In this article, you'll learn everything about S4 classes in R; how to define them, create them, access their slots, and use them efficiently in your program.

- Unlike S3 classes and objects which lacks formal definition, we look at S4 class which is stricter in the sense that it has a formal definition and a uniform way to create objects.
- This adds safety to our code and prevents us from accidentally making naive mistakes.
How to define S4 Class?
- S4 class is defined using the setClass() function.
- In R terminology, member variables are called slots.
- While defining a class, we need to set the name and the slots (along with class of the slot) it is going to have.

Sample class object image in C
Example 1: Definition of S4 class
setClass("student", slots=list(name="character", age="numeric", GPA="numeric"))
- In the above example, we defined a new class called student along with three slots it's going to have name, age and GPA.
- There are other optional arguments of setClass() which you can explore in the help section with ?setClass.
How to create S4 objects?
- S4 objects are created using the new() function.
Example 2: Creation of S4 object
># create an object using new()
># provide the class name and value for slots
> s <- new("student",name="John", age=21, GPA=3.5)
> s
Anobject of class"student"
Slot"name":
[1] "John"
Slot"age":
[1] 21
Slot"GPA":
[1] 3.5
- We can check if an object is an S4 object through the function isS4().
> isS4(s)
[1] TRUE
- The function setClass() returns a generator function.
- This generator function (usually having same name as the class) can be used to create new objects.
- It acts as a constructor.
> student <- setClass("student", slots=list(name="character", age="numeric", GPA="numeric"))
> student
class generator functionforclass “student” frompackage‘.GlobalEnv’
function (...)
new("student", ...)
- Now we can use this constructor function to create new objects.
- Note above that our constructor in turn uses the new() function to create objects. It is just a wrap around.
Example 3: Creation of S4 objects using generator function
>student(name="John", age=21, GPA=3.5)
Anobject of class"student"
Slot"name":
[1] "John"
Slot"age":
[1] 21
Slot"GPA":
[1] 3.5
How to access and modify slot?
- Just as components of a list are accessed using $, slot of an object are accessed using @.
Accessing slot
>s@name
[1] "John"
>s@GPA
[1] 3.5
>s@age
[1] 21
Modifying slot directly
- A slot can be modified through reassignment.
># modify GPA
>s@GPA<- 3.7
> s
Anobject of class"student"
Slot"name":
[1] "John"
Slot"age":
[1] 21
Slot"GPA":
[1] 3.7
Modifying slots using slot() function
- Similarly, slots can be access or modified using the slot() function.
> slot(s,"name")
[1] "John"
> slot(s,"name") <- "Paul"
> s
Anobject of class"student"
Slot"name":
[1] "Paul"
Slot"age":
[1] 21
Slot"GPA":
[1] 3.7
Methods and Generic Functions
- As in the case of S3 class, methods for S4 class also belong to generic functions rather than the class itself.
- Working with S4 generics is pretty much similar to S3 generics.
- You can list all the S4 generic functions and methods available, using the function showMethods().
Example 4: List all generic functions
>showMethods()
Function: - (packagebase)
Function: != (packagebase)
...
Function: trigamma (packagebase)
Function: trunc (packagebase)
- Writing the name of the object in interactive mode prints it.
- This is done using the S4 generic function show().
- You can see this function in the above list.
- This function is the S4 analogy of the S3 print()function.
Example 5: Check if a function is a generic function
> isS4(print)
[1] FALSE
> isS4(show)
[1] TRUE
- We can list all the methods of show generic function using showMethods(show).
Example 6: List all methods of a generic function
>showMethods(show)
Function: show (package methods)
object="ANY"
object="classGeneratorFunction"
...
object="standardGeneric"
(inherited from: object="genericFunction")
object="traceable"
How to write your own method?
- We can write our own method using setMethod() helper function.
- For example, we can implement our class method for the show() generic as follows.
setMethod("show",
"student",
function(object) {
cat(object@name, "\n")
cat(object@age, "years old\n")
cat("GPA:", object@GPA, "\n")
}
)
- Now, if we write out the name of the object in interactive mode as before, the above code is executed.
> s <- new("student",name="John", age=21, GPA=3.5)
> s # this is same as show(s)
John
21years old
GPA: 3.5
- In this way we can write our own S4 class methods for generic functions.