Aliases: GenericFunctions isGeneric isGroup removeGeneric getGenerics dumpMethod findFunction dumpMethods removeMethods signature setReplaceMethod
Keywords: programming classes methods
### ** 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
Error in findFuncStrict("myFun") : No versions of myFun visible
lm <- function(x) x+1 try(findFuncStrict("lm"))# Error: 2 versions
function (formula, data, subset, weights, na.action, method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...) { ret.x <- x ret.y <- y cl <- match.call() mf <- match.call(expand.dots = FALSE) m <- match(c("formula", "data", "subset", "weights", "na.action", "offset"), names(mf), 0L) mf <- mf[c(1L, m)] mf$drop.unused.levels <- TRUE mf[[1L]] <- quote(stats::model.frame) mf <- eval(mf, parent.frame()) if (method == "model.frame") return(mf) else if (method != "qr") warning(gettextf("method = '%s' is not supported. Using 'qr'", method), domain = NA) mt <- attr(mf, "terms") y <- model.response(mf, "numeric") w <- as.vector(model.weights(mf)) if (!is.null(w) && !is.numeric(w)) stop("'weights' must be a numeric vector") offset <- model.offset(mf) mlm <- is.matrix(y) ny <- if (mlm) nrow(y) else length(y) if (!is.null(offset)) { if (!mlm) offset <- as.vector(offset) if (NROW(offset) != ny) stop(gettextf("number of offsets is %d, should equal %d (number of observations)", NROW(offset), ny), domain = NA) } if (is.empty.model(mt)) { x <- NULL z <- list(coefficients = if (mlm) matrix(NA_real_, 0, ncol(y)) else numeric(), residuals = y, fitted.values = 0 * y, weights = w, rank = 0L, df.residual = if (!is.null(w)) sum(w != 0) else ny) if (!is.null(offset)) { z$fitted.values <- offset z$residuals <- y - offset } } else { x <- model.matrix(mt, mf, contrasts) z <- if (is.null(w)) lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) else lm.wfit(x, y, w, offset = offset, singular.ok = singular.ok, ...) } class(z) <- c(if (mlm) "mlm", "lm") z$na.action <- attr(mf, "na.action") z$offset <- offset z$contrasts <- attr(x, "contrasts") z$xlevels <- .getXlevels(mt, mf) z$call <- cl z$terms <- mt if (model) z$model <- mf if (ret.x) z$x <- x if (ret.y) z$y <- y if (!qr) z$qr <- NULL z } <bytecode: 0x55ccfcae9b68> <environment: namespace:stats>
findFuncStrict("findFuncStrict")# just 1 version
Error in findFuncStrict("findFuncStrict"): No versions of findFuncStrict visible
rm(lm) ## Don't show: ## because nosegfault runs standardGeneric w/o the methods package, nothing ## really gets tested. The following check that it catches some errors mustDie <- function(expr) stopifnot(is(tryCatch(expr, error=function(e)e), "error")) mustDie(standardGeneric()) # 3 tests of requiring a single string mustDie(standardGeneric(NULL)) mustDie(standardGeneric("")) mustDie(standardGeneric("notAGenericFunction")) mustDie(standardGeneric("show")) # a generic, but not called from its body ## End(Don't show) ## method dumping ------------------------------------ setClass("A", slots = c(a="numeric")) setMethod("plot", "A", function(x,y,...){ cat("A meth\n") }) dumpMethod("plot","A", file="")
setMethod("plot", "A", function (x, y, ...) { cat("A meth\n") } )
## Not run: ##D setMethod("plot", "A", ##D function (x, y, ...) ##D { ##D cat("AAAAA\n") ##D } ##D ) ## 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"))