GenericFunctions {methods} | R Documentation |
Tools for Managing Generic Functions
Description
The functions documented here manage collections of methods associated with a generic function, as well as providing information about the generic functions themselves.
Usage
isGeneric(f, where, fdef, getName = FALSE)
isGroup(f, where, fdef)
removeGeneric(f, where)
dumpMethod(f, signature, file, where, def)
findFunction(f, generic = TRUE, where = topenv(parent.frame()))
dumpMethods(f, file, signature, methods, where)
signature(...)
removeMethods(f, where = topenv(parent.frame()), all = missing(where))
setReplaceMethod(f, ..., where = topenv(parent.frame()))
getGenerics(where, searchForm = FALSE)
Arguments
f |
The character string naming the function. |
where |
The environment, namespace, or search-list position from which to search for objects. By default, start at the top-level environment of the calling function, typically the global environment (i.e., use the search list), or the namespace of a package from which the call came. It is important to supply this argument when calling any of these functions indirectly. With package namespaces, the default is likely to be wrong in such calls. |
signature |
The class signature of the relevant method. A
signature is a named or unnamed vector of character strings. If
named, the names must be formal argument names for the generic
function. Signatures are matched to the arguments specified in
the signature slot of the generic function (see the Details
section of the The |
file |
The file or connection on which to dump method definitions. |
def |
The function object defining the method; if omitted, the current method definition corresponding to the signature. |
... |
Named or unnamed arguments to form a signature. |
generic |
In testing or finding functions, should generic
functions be included. Supply as |
fdef |
Optional, the generic function definition. Usually omitted in calls to |
getName |
If |
methods |
The methods object containing the methods to be dumped. By default,
the methods defined for this generic (optionally on the specified
|
all |
in |
searchForm |
In |
Summary of Functions
isGeneric
:-
If
fdef
isNULL
, then test if there is a formal generic function namedf
in the current search path or in the position specified bywhere
.If
fdef
is non-NULL
, then test if it is a formal generic function, with name matchingf
iff
is not missing.The
getName
argument allows a function to find the name from a function definition. If it isTRUE
then the name of the generic is returned, orFALSE
if this is not a generic function definition.The behavior of
isGeneric
andgetGeneric
for primitive functions is slightly different. These functions don't exist as formal generic function objects (for efficiency and historical reasons), regardless of whether methods have been defined for them. For a primitive function,isGeneric
tests whether non-default methods have been defined, whereasgetGeneric
returns what the formal generic function object would be, even if no methods have been defined. removeGeneric
,removeMethods
:-
Remove all the methods for the generic function of this name. In addition,
removeGeneric
removes the function itself;removeMethods
restores the non-generic function which was the default method. If there was no default method,removeMethods
leaves a generic function with no methods. standardGeneric
:-
Dispatches a method from the current function call for the generic function
f
. It is an error to callstandardGeneric
anywhere except in the body of the corresponding generic function.Note that
standardGeneric
is a primitive function in the base package for efficiency reasons, but rather documented here where it belongs naturally. dumpMethod
:-
Dump the method for this generic function and signature.
findFunction
:-
return a list of either the positions on the search list, or the current top-level environment, on which a function object for
name
exists. The returned value is always a list, use the first element to access the first visible version of the function. See the example.NOTE: Use this rather than
find
withmode="function"
, which is not as meaningful, and has a few subtle bugs from its use of regular expressions. Also,findFunction
works correctly in the code for a package when attaching the package via a call tolibrary
. dumpMethods
:-
Dump all the methods for this generic.
signature
:-
Returns a named list of classes to be matched to arguments of a generic function.
getGenerics
:returns the names of the generic functions that have methods defined on
where
; this argument can be an environment or an index into the search list. By default, the whole search list is used.The methods definitions are stored with package qualifiers; for example, methods for function
"initialize"
might refer to two different functions of that name, on different packages. The package names corresponding to the method list object are contained in the slotpackage
of the returned object. The form of the returned name can be plain (e.g.,"base"
), or in the form used in the search list ("package:base"
) according to the value ofsearchForm
Details
isGeneric
:-
If the
fdef
argument is supplied, take this as the definition of the generic, and test whether it is really a generic, withf
as the name of the generic. (This argument is not available in S-Plus.) removeGeneric
:-
If
where
supplied, just remove the version on this element of the search list; otherwise, removes the first version encountered. standardGeneric
:-
Generic functions should usually have a call to
standardGeneric
as their entire body. They can, however, do any other computations as well.The usual
setGeneric
(directly or through callingsetMethod
) creates a function with a call tostandardGeneric
. dumpMethod
:-
The resulting source file will recreate the method.
findFunction
:-
If
generic
isFALSE
, ignore generic functions. dumpMethods
:-
If
signature
is supplied only the methods matching this initial signature are dumped. (This feature is not found in S-Plus: don't use it if you want compatibility.) signature
:-
The advantage of using
signature
is to provide a check on which arguments you meant, as well as clearer documentation in your method specification. In addition,signature
checks that each of the elements is a single character string. removeMethods
:-
Returns
TRUE
iff
was a generic function,FALSE
(silently) otherwise.If there is a default method, the function will be re-assigned as a simple function with this definition. Otherwise, the generic function remains but with no methods (so any call to it will generate an error). In either case, a following call to
setMethod
will consistently re-establish the same generic function as before.
References
Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10.)
See Also
getMethod
(also for selectMethod
),
setGeneric
,
setClass
,
showMethods
Examples
require(stats) # for lm
## get the function "myFun" -- throw an error if 0 or > 1 versions visible:
findFuncStrict <- function(fName) {
allF <- findFunction(fName)
if(length(allF) == 0)
stop("No versions of ",fName," visible")
else if(length(allF) > 1)
stop(fName," is ambiguous: ", length(allF), " versions")
else
get(fName, allF[[1]])
}
try(findFuncStrict("myFun"))# Error: no version
lm <- function(x) x+1
try(findFuncStrict("lm"))# Error: 2 versions
findFuncStrict("findFuncStrict")# just 1 version
rm(lm)
## method dumping ------------------------------------
setClass("A", slots = c(a="numeric"))
setMethod("plot", "A", function(x,y,...){ cat("A meth\n") })
dumpMethod("plot","A", file="")
## Not run:
setMethod("plot", "A",
function (x, y, ...)
{
cat("AAAAA\n")
}
)
## End(Not run)
tmp <- tempfile()
dumpMethod("plot","A", file=tmp)
## now remove, and see if we can parse the dump
stopifnot(removeMethod("plot", "A"))
source(tmp)
stopifnot(is(getMethod("plot", "A"), "MethodDefinition"))
## same with dumpMethods() :
setClass("B", contains="A")
setMethod("plot", "B", function(x,y,...){ cat("B ...\n") })
dumpMethods("plot", file=tmp)
stopifnot(removeMethod("plot", "A"),
removeMethod("plot", "B"))
source(tmp)
stopifnot(is(getMethod("plot", "A"), "MethodDefinition"),
is(getMethod("plot", "B"), "MethodDefinition"))