\name{Views-utils}
\alias{Views-utils}

\alias{slice}
\alias{slice,integer-method}
\alias{slice,Rle-method}
\alias{slice,RleList-method}
\alias{slice,XInteger-method}
\alias{slice,XDouble-method}

\alias{viewApply}
\alias{viewApply,Views-method}
\alias{viewApply,RleViews-method}
\alias{viewApply,RleViewsList-method}
\alias{viewMins}
\alias{viewMins,RleViews-method}
\alias{viewMins,RleViewsList-method}
\alias{viewMins,XIntegerViews-method}
\alias{viewMins,XDoubleViews-method}
\alias{viewMaxs}
\alias{viewMaxs,RleViews-method}
\alias{viewMaxs,RleViewsList-method}
\alias{viewMaxs,XIntegerViews-method}
\alias{viewMaxs,XDoubleViews-method}
\alias{viewSums}
\alias{viewSums,RleViews-method}
\alias{viewSums,RleViewsList-method}
\alias{viewSums,XIntegerViews-method}
\alias{viewSums,XDoubleViews-method}
\alias{viewMeans}
\alias{viewMeans,RleViews-method}
\alias{viewMeans,RleViewsList-method}
\alias{viewMeans,XIntegerViews-method}
\alias{viewMeans,XDoubleViews-method}
\alias{viewWhichMins}
\alias{viewWhichMins,RleViews-method}
\alias{viewWhichMins,RleViewsList-method}
\alias{viewWhichMins,XIntegerViews-method}
\alias{viewWhichMins,XDoubleViews-method}
\alias{viewWhichMaxs}
\alias{viewWhichMaxs,RleViews-method}
\alias{viewWhichMaxs,RleViewsList-method}
\alias{viewWhichMaxs,XIntegerViews-method}
\alias{viewWhichMaxs,XDoubleViews-method}
\alias{viewRangeMins}
\alias{viewRangeMins,RleViews-method}
\alias{viewRangeMins,RleViewsList-method}
\alias{viewRangeMaxs}
\alias{viewRangeMaxs,RleViews-method}
\alias{viewRangeMaxs,RleViewsList-method}

\alias{Summary,Views-method}
\alias{mean,Views-method}
\alias{max,Views-method}
\alias{min,Views-method}
\alias{sum,Views-method}
\alias{which.min,Views-method}
\alias{which.max,Views-method}

\title{Utility functions and numeric summary of Views of numerics}

\description{
  The \code{slice} function creates a \linkS4class{Views} object that contains
  the indices where the data are within the specified bounds.

  The \code{viewMins}, \code{viewMaxs}, \code{viewSums}, \code{viewMeans}
  functions calculate the minima, maxima, sums, and means on views respectively.
}

\usage{
viewApply(X, FUN, ..., simplify = TRUE)

slice(x, lower=-Inf, upper=Inf, ...)
\S4method{slice}{Rle}(x, lower=-Inf, upper=Inf,
                      includeLower=TRUE, includeUpper=TRUE,
                      rangesOnly = FALSE)

viewMins(x, na.rm=FALSE)
\S4method{min}{Views}(x, ..., na.rm = FALSE)
viewMaxs(x, na.rm=FALSE)
\S4method{max}{Views}(x, ..., na.rm = FALSE)
viewSums(x, na.rm=FALSE)
\S4method{sum}{Views}(x, ..., na.rm = FALSE)
viewMeans(x, na.rm=FALSE)
\S4method{mean}{Views}(x, ...)

viewWhichMins(x, na.rm=FALSE)
\S4method{which.min}{Views}(x)
viewWhichMaxs(x, na.rm=FALSE)
\S4method{which.max}{Views}(x)

viewRangeMins(x, na.rm=FALSE)
viewRangeMaxs(x, na.rm=FALSE)
}

\arguments{
  \item{X}{
    A Views object.
  }
  \item{FUN}{
    The function to be applied to each view in \code{X}.
  }
  \item{\dots}{
    Additional arguments to be passed on.
  }
  \item{simplify}{
    A logical value specifying whether or not the result should be simplified
    to a vector or matrix if possible.
  }
  \item{x}{
    An \linkS4class{Rle}, \linkS4class{RleList}, \linkS4class{XInteger} object
    or an integer vector for \code{slice}.

    An \linkS4class{RleViews}, \linkS4class{RleViewsList},
    \linkS4class{XIntegerViews} or \linkS4class{XDoubleViews} object
    for \code{viewMins}, \code{viewMaxs}, \code{viewSums}, and \code{viewMeans}.

    An \linkS4class{Rle}, \linkS4class{RleViewsList},
    \linkS4class{XIntegerViews} or \linkS4class{XDoubleViews} object
    for \code{viewWhichMins} and \code{viewWhichMaxs}.
  }
  \item{lower, upper}{
    The lower and upper bounds for the slice.
  }
  \item{includeLower, includeUpper}{
    Logical indicating whether or not the specified boundary is open or closed.
  }
  \item{rangesOnly}{
    For \linkS4class{Rle} and \linkS4class{RleList} objects, a logical
    indicating whether or not to drop the original data from the output.
  }
  \item{na.rm}{
    Logical indicating whether or not to include missing values in the results.
  }
}

\details{
  The \code{slice} function is useful for finding areas of absolute maxima
  (peaks), absolute minima (troughs), or fluctuations within specified limits.

  The \code{viewMins}, \code{viewMaxs}, \code{viewSums}, and \code{viewMeans}
  functions provide efficient methods for calculating the specified numeric
  summary by performing the looping in compiled code.

  The \code{viewWhichMins}, \code{viewWhichMaxs}, \code{viewRangeMins}, and
  \code{viewRangeMaxs} functions provide efficient methods for finding the
  locations of the minima and maxima.

  For convenience, methods for \code{min}, \code{max}, \code{sum},
  \code{mean}, \code{which.min} and \code{which.max} are provided as
  wrappers around the corresponding \code{view*} functions (which might
  be deprecated at some point).
}

\value{
  An \linkS4class{RleViews} object for \linkS4class{Rle} or an
  \linkS4class{RleViewsList} for \linkS4class{RleList} containing the
  views when using \code{slice} with \code{rangesOnly = FALSE}.
  An \linkS4class{IRanges} object for \linkS4class{Rle} or a
  \linkS4class{CompressedIRangesList} for \linkS4class{RleList} containing
  the ranges when using \code{slice} with \code{rangesOnly = TRUE}.
  An \linkS4class{XIntegerViews} for an \linkS4class{XInteger} object
  when using \code{slice}.
  An \linkS4class{XDoubleViews} for an \linkS4class{XDouble} object
  when using \code{slice}.

  A vector of \code{length(x)} for \linkS4class{RleViews},
  \linkS4class{XIntegerViews} and \linkS4class{XDoubleViews} objects,
  or a \linkS4class{SimpleList} object of \code{length(x)} for
  \linkS4class{RleViewsList} objects containing the numeric summaries
  for the views for \code{viewMins}, \code{viewMaxs},
  \code{viewSums}, \code{viewMeans}, \code{viewWhichMins}, and
  \code{viewWhichMaxs}.

  An \linkS4class{IRanges} object for \linkS4class{RleViews} objects or a
  \linkS4class{SimpleIRangesList} for \linkS4class{RleViewsList} objects
  containing the location ranges for \code{viewRangeMins} and
  \code{viewRangeMaxs}.
}

\author{P. Aboyoun}

\seealso{
  \link{RleViews-class}, \link{RleViewsList-class}, \link{XIntegerViews-class},
  \code{\link{which.min}}, \code{\link{colSums}}
}

\examples{
  ## Views derived from vector
  vec <- as.integer(c(19, 5, 0, 8, 5))
  slice(vec, lower=5, upper=8)

  set.seed(0)
  vec <- sample(24)
  vecViews <- slice(vec, lower=4, upper=16)
  vecViews
  viewApply(vecViews, function(x) diff(as.integer(x)))
  viewMins(vecViews)
  viewMaxs(vecViews)
  viewSums(vecViews)
  viewMeans(vecViews)
  viewWhichMins(vecViews)
  viewWhichMaxs(vecViews)

  ## Views derived from coverage
  x <- IRanges(start=c(1L, 9L, 4L, 1L, 5L, 10L),
               width=c(5L, 6L, 3L, 4L, 3L,  3L))
  slice(coverage(x), lower=2)
  slice(coverage(x), lower=2, rangesOnly = TRUE)
}

\keyword{methods}
\keyword{algebra}
\keyword{arith}