blob: 6bffe932a732d6ac200ec798eb541a537188852e [file] [log] [blame]
% File src/library/base/man/environment.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2012 R Core Team
% Distributed under GPL 2 or later
\name{environment}
\alias{environment}
\alias{environment<-}
\alias{.GlobalEnv}
\alias{globalenv}
\alias{emptyenv}
\alias{baseenv}
\alias{is.environment}
\alias{new.env}
\alias{parent.env}
\alias{parent.env<-}
\alias{.BaseNamespaceEnv}
\alias{environmentName}
\alias{env.profile}
\alias{enclosure}
\title{Environment Access}
\description{
Get, set, test for and create environments.
}
\usage{
environment(fun = NULL)
environment(fun) <- value
is.environment(x)
.GlobalEnv
globalenv()
.BaseNamespaceEnv
emptyenv()
baseenv()
new.env(hash = TRUE, parent = parent.frame(), size = 29L)
parent.env(env)
parent.env(env) <- value
environmentName(env)
env.profile(env)
}
\arguments{
\item{fun}{a \code{\link{function}}, a \code{\link{formula}}, or
\code{NULL}, which is the default.}
\item{value}{an environment to associate with the function}
\item{x}{an arbitrary \R object.}
\item{hash}{a logical, if \code{TRUE} the environment will use a hash table.}
\item{parent}{an environment to be used as the enclosure of the
environment created.}
\item{env}{an environment}
\item{size}{an integer specifying the initial size for a hashed
environment. An internal default value will be used if
\code{size} is \code{NA} or zero. This argument is ignored if
\code{hash} is \code{FALSE}.}
}
\value{
If \code{fun} is a function or a formula then \code{environment(fun)}
returns the environment associated with that function or formula.
If \code{fun} is \code{NULL} then the current evaluation environment is
returned.
The replacement form sets the environment of the function or formula
\code{fun} to the \code{value} given.
\code{is.environment(obj)} returns \code{TRUE} if and only if
\code{obj} is an \code{environment}.
\code{new.env} returns a new (empty) environment with (by default)
enclosure the parent frame.
\code{parent.env} returns the enclosing environment of its argument.
\code{parent.env<-} sets the enclosing environment of its first
argument.
\code{environmentName} returns a character string, that given when
the environment is printed or \code{""} if it is not a named environment.
\code{env.profile} returns a list with the following components:
\code{size} the number of chains that can be stored in the hash table,
\code{nchains} the number of non-empty chains in the table (as
reported by \code{HASHPRI}), and \code{counts} an integer vector
giving the length of each chain (zero for empty chains). This
function is intended to assess the performance of hashed environments.
When \code{env} is a non-hashed environment, \code{NULL} is returned.
}
\details{
Environments consist of a \emph{frame}, or collection of named
objects, and a pointer to an \emph{enclosing environment}. The most
common example is the frame of variables local to a function call; its
\emph{enclosure} is the environment where the function was defined
(unless changed subsequently). The enclosing environment is
distinguished from the \emph{parent frame}: the latter (returned by
\code{\link{parent.frame}}) refers to the environment of the caller of
a function. Since confusion is so easy, it is best never to use
\sQuote{parent} in connection with an environment (despite the
presence of the function \code{parent.env}).
When \code{\link{get}} or \code{\link{exists}} search an environment
with the default \code{inherits = TRUE}, they look for the variable
in the frame, then in the enclosing frame, and so on.
The global environment \code{.GlobalEnv}, more often known as the
user's workspace, is the first item on the search path. It can also
be accessed by \code{globalenv()}. On the search path, each item's
enclosure is the next item.
The object \code{.BaseNamespaceEnv} is the namespace environment for
the base package. The environment of the base package itself is
available as \code{baseenv()}.
If one follows the chain of enclosures found by repeatedly calling
\code{parent.env} from any environment, eventually one reaches the
empty environment \code{emptyenv()}, into which nothing may
be assigned.
The replacement function \code{parent.env<-} is extremely dangerous as
it can be used to destructively change environments in ways that
violate assumptions made by the internal C code. It may be removed
in the near future.
The replacement form of \code{environment}, \code{is.environment},
\code{baseenv}, \code{emptyenv} and \code{globalenv} are
\link{primitive} functions.
System environments, such as the base, global and empty environments,
have names as do the package and namespace environments and those
generated by \code{attach()}. Other environments can be named by
giving a \code{"name"} attribute, but this needs to be done with care
as environments have unusual copying semantics.
}
\seealso{
For the performance implications of hashing or not, see
\url{https://en.wikipedia.org/wiki/Hash_table}.
The \code{envir} argument of \code{\link{eval}}, \code{\link{get}},
and \code{\link{exists}}.
\code{\link{ls}} may be used to view the objects in an environment,
and hence \code{\link{ls.str}} may be useful for an overview.
\code{\link{sys.source}} can be used to populate an environment.
}
\examples{
f <- function() "top level function"
##-- all three give the same:
environment()
environment(f)
.GlobalEnv
ls(envir = environment(stats::approxfun(1:2, 1:2, method = "const")))
is.environment(.GlobalEnv) # TRUE
e1 <- new.env(parent = baseenv()) # this one has enclosure package:base.
e2 <- new.env(parent = e1)
assign("a", 3, envir = e1)
ls(e1)
ls(e2)
exists("a", envir = e2) # this succeeds by inheritance
exists("a", envir = e2, inherits = FALSE)
exists("+", envir = e2) # this succeeds by inheritance
eh <- new.env(hash = TRUE, size = NA)
with(env.profile(eh), stopifnot(size == length(counts)))
}
\keyword{data}
\keyword{programming}