The function className()
generates a
valid references to a class, including the name of the package
containing the class definition. The object returned, from class "className"
, is the
unambiguous way to refer to a class, for example when calling
setMethod
, just in case multiple definitions of the
class exist.
Function
"multipleClasses"
returns information about multiple
definitions of classes with the
same name from different packages.
className(class, package)multipleClasses(details = FALSE)
The character string name of a class and, optionally, of the package
to which it belongs. If argument package
is missing and the
class
argument has a package slot, that is used (in
particular, passing in an object from class "className"
returns
itself in this case, but changes the package slot if the second
argument is supplied).
If there is no package argument or slot, a definition for the class must exist and will be used to define the package. If there are multiple definitions, one will be chosen and a warning printed giving the other possibilities.
If FALSE
, the default, multipleClasses()
returns a
character vector of those classes currently known with multiple
definitions.
If TRUE
, a named list of those class definitions is returned.
Each element of the list is itself a list of the corresponding class
definitions, with the package names as the names of the list. Note
that identical class definitions will not be considered
“multiple” definitions (see the discussion of the details below).
A call to className()
returns an object from class
"className"
.
A call to multipleClasses()
returns either a character
vector or a named list of class definitions. In either case, testing
the length of the returned value for being greater than 0
is a
check for the existence of multiply defined classes.
The class "className"
extends "character"
and has a slot
"package"
, also of class "character"
.
The table of class definitions used internally can maintain multiple
definitions for classes with the same name but coming from different
packages.
If identical class definitions are encountered, only one class
definition is kept; this occurs most often with S3 classes that have
been specified in calls to setOldClass
. For true
classes, multiple class definitions are unavoidable in general if two
packages happen to have used the same name, independently.
Overriding a class definition in another package with the same name deliberately is usually a bad idea. Although R attempts to keep and use the two definitions (as of version 2.14.0), ambiguities are always possible. It is more sensible to define a new class that extends an existing class but has a different name.
# NOT RUN {
className("vector") # will be found, from package "methods"
className("vector", "magic") # OK, even though the class doesn't exist
className("An unknown class") # Will cause an error
# }
Run the code above in your browser using DataLab