blob: fdf1b89f3aa02f9c27732f8fbd20d59bf18bc5c2 [file] [log] [blame]
# 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(!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()))
}