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

\name{attributes}
\title{Object Attribute Lists}
\alias{attributes}
\alias{attributes<-}
\alias{mostattributes<-}
\description{
  These functions access an object's attributes.
  The first form below returns the object's attribute list.
  The replacement forms uses the list on the right-hand
  side of the assignment as the object's attributes (if appropriate).
}
\usage{
attributes(x)
attributes(x) <- value
mostattributes(x) <- value
}
\arguments{
  \item{x}{any \R object}
  \item{value}{an appropriate named \code{\link{list}} of attributes, or
    \code{NULL}.}
}
\details{
  Unlike \code{\link{attr}} it is not an error to set attributes on a
  \code{NULL} object: it will first be coerced to an empty list.

  Note that some attributes (namely \code{\link{class}},
  \code{\link{comment}}, \code{\link{dim}}, \code{\link{dimnames}},
  \code{\link{names}}, \code{\link{row.names}} and
  \code{\link{tsp}}) are treated specially and have restrictions on
  the values which can be set.  (Note that this is not true of
  \code{\link{levels}} which should be set for factors via the
  \code{levels} replacement function.)

  Attributes are not stored internally as a list and should be thought
  of as a set and not a vector, i.e, the \emph{order} of the elements of
  \code{attributes()} does not matter.  This is also reflected by
  \code{\link{identical}()}'s behaviour with the default argument
  \code{attrib.as.set = TRUE}.  Attributes must have unique names (and
  \code{NA} is taken as \code{"NA"}, not a missing value).

  Assigning attributes first removes all attributes, then sets any
  \code{dim} attribute and then the remaining attributes in the order
  given: this ensures that setting a \code{dim} attribute always precedes
  the \code{dimnames} attribute.

  The \code{mostattributes} assignment takes special care for the
  \code{\link{dim}}, \code{\link{names}} and \code{\link{dimnames}}
  attributes, and assigns them only when known to be valid whereas an
  \code{attributes} assignment would give an error if any are not.  It
  is principally intended for arrays, and should be used with care on
  classed objects.  For example, it does not check that
  \code{\link{row.names}} are assigned correctly for data frames.

  The names of a pairlist are not stored as attributes, but are reported
  as if they were (and can be set by the replacement form of
  \code{attributes}).

  \code{\link{NULL}} objects cannot have attributes and attempts to
  assign them will promote the object to an empty list.

  Both assignment and replacement forms of \code{attributes} 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{attr}},  \code{\link{structure}}.
}
\examples{
x <- cbind(a = 1:3, pi = pi) # simple matrix with dimnames
attributes(x)

## strip an object's attributes:
attributes(x) <- NULL
x # now just a vector of length 6

mostattributes(x) <- list(mycomment = "really special", dim = 3:2,
   dimnames = list(LETTERS[1:3], letters[1:5]), names = paste(1:6))
x # dim(), but not {dim}names
}
\keyword{attribute}
