The generic functions in R Language are objects that determine how the function will treat it. A generic function performs an action (or task) on its arguments specific to the class of the argument itself. A default action will be performed if an argument lacks any class attribute that is if an argument of the function has a class not catered for specifically by the generic function, a default action will be provided.
The class mechanism in R provides the facility of designing and writing generic functions in R for special purposes. For example, the generic functions in R such as
- the
plot()
is used for displaying objects graphically, - the
summary()
is used for summarizing analyses of various types of objects - the
anova()
is used for comparing different statistical models - the
print()
is used to display the results of various types of objects
The Generic Functions in R can handle a large number of classes. For example, the function plot()
has a default method and variants for different types of objects such as data.frame
, density
, factor
, and many more. A complete list of Generic Functions in R can be obtained by using
methods(plot) methods(summary)
The body of a Generic function in R is concise and short. For example,
print ## Output function (x, ...) UseMethod("print") <bytecode: 0x0000029448a0aa40> <environment: namespace:base>
From the above code, the body of the Generic Function, UseMethod
indicates that this is a generic function.
Key Concepts and Characteristics
The following are key concepts and characteristics of generic functions in R.
- Dispatch: When an object is passed to a generic function, R determines the appropriate method to execute based on the class of the object provided. This process is known as dispatch.
- Methods: A method is a specific implementation of a generic function for a particular class of the object. It provides instructions on how the function should behave when applied to certain objects of that class.
- Class Inheritance: R supports class inheritance, allowing methods defined for a parent class to be inherited by its child classes. This enables generic functions to work seamlessly with objects from different classes within a hierarchy.
- Default Methods: If no method is defined for a specific class, R will look for a default method. The default method is typically defined for the generic function’s base class or a more generic class.
Benefits of Generic Functions in R
The following are some benefits of using and creating generic functions in R
- Code Reusability: Generic functions can be used with different types of objects, reducing the need for redundant code.
- Readability: Generic functions can improve code readability by separating the generic interface from the specific implementations.
- Polymorphism: Generic functions allow the user to write code that can work with objects of different classes, promoting flexibility and adaptability.
- Extensibility: New methods can be added for custom classes, making it easy to extend the functionality of generic functions.
Best Practices for Creating Generic Functions in R Language
For creating or writing generic functions, the following are the best practices to follow:
- Give clear and descriptive names to generic functions and their methods.
- Define methods for commonly used classes to ensure compatibility.
- Consider using inheritance to avoid redundant code in methods for related classes.
- Test the generic functions thoroughly to ensure they work as expected with different types of objects.
Example of Creating Generic Functions
To create/write generic functions in R, define a function with the desired name and arguments. One can then define methods for different classes using the UseMethod
function within the body of a generic function. Consider the following example
gf <- function(x) { UseMethod("gf") } gf.numeric <- function(x) { # Method for numeric objects mean(x) } gf.character <- function(x) { # Method for character objects nchar(x) }
In the above exemplary code, gf()
is defined as a generic function. The UseMethod()
function tells R to dispatch the call to the appropriate method based on the class of the argument x
. The gf.numeric
and gf.character
methods provide specific implementations for numeric and character objects, respectively. Let us check the behaviour of the fg()
function created as a generic function
x <- 1:5 # Numeric Vector gf(x) ## Output [1] 3 gf("statistics") ## Output [1] 10
Learn about how to get or view the source code of a function or method.