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

\name{row+colnames}
\title{Row and Column Names}
\alias{rownames}
\alias{rownames<-}
\alias{colnames}
\alias{colnames<-}
\usage{
rownames(x, do.NULL = TRUE, prefix = "row")
rownames(x) <- value

colnames(x, do.NULL = TRUE, prefix = "col")
colnames(x) <- value
}
\description{
  Retrieve or set the row or column names of a matrix-like object.
}
\arguments{
  \item{x}{a matrix-like \R object, with at least two dimensions for
    \code{colnames}.}
  \item{do.NULL}{logical. If \code{FALSE} and names are \code{NULL}, names are created.}
  \item{prefix}{for created names.}
  \item{value}{a valid value for that component of
    \code{\link{dimnames}(x)}.  For a matrix or array this is either
    \code{NULL} or a character vector of non-zero length equal to the
    appropriate dimension.}
}
\details{
  The extractor functions try to do something sensible for any
  matrix-like object \code{x}.  If the object has \code{\link{dimnames}}
  the first component is used as the row names, and the second component
  (if any) is used for the column names.  For a data frame, \code{rownames}
  and \code{colnames} eventually call \code{\link{row.names}} and
  \code{\link{names}} respectively, but the latter are preferred.

  If \code{do.NULL} is \code{FALSE}, a character vector (of length
  \code{\link{NROW}(x)} or \code{\link{NCOL}(x)}) is returned in any
  case, prepending \code{prefix} to simple numbers, if there are no
  dimnames or the corresponding component of the dimnames is \code{NULL}.

  The replacement methods for arrays/matrices coerce vector and factor
  values of \code{value} to character, but do not dispatch methods for
  \code{as.character}.

  For a data frame, \code{value} for \code{rownames} should be a
  character vector of non-duplicated and non-missing names (this is
  enforced), and for \code{colnames} a character vector of (preferably)
  unique syntactically-valid names.  In both cases, \code{value} will be
  coerced by \code{\link{as.character}}, and setting \code{colnames}
  will convert the row names to character.
}
\note{
  If the replacement versions are called on a matrix without any
  existing dimnames, they will add suitable dimnames.  But
  constructions such as
\preformatted{    rownames(x)[3] <- "c"}
  may not work unless \code{x} already has dimnames, since this will
  create a length-3 \code{value} from the \code{NULL} value of
  \code{rownames(x)}.
}
\seealso{
  \code{\link{dimnames}},
  \code{\link{case.names}},
  \code{\link{variable.names}}.
}
\examples{
m0 <- matrix(NA, 4, 0)
rownames(m0)

m2 <- cbind(1, 1:4)
colnames(m2, do.NULL = FALSE)
colnames(m2) <- c("x","Y")
rownames(m2) <- rownames(m2, do.NULL = FALSE, prefix = "Obs.")
m2
}
\keyword{array}
\keyword{manip}
