Module 7. S3 and S4 object systems

Reflection:

You can check whether an object is an S4 object by using isS4(object), which returns TRUE for S4 and FALSE otherwise. For S3 objects, you can look at their class with class(object) and see if they were created by simply assigning a class attribute. To see the underlying data type of an object, you can use the typeof() function. It shows the low-level storage type, such as “integer,” “double,” “list,” or “character.” You can also use str(object) for a more detailed look at the object’s internal structure and types of its components. A generic function in R is a special kind of function designed to work flexibly with different types of objects. It performs method dispatch, meaning it automatically calls a version of the function that matches the class of the object you provide. This allows R to adapt behavior to the data type, promoting cleaner and more intuitive code. Examples include print(), summary(), and plot(), which behave differently for data frames, lists, or custom classes depending on their structure and attributes. The principal difference is that S3 is informal and flexible, creating objects by giving them a class and defining methods by naming convention (like print.myclass). S4 is more formal and strict, defining classes with setClass(), specify slot types, and register methods explicitly with setMethod(). In short, S3 is simpler and faster to use for small projects, while S4 enforces structure and type safety for larger, more complex programs.


R Code with output: 

> # load mtcars data 

> data("mtcars")

> # view data

> head(mtcars)

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb

Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4

Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4

Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

> str(mtcars)

'data.frame': 32 obs. of  11 variables:

 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...

 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...

 $ disp: num  160 160 108 258 360 ...

 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...

 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...

 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...

 $ qsec: num  16.5 17 18.6 19.4 17 ...

 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...

 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...

 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...

 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

> # test generic functions

> print(mtcars)

                     mpg cyl  disp  hp drat    wt  qsec vs am gear

Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4

Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4

Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4

Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3

Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3

Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3

Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3

Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4

Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4

Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4

Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4

Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3

Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3

Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3

Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3

Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3

Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3

Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4

Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4

Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4

Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3

Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3

AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3

Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3

Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3

Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4

Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5

Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5

Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5

Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5

Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5

Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4

                    carb

Mazda RX4              4

Mazda RX4 Wag          4

Datsun 710             1

Hornet 4 Drive         1

Hornet Sportabout      2

Valiant                1

Duster 360             4

Merc 240D              2

Merc 230               2

Merc 280               4

Merc 280C              4

Merc 450SE             3

Merc 450SL             3

Merc 450SLC            3

Cadillac Fleetwood     4

Lincoln Continental    4

Chrysler Imperial      4

Fiat 128               1

Honda Civic            2

Toyota Corolla         1

Toyota Corona          1

Dodge Challenger       2

AMC Javelin            2

Camaro Z28             4

Pontiac Firebird       2

Fiat X1-9              1

Porsche 914-2          2

Lotus Europa           2

Ford Pantera L         4

Ferrari Dino           6

Maserati Bora          8

Volvo 142E             2

> summary(mtcars)

      mpg             cyl             disp             hp       

 Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  

 1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  

 Median :19.20   Median :6.000   Median :196.3   Median :123.0  

 Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  

 3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  

 Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  

      drat             wt             qsec             vs        

 Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  

 1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  

 Median :3.695   Median :3.325   Median :17.71   Median :0.0000  

 Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  

 3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  

 Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  

       am              gear            carb      

 Min.   :0.0000   Min.   :3.000   Min.   :1.000  

 1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  

 Median :0.0000   Median :4.000   Median :2.000  

 Mean   :0.4062   Mean   :3.688   Mean   :2.812  

 3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  

 Max.   :1.0000   Max.   :5.000   Max.   :8.000  

> # s3 object

> s3_car <- list(

+   model = "Mazda RX4",

+   mpg   = mtcars["Mazda RX4", "mpg"],

+   cyl   = mtcars["Mazda RX4", "cyl"],

+   hp    = mtcars["Mazda RX4", "hp"]

+ )

> class(s3_car) <- "car_s3"

> #custom print

> print.car_s3 <- function(x, ...) {

+   cat(sprintf(

+     "S3 Car: %s | MPG: %.1f | Cylinders: %d | Horsepower: %d\n",

+     x$model, x$mpg, x$cyl, x$hp

+   ))

+ }

> print(s3_car)

S3 Car: Mazda RX4 | MPG: 21.0 | Cylinders: 6 | Horsepower: 110

> # s4 object

> setClass("car_s4",

+          slots = c(

+            model = "character",

+            mpg   = "numeric",

+            cyl   = "numeric",

+            hp    = "numeric"

+          ))

> s4_car <- new("car_s4",

+               model = "Mazda RX4",

+               mpg   = mtcars["Mazda RX4", "mpg"],

+               cyl   = mtcars["Mazda RX4", "cyl"],

+               hp    = mtcars["Mazda RX4", "hp"])

> # custom method

> setMethod("show", "car_s4",

+           function(object) {

+             cat(sprintf("S4 Car: %s | MPG: %.1f | Cylinders: %d | Horsepower: %d\n",

+                         object@model, object@mpg, object@cyl, object@hp))

+           })

> s4_car

S4 Car: Mazda RX4 | MPG: 21.0 | Cylinders: 6 | Horsepower: 110

Comments

Popular posts from this blog

R Programming Journal – Christine Jacob

Module 2. Assignment: Function Debugging and Evaluation in R

Module 8. Assignment CSV files