blob: 3a288721a12e0002c7c292296c4c245f2f146397 [file] [log] [blame]
% File src/library/base/man/function.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2012 R Core Team
% Distributed under GPL 2 or later
\name{function}
\alias{function}
\alias{return}
\alias{closure}
\title{Function Definition}
\usage{
\special{function( arglist ) expr}
\special{return(value)}
}
\description{
These functions provide the base mechanisms for defining
new functions in the \R language.
}
\arguments{
\item{arglist}{Empty or one or more name or name=expression terms.}
\item{expr}{An expression.}
\item{value}{An expression.}
}
\details{
The names in an argument list can be back-quoted non-standard names
(see \sQuote{\link{backquote}}).
If \code{value} is missing, \code{NULL} is returned. If it is a
single expression, the value of the evaluated expression is returned.
(The expression is evaluated as soon as \code{return} is called, in
the evaluation frame of the function and before any
\code{\link{on.exit}} expression is evaluated.)
If the end of a function is reached without calling \code{return}, the
value of the last evaluated expression is returned.
}
\section{Technical details}{
This type of function is not the only type in \R: they are called
\emph{closures} (a name with origins in LISP) to distinguish them from
\link{primitive} functions.
A closure has three components, its \code{\link{formals}} (its argument
list), its \code{\link{body}} (\code{expr} in the \sQuote{Usage}
section) and its \code{\link{environment}} which provides the
enclosure of the evaluation frame when the closure is used.
There is an optional further component if the closure has been
byte-compiled. This is not normally user-visible, but is indicated
when functions are printed.
}
\seealso{
\code{\link{args}}.
\code{\link{formals}}, \code{\link{body}} and
\code{\link{environment}} for accessing the component parts of a
function.
\code{\link{debug}} for debugging; using \code{\link{invisible}} inside
\code{return(.)} for returning \emph{invisibly}.
}
\references{
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
\emph{The New S Language}.
Wadsworth & Brooks/Cole.
}
\examples{
norm <- function(x) sqrt(x\%*\%x)
norm(1:4)
## An anonymous function:
(function(x, y){ z <- x^2 + y^2; x+y+z })(0:7, 1)
}
\keyword{programming}