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

R_note -- The Exploration of Statistical Software R (統計軟體 R 深度歷險)
About R_note
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)
    [1] 4.141593
    attr(,"class")
    [1] "my.1"
    > my.fcn(a.2)
    [1] 8.141593
    attr(,"class")
    [1] "my.2"
    > a.1
    [1] 3.141593
    attr(,"class")
    [1] "my.1"
    > a.2
    [1] 6.141593
    attr(,"class")
    [1] "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)
    [1] 4.14
    > my.fcn(a.2)
    [1] 8.1416
    > print(a.1)
    [1] 3.14
    > print(a.2)
    [1] 6.14159
    > a.1
    [1] 3.14
    > a.2
    [1] 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
free counters Best Resolution
IE6.0
1280x1024
small font