Rev 72563 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
% File src/library/base/man/ifelse.Rd% Part of the R package, https://www.R-project.org% Copyright 1995-2016 R Core Team% Distributed under GPL 2 or later\name{ifelse}\title{Conditional Element Selection}\usage{ifelse(test, yes, no)}\alias{ifelse}\description{\code{ifelse} returns a value with the same shape as\code{test} which is filled with elements selectedfrom either \code{yes} or \code{no}depending on whether the element of \code{test}is \code{TRUE} or \code{FALSE}.}\arguments{\item{test}{an object which can be coerced to logical mode.}\item{yes}{return values for true elements of \code{test}.}\item{no}{return values for false elements of \code{test}.}}\details{If \code{yes} or \code{no} are too short, their elements are recycled.\code{yes} will be evaluated if and only if any element of \code{test}is true, and analogously for \code{no}.Missing values in \code{test} give missing values in the result.}\value{A vector of the same length and attributes (including dimensions and\code{"class"}) as \code{test} and data values from the values of\code{yes} or \code{no}. The mode of the answer will be coerced fromlogical to accommodate first any values taken from \code{yes} and thenany values taken from \code{no}.}\section{Warning}{The mode of the result may depend on the value of \code{test} (see theexamples), and the class attribute (see \code{\link{oldClass}}) of theresult is taken from \code{test} and may be inappropriate for thevalues selected from \code{yes} and \code{no}.Sometimes it is better to use a construction such as\preformatted{ (tmp <- yes; tmp[!test] <- no[!test]; tmp)}, possibly extended to handle missing values in \code{test}.Further note that \code{if(test) yes else no} is much more efficientand often much preferable to \code{ifelse(test, yes, no)} whenever\code{test} is a simple true/false result, i.e., when\code{length(test) == 1}.The \code{srcref} attribute of functions is handled specially: if\code{test} is a simple true result and \code{yes} evaluates to a functionwith \code{srcref} attribute, \code{ifelse} returns \code{yes} includingits attribute (the same applies to a false \code{test} and \code{no}argument). This functionality is only for backwards compatibility, theform \code{if(test) yes else no} should be used whenever \code{yes} and\code{no} are functions.}\references{Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)\emph{The New S Language}.Wadsworth & Brooks/Cole.}\seealso{\code{\link{if}}.}\examples{x <- c(6:-4)sqrt(x) #- gives warningsqrt(ifelse(x >= 0, x, NA)) # no warning## Note: the following also gives the warning !ifelse(x >= 0, sqrt(x), NA)## ifelse() strips attributes## This is important when working with Dates and factorsx <- seq(as.Date("2000-02-29"), as.Date("2004-10-04"), by = "1 month")## has many "yyyy-mm-29", but a few "yyyy-03-01" in the non-leap yearsy <- ifelse(as.POSIXlt(x)$mday == 29, x, NA)head(y) # not what you expected ... ==> need restore the class attribute:class(y) <- class(x)y## This is a (not atypical) case where it is better *not* to use ifelse(),## but rather the more efficient and still clear:y2 <- xy2[as.POSIXlt(x)$mday != 29] <- NA## which gives the same as ifelse()+class() hack:stopifnot(identical(y2, y))## example of different return modes (and 'test' alone determining length):yes <- 1:3no <- pi^(1:4)utils::str( ifelse(NA, yes, no) ) # logical, length 1utils::str( ifelse(TRUE, yes, no) ) # integer, length 1utils::str( ifelse(FALSE, yes, no) ) # double, length 1}\keyword{logic}\keyword{programming}