# File src/library/methods/R/addedFunctions.R # Part of the R package, https://www.R-project.org # # Copyright (C) 1995-2018 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # https://www.R-project.org/Licenses/ functionBody <- body `functionBody<-` <- `body<-` allNames <- ## the character vector of names (unlike names(), never returns NULL) function(x) { value <- names(x) if(is.null(value)) character(length(x)) else value } getFunction <- function(name, generic = TRUE, mustFind = TRUE, where = topenv(parent.frame())) ## find the object as a function. { if(length(name) != 1L || !nzchar(name)) stop(gettextf("expected a non-empty character string for argument 'name'"), domain = NA) found <- FALSE where <- as.environment(where) f <- NULL ## parent.env sequence of a namespace ends in the base package namespace, ## of a non-namespace ends in NULL (equiv. to base environment) [sigh] lastEnv <- if(isNamespace(where)) function(where) isBaseNamespace(where) else function(where) identical(where, baseenv()) repeat { if(!is.null(f <- get0(name, envir = where, mode = "function", inherits = FALSE))) found <- generic || !is(f, "genericFunction") if(found || lastEnv(where)) break where <- parent.env(where) } if(!found && mustFind) stop(if(generic) gettextf("no function %s found", sQuote(name)) else gettextf("no non-generic function %s found", sQuote(name)), domain = NA) f } el <- function(object, where) ## element of a vector; numeric index only. ## ## the definition allows indexing beyond current length of vector ## (consistent with [[]] in S but not in R). object[where][[1L]] "el<-" <- ## set the element of a vector; numeric index only. .Primitive("[[<-") elNamed <- ## get the element of the vector corresponding to name. No partial matching. function(x, name, mustFind=FALSE) { i <- match(name, names(x)) if(is.na(i)) { if(mustFind) stop(gettextf("%s is not one of the element names", sQuote(name)), domain = NA) else NULL } else x[[i]] } "elNamed<-" <- ## set the element of the vector corresponding to name. function(x, name, value) { x[[name]] <- value x } formalArgs <- ## Returns the names of the formal arguments of this function. function(def) names(formals(def, envir = parent.frame())) findFunction <- ## return a list of all the places where a function ## definition for `name' exists. If `generic' is FALSE, ignore generic ## functions. function(f, generic = TRUE, where = topenv(parent.frame())) { allWhere <- .findAll(f, where) # .findAll() in ./ClassExtensions.R ok <- logical(length(allWhere)) for(i in seq_along(allWhere)) { wherei <- allWhere[[i]] if(!is.null(fdef <- wherei[[f]])) { ok[i] <- is.function(fdef) && (generic || is.primitive(fdef) || !isGeneric(f, wherei, fdef)) }## else ok[i] <- FALSE } allWhere[ok] } existsFunction <- function(f, generic=TRUE, where = topenv(parent.frame())) length(findFunction(f, generic, where)) > 0L Quote <- base::quote #was get("quote" , mode = "function") .message <- function(..., domain = NULL, appendLF = TRUE) { ## Output all the arguments, pasted together with no intervening spaces, ## wrapping long lines text <- paste0(..., collapse="") lines <- strwrap(text, width = max(20, 7 * getOption("width") %/% 8)) message(paste(lines, collapse="\n"), domain = domain, appendLF = appendLF) } hasArg <- function(name) { aname <- as.character(substitute(name)) fnames <- names(formals(sys.function(sys.parent()))) if(is.na(match(aname, fnames))) { if(is.na(match("...", fnames))) FALSE else { dotsCall <- eval(quote(substitute(list(...))), sys.parent()) !is.na(match(aname, names(dotsCall))) } } else eval(substitute(!missing(name)), sys.frame(sys.parent())) }