About me | pbdR Tech | HPSC | Phyloclustering | R_note |

 R_note -- The Exploration of Statistical Software R (²Î­p³nÅé R ²`«×¾úÀI)
Reference
MS Windows

Batch jobs
Function
Data/MySQL
Plot
String/Parse

Remark Lines
Classes/S3
S4 Methods
Batch more
Environment

Good Coding
Fast Loop
LAM/MPI/Rmpi
Recursion

PHP Call R
Basic C
R Call Fortran/C
R Call GSL
C Call R API
C Call R Objects
Standalone

Make Packages
C Pointer
Debug

Section: Classes/S3

This section will talk about how we can use class and define the method for a class to manipulate the generic functions in R. For S4 methods, see the section S4 Methods for details.

Examples:
1. Class and UseMethod
This is a silly example, but it gives a hint to make a class by `class()` and use generic functions by using `UseMethod()`. In R, you can define your generic functions for `print()`. Directly input object `a.1` is the same as `print(a.1)`.

 ``` a.1 <- 3.1415926 class(a.1) <- "my.1" a.2 <- 6.1415926 class(a.2) <- "my.2" my.fcn <- function(x){ UseMethod("my.usefcn", x) } my.usefcn.my.1 <- function(x){ x + 1 } my.usefcn.my.2 <- function(x){ x + 2 } ### First call my.fcn(a.1) my.fcn(a.2) a.1 a.2 print.my.1 <- function(x, digits = 3){ print(unclass(x), digits = digits) } print.my.2 <- function(x, digits = 6){ print(unclass(x), digits = digits) } ### Second call my.fcn(a.1) my.fcn(a.2) print(a.1) print(a.2) a.1 a.2 ```

At first call, `my.fcn()` will return the object's attributes since there is no default `print()` function for these classes `my.1` and `my.2`.
 ``` > my.fcn(a.1)  4.141593 attr(,"class")  "my.1" > my.fcn(a.2)  8.141593 attr(,"class")  "my.2" > a.1  3.141593 attr(,"class")  "my.1" > a.2  6.141593 attr(,"class")  "my.2" ```

At second call, `print.my.1()`, `print.my.2()` are defined by the class' name, so the function's returns are also followed. The attributes are discarded in `print()` by using `unclass()`.
 ``` > my.fcn(a.1)  4.14 > my.fcn(a.2)  8.1416 > print(a.1)  3.14 > print(a.2)  6.14159 > a.1  3.14 > a.2  6.14159 ```

2. Summary and Print
Here, I define some gerenic functions for `summary()`, and `print()`, so they can summary the results by the input's attribute and print it by the summary's attribute, not the input's attribute.

 ``` summary.my.3 <- function(x){ x <- x + 10 class(x) <-"summary.3" x } summary.my.4 <- function(x){ x <- x + 20 class(x) <-"summary.4" x } print.summary.3 <- function(x, digits = 3){ cat("Result: ", format(x, digits = digits), "\n") } print.summary.4 <- function(x, digits = 6){ cat("Result: ", format(x, digits = digits), "\n") } a.1 <- 3.1415926 class(a.1) <- "my.3" a.2 <- 6.1415926 class(a.2) <- "my.4" summary(a.1) summary(a.2) ```

The results for the `summary()`.
 ``` > summary(a.1) Result: 13.1 > summary(a.2) Result: 26.1416 ```

3. Overwrite Operators
This is also the other silly example, but I want to demonstrate overwrite functions in R and user defined function for binary operators. In R, you can redefine an operator or use `%any%` to make a new one. I define a siunior operator of two sets in the following.
 ``` a.1 <- c("a", "b") a.2 <- 4:7 class(a.1) <- "my.5" ### Overwrite "+" for a new class. "+.my.5" <- function(a, b) c(a, b) a.1 + a.2 ### Define a new one. "%union%" <- function(a, b) c(a, b) a.1 %union% a.2 ```

 [ Go to top ]

 Maintained: Wei-Chen Chen E-Mail: wccsnow @ gmail.com Last Revised: Dec 12 2016, 09:44 (CST Taipei, Taiwan) Created: Oct 06 2003 Best Resolution IE6.0 1280x1024 small font