Rev 34719 | Rev 36397 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
\name{Extract}\title{Extract or Replace Parts of an Object}\alias{Extract}\alias{Subscript}\alias{[}\alias{[[}\alias{$}\alias{[<-}\alias{[[<-}\alias{$<-}\concept{delete}\description{Operators acting on vectors, matrices, arrays and lists to extract orreplace subsets.}\usage{x[i]x[i, j, \dots , drop = TRUE]x[[i]]x[[i, j, \dots]]x$name}\arguments{\item{x}{object from which to extract elements or in which to replace elements.}\item{i, j, \dots, name}{indices specifying elements to extract or replace. \code{i, j} are\code{numeric} or \code{character} or empty whereas \code{name} must becharacter or an (unquoted) name. Numeric values are coerced tointeger as by \code{\link{as.integer}}. For \code{[[} and \code{$}character strings are normally partially matched to the names of theobject if exact matching does not succeed.For \code{[}-indexing only: \code{i, j, \dots} can belogical vectors, indicating elements/slices to select. Such vectorsare recycled if necessary to match the corresponding extent. Whenindexing arrays, \code{i} can be a (single) matrix with as manycolumns as there are dimensions of \code{x}; the result is then avector with elements corresponding to the sets of indices in eachrow of \code{i}.\code{i, j, \dots} can also be negative integers, indicatingelements/slices to leave out of the selection.}\item{drop}{For matrices and arrays. If \code{TRUE} theresult is coerced to the lowest possible dimension (see examplesbelow). This only works for extracting elements, not for thereplacement forms.}}\details{These operators are generic. You can write methods to handle subsettingof specific classes of objects, see \link{InternalMethods} as well as\code{\link{[.data.frame}} and \code{\link{[.factor}}. Thedescriptions here apply only to the default methods.The most important distinction between \code{[}, \code{[[} and\code{$} is that the \code{[} can select more than one element whereasthe other two select a single element.The default methods work somewhat differently for atomic vectors,matrices/arrays and for recursive (list-like, see\code{\link{is.recursive}}) objects. \code{$} returns \code{NULL}except for recursive objects, and is only discussed there.Indexing can occur on the right-hand-side of an expression forextraction, or on the left-hand-side for replacement.When an index expression appears on the left side of an assignmentthen that part of \code{x} is set to the value of the right hand sideof the assignment.}\section{Atomic vectors}{The usual form of indexing is \code{"["}. \code{"[["} can be used toselect a single element, but \code{"["} can also do so (but will notpartially match a character index).The index object \code{i} can be numeric, logical, character or empty.Indexing by factors is allowed and is equivalent to indexing by thenumeric codes (see \code{\link{factor}}) and not by the charactervalues which are printed (for which use \code{[as.character(i)]}).An empty index selects all values: this is most often used to replaceall the entries but keep the \code{\link{attributes}}.}\section{Matrices and arrays}{Matrices and arrays are vectors with a dimension attribute and so allthe vector forms of indexing can be used with a single index. Theresult will be an unnamed vector unless \code{x} is one-dimensionalwhen it will be a one-dimensional array.The most common form of indexing a \eqn{k}-dimensional array is tospecify \eqn{k} indices to \code{[}. As for vector indexing, theindices can be numeric, logical, character, empty or even factor.An empty index (a comma separated blank) indicates that all entries inthat dimension are selected.The argument \code{drop} applies to this form of indexing.A third form of indexing is via a numeric matrix with the one columnfor each dimension: each row of the index matrix then selects a singleelement of the array, and the result is a vector. Negative indices arenot allowed in the index matrix. \code{NA} and zero values are allowed:rows of an index matrix containing a zero are ignored, whereas rowscontaining an \code{NA} produce an \code{NA} in the result.A vector obtained by matrix indexing will be unnamed unless\code{x} is one-dimensional when the row names (if any) will beindexed to provide names for the result.}\section{List-like objects}{Indexing by \code{[} is similar to atomic vectors and selects a listof the specified element(s).Both \code{[[} and \code{$} select a single element of the list.The main difference is that \code{$} does not allowcomputed indices, whereas \code{[[} does. \code{x$name} is equivalentto \code{x[["name"]]}.\code{[} and \code{[[} are sometimes applied to other recursiveobjects such as \link{call}s and \link{expression}s. Pairlists arecoerced to lists for extraction by \code{[}, but all three operatorscan be used for replacement.As from \R 1.7.0 \code{[[} can be applied recursively to lists, sothat if the single index \code{i} is a vector of length \code{p},\code{alist[[i]]} is equivalent to \code{alist[[i1]]\dots[[ip]]}providing all but the final indexing results in a list.When \code{$<-} is applied to a \code{NULL} \code{x}, it first coerces\code{x} to \code{list()}. This is what also happens with \code{[[<-}if the replacement value \code{value} is of length greater than one:if \code{value} has length 1 or 0, \code{x} is first coerced to azero-length vector of the type of \code{value}.}\section{Environments}{As from \R 1.9.0 both \code{$} and \code{[[} can be applied toenvironments. Only character arguments are allowed and no partialmatching is done (this is in contrast to the behavior for lists). Thesemantics of these operations is basically that of \code{get(i, env=x,inherits=FALSE)}. If no match is found then \code{NULL} isreturned. The assignment versions, \code{$<-} and\code{[[<-}, can also be used. Again, only character arguments areallowed and no partial matching is done. The semantics in this caseare those of \code{assign(i, value, env=x, inherits=FALSE)}. Such anassignment will either create a new binding or change the existingbinding in \code{x}.}\section{NAs in indexing}{When extracting, a numerical, logical or character \code{NA} picksan unknown element and so returns \code{NA} in the correspondingelement of a logical, integer, numeric, complex or character result,and \code{NULL} for a list.When replacing (that is using subscripting on the lhs of anassignment) \code{NA} does not select any element to be replaced. Asthere is ambiguity as to whether an element of the rhs shouldbe used or not (and \R handled this inconsistently prior to \R 2.0.0),this is only allowed if the rhs value is of length one (so the twointerpretations would have the same outcome).}\section{Argument matching}{Note that these operations do not match their index arguments in thestandard way: argument names are ignored and positional matching only isused. So \code{m[j=2,i=1]} is equivalent to \code{m[2,1]} and\strong{not} to \code{m[1,2]}.This may not be true for methods defined for them; for example it isnot true for the \code{data.frame} methods described in\code{\link{[.data.frame}}.To avoid confusion, do not name index arguments (but \code{drop} mustbe named).}\references{Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)\emph{The New S Language}.Wadsworth \& Brooks/Cole.}\seealso{\code{\link{list}}, \code{\link{array}}, \code{\link{matrix}}.\code{\link{[.data.frame}} and \code{\link{[.factor}} for thebehaviour when applied to data.frame and factors.\code{\link{Syntax}} for operator precedence, and the\emph{R Language} reference manual about indexing details.%% Fixme: Link (to html in 'help.start()', pdf from 'ref manual',%% 'info' from ESS, see \url{http://cran.R-project.org/manuals.html}.}\examples{x <- 1:12; m <- matrix(1:6,nr=2); li <- list(pi=pi, e = exp(1))x[10] # the tenth element of xx <- x[-1] # delete the 1st element of xm[1,] # the first row of matrix mm[1, , drop = FALSE] # is a 1-row matrixm[,c(TRUE,FALSE,TRUE)]# logical indexingm[cbind(c(1,2,1),3:1)]# matrix indexm <- m[,-1] # delete the first column of mli[[1]] # the first element of list liy <- list(1,2,a=4,5)y[c(3,4)] # a list containing elements 3 and 4 of yy$a # the element of y named a## non-integer indices are truncated:(i <- 3.999999999) # "4" is printed(1:5)[i] # 3## recursive indexing into listsz <- list( a=list( b=9, c='hello'), d=1:5)unlist(z)z[[c(1, 2)]]z[[c(1, 2, 1)]] # both "hello"z[[c("a", "b")]] <- "new"unlist(z)## check $ and [[ for environmentse1 <- new.env()e1$a <- 10e1[["a"]]e1[["b"]] <- 20e1$bls(e1)}\keyword{array}\keyword{list}