blob: 5a3bf4225391af317412a6751faab79dada1a4fc [file] [log] [blame]
% File src/library/base/man/is.recursive.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2015 R Core Team
% Distributed under GPL 2 or later
\name{is.recursive}
\alias{is.atomic}
\alias{is.recursive}
\title{Is an Object Atomic or Recursive?}
\usage{
is.atomic(x)
is.recursive(x)
}
\description{
\code{is.atomic} returns \code{TRUE} if \code{x} is of an atomic type
(or \code{NULL}) and \code{FALSE} otherwise.
\code{is.recursive} returns \code{TRUE} if \code{x} has a recursive
(list-like) structure and \code{FALSE} otherwise.
}
\arguments{
\item{x}{object to be tested.}
}
\details{
\code{is.atomic} is true for the \link{atomic} types
(\code{"logical"}, \code{"integer"}, \code{"numeric"},
\code{"complex"}, \code{"character"} and \code{"raw"}) and \code{NULL}.
Most types of objects are regarded as recursive. Exceptions are the atomic
types, \code{NULL}, symbols (as given by \code{\link{as.name}}),
\code{S4} objects with slots, external pointers, and---rarely visible
from \R---weak references and byte code, see \code{\link{typeof}}.
It is common to call the atomic types \sQuote{atomic vectors}, but
note that \code{\link{is.vector}} imposes further restrictions: an
object can be atomic but not a vector (in that sense).
These are \link{primitive} functions.
}
\references{
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
\emph{The New S Language}.
Wadsworth & Brooks/Cole.
}
\seealso{
\code{\link{is.list}},
\code{\link{is.language}}, etc,
and the \code{demo("is.things")}.
}
\examples{
require(stats)
is.a.r <- function(x) c(is.atomic(x), is.recursive(x))
is.a.r(c(a = 1, b = 3)) # TRUE FALSE
is.a.r(list()) # FALSE TRUE - a list is a list
is.a.r(list(2)) # FALSE TRUE
is.a.r(lm) # FALSE TRUE
is.a.r(y ~ x) # FALSE TRUE
is.a.r(expression(x+1)) # FALSE TRUE
is.a.r(quote(exp)) # FALSE FALSE
}
\keyword{programming}
\keyword{classes}