class
Object Classes
Description
R possesses a simple generic function mechanism which can be used for an object-oriented style of programming. Method dispatch takes place based on the class of the first argument to the generic function.
Usage
class(x) class(x) <- value unclass(x) inherits(x, what, which = FALSE) isa(x, what) oldClass(x) oldClass(x) <- value .class2(x)
Arguments
x | a R object |
what, value | a character vector naming classes. |
which | logical affecting return value: see ‘Details’. |
Details
Here, we describe the so called “S3” classes (and methods). For “S4” classes (and methods), see ‘Formal classes’ below.
Many R objects have a class
attribute, a character vector giving the names of the classes from which the object inherits. (Functions oldClass
and oldClass<-
get and set the attribute, which can also be done directly.)
If the object does not have a class attribute, it has an implicit class, notably "matrix"
, "array"
, "function"
or "numeric"
or the result of typeof(x)
(which is similar to mode(x)
), but for type "language"
and mode
"call"
, where the following extra classes exist for the corresponding function call
s: if
, while
, for
, =
, <-
, (
, {
, call
.
Note that for objects x
of an implicit (or an S4) class, when a (S3) generic function foo(x)
is called, method dispatch may use more classes than are returned by class(x)
, e.g., for a numeric matrix, the foo.numeric()
method may apply. The exact full character
vector of the classes which UseMethod()
uses, is available as .class2(x)
since R version 4.0.0. (This also applies to S4 objects when S3 dispatch is considered, see below.)
Beware that using .class2()
for other reasons than didactical, diagnostical or for debugging may rather be a misuse than smart.
NULL
objects (of implicit class "NULL"
) cannot have attributes (hence no class
attribute) and attempting to assign a class is an error.
When a generic function fun
is applied to an object with class attribute c("first", "second")
, the system searches for a function called fun.first
and, if it finds it, applies it to the object. If no such function is found, a function called fun.second
is tried. If no class name produces a suitable function, the function fun.default
is used (if it exists). If there is no class attribute, the implicit class is tried, then the default method.
The function class
prints the vector of names of classes an object inherits from. Correspondingly, class<-
sets the classes an object inherits from. Assigning NULL
removes the class attribute.
unclass
returns (a copy of) its argument with its class attribute removed. (It is not allowed for objects which cannot be copied, namely environments and external pointers.)
inherits
indicates whether its first argument inherits from any of the classes specified in the what
argument. If which
is TRUE
then an integer vector of the same length as what
is returned. Each element indicates the position in the class(x)
matched by the element of what
; zero indicates no match. If which
is FALSE
then TRUE
is returned by inherits
if any of the names in what
match with any class
.
isa
tests whether x
is an object of class(es) as given in what
by using is
if x
is an S4 object, and otherwise giving TRUE
iff all elements of class(x)
are contained in what
.
All but inherits
are primitive functions.
Formal classes
An additional mechanism of formal classes, nicknamed “S4”, is available in package methods which is attached by default. For objects which have a formal class, its name is returned by class
as a character vector of length one and method dispatch can happen on several arguments, instead of only the first. However, S3 method selection attempts to treat objects from an S4 class as if they had the appropriate S3 class attribute, as does inherits
. Therefore, S3 methods can be defined for S4 classes. See the ‘Introduction’ and ‘Methods_for_S3’ help pages for basic information on S4 methods and for the relation between these and S3 methods.
The replacement version of the function sets the class to the value provided. For classes that have a formal definition, directly replacing the class this way is strongly deprecated. The expression as(object, value)
is the way to coerce an object to a particular class.
The analogue of inherits
for formal classes is is
. The two functions behave consistently with one exception: S4 classes can have conditional inheritance, with an explicit test. In this case, is
will test the condition, but inherits
ignores all conditional superclasses.
Note
Functions oldClass
and oldClass<-
behave in the same way as functions of those names in S-PLUS 5/6, but in R UseMethod
dispatches on the class as returned by class
(with some interpolated classes: see the link) rather than oldClass
. However, group generics dispatch on the oldClass
for efficiency, and internal generics only dispatch on objects for which is.object
is true.
In older versions of R, assigning a zero-length vector with class
removed the class: it is now an error (whereas it still works for oldClass
). It is clearer to always assign NULL
to remove the class.
See Also
UseMethod
, NextMethod
, ‘group generic’, ‘internal generic’
Examples
x <- 10 class(x) # "numeric" oldClass(x) # NULL inherits(x, "a") #FALSE class(x) <- c("a", "b") inherits(x,"a") #TRUE inherits(x, "a", TRUE) # 1 inherits(x, c("a", "b", "c"), TRUE) # 1 2 0 class( quote(pi) ) # "name" ## regular calls class( quote(sin(pi*x)) ) # "call" ## special calls class( quote(x <- 1) ) # "<-" class( quote((1 < 2)) ) # "(" class( quote( if(8<3) pi ) ) # "if" .class2(pi) # "double" "numeric" .class2(matrix(1:6, 2,3)) # "matrix" "array" "integer" "numeric"
Copyright (©) 1999–2012 R Foundation for Statistical Computing.
Licensed under the GNU General Public License.