% File src/library/base/man/exists.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2016 R Core Team
% Distributed under GPL 2 or later

\name{exists}
\title{Is an Object Defined?}
\alias{exists}
\alias{get0}
\description{
  Look for an \R object of the given name and possibly return it
}
\usage{
exists(x, where = -1, envir = , frame, mode = "any",
       inherits = TRUE)

get0(x, envir = pos.to.env(-1L), mode = "any", inherits = TRUE,
     ifnotfound = NULL)
}
\arguments{
  \item{x}{a variable name (given as a character string or a symbol).}
  \item{where}{where to look for the object (see the details section); if
    omitted, the function will search as if the name of the object
    appeared unquoted in an expression.}
  \item{envir}{an alternative way to specify an environment to look in,
    but it is usually simpler to just use the \code{where} argument.}
  \item{frame}{a frame in the calling list.  Equivalent to giving
    \code{where} as \code{sys.frame(frame)}.}
  \item{mode}{the mode or type of object sought: see the
    \sQuote{Details} section.}
  \item{inherits}{should the enclosing frames of the environment be
    searched?}
  \item{ifnotfound}{the return value of \code{get0(x, *)} when
    \code{x} does not exist.}
}
\details{
  The \code{where} argument can specify the environment in which to look
  for the object in any of several ways: as an integer (the position in
  the \code{\link{search}} list); as the character string name of an
  element in the search list; or as an \code{\link{environment}}
  (including using \code{\link{sys.frame}} to access the currently active
  function calls).  The \code{envir} argument is an alternative way to
  specify an environment, but is primarily there for back compatibility.

  This function looks to see if the name \code{x} has a value bound to
  it in the specified environment.  If \code{inherits} is \code{TRUE} and
  a value is not found for \code{x} in the specified environment, the
  enclosing frames of the environment are searched until the name \code{x}
  is encountered.  See \code{\link{environment}} and the \sQuote{R
  Language Definition} manual for details about the structure of
  environments and their enclosures.

  \bold{Warning:}
  \code{inherits = TRUE} is the default behaviour for \R but not for S.

  If \code{mode} is specified then only objects of that type are sought.
  The \code{mode} may specify one of the collections \code{"numeric"} and
  \code{"function"} (see \code{\link{mode}}): any member of the
  collection will suffice.  (This is true even if a member of a
  collection is specified, so for example \code{mode = "special"} will
  seek any type of function.)
}
\note{
  With \code{get0()}, instead of the easy to read but somewhat
  inefficient
  \preformatted{
    if (exists(myVarName, envir = myEnvir)) {
      r <- get(myVarName, envir = myEnvir)
      ## ... deal with r ...
    }
  }
  you now can use the more efficient (and slightly harder to read)
  \preformatted{
    if (!is.null(r <- get0(myVarName, envir = myEnvir))) {
      ## ... deal with r ...
    }
  }
}
\value{
  \code{exists():} Logical, true if and only if an object of the correct
  name and mode is found.

  \code{get0():} The object---as from \code{\link{get}(x, *)}---
  if \code{exists(x, *)} is true, otherwise \code{ifnotfound}.
}
\references{
  Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
  \emph{The New S Language}.
  Wadsworth & Brooks/Cole.
}
\seealso{
  \code{\link{get}} and \code{\link{hasName}}.  For quite a different 
  kind of \dQuote{existence}
  checking, namely if function arguments were specified,
  \code{\link{missing}};
  and for yet a different kind, namely if a file exists,
  \code{\link{file.exists}}.
}
\examples{
##  Define a substitute function if necessary:
if(!exists("some.fun", mode = "function"))
  some.fun <- function(x) { cat("some.fun(x)\n"); x }
search()
exists("ls", 2) # true even though ls is in pos = 3
exists("ls", 2, inherits = FALSE) # false

## These are true (in most circumstances):
identical(ls,   get0("ls"))
identical(NULL, get0(".foo.bar.")) # default ifnotfound = NULL (!)
\dontshow{
stopifnot(identical(ls, get0("ls")),
          is.null(get0(".foo.bar.")))
}
}
\keyword{data}
