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

\name{warning}
\alias{warning}
\alias{suppressWarnings}
\title{Warning Messages}
\description{
  Generates a warning message that corresponds to its argument(s) and
  (optionally) the expression or function from which it was called.
}
\usage{
warning(\dots, call. = TRUE, immediate. = FALSE, noBreaks. = FALSE,
        domain = NULL)
suppressWarnings(expr)
}
\arguments{
  \item{\dots}{zero or more objects which can be coerced to character
    (and which are pasted together with no separator) or a single
    condition object.}
  \item{call.}{logical, indicating if the call should become part of the
    warning message.}
  \item{immediate.}{logical, indicating if the call should be output
    immediately, even if \code{\link{getOption}("warn") <= 0}.}
  \item{noBreaks.}{logical, indicating as far as possible the message should
    be output as a single line when \code{options(warn = 1)}.}
  \item{expr}{expression to evaluate.}
  \item{domain}{see \code{\link{gettext}}.  If \code{NA}, messages will
    not be translated, see also the note in \code{\link{stop}}.}
}
\details{
  The result \emph{depends} on the value of
  \code{\link{options}("warn")} and on handlers established in the
  executing code.

  If a condition object is supplied it should be the only argument, and
  further arguments will be ignored, with a message.

  \code{warning} signals a warning condition by (effectively) calling
  \code{signalCondition}.  If there are no handlers or if all handlers
  return, then the value of \code{warn = \link{getOption}("warn")} is
  used to determine the appropriate action.  If \code{warn} is negative
  warnings are ignored; if it is zero they are stored and printed after
  the top--level function has completed; if it is one they are printed
  as they occur and if it is 2 (or larger) warnings are turned into
  errors. Calling \code{warning(immediate. = TRUE)} turns \code{warn <=
    0} into \code{warn = 1} for this call only.


  If \code{warn} is zero (the default), a read-only variable
  \code{last.warning} is created.  It contains the warnings which can be
  printed via a call to \code{\link{warnings}}.

  Warnings will be truncated to \code{\link{getOption}("warning.length")}
  characters, default 1000, indicated by \code{[... truncated]}.

  While the warning is being processed, a \code{muffleWarning} restart
  is available.  If this restart is invoked with \code{invokeRestart},
  then \code{warning} returns immediately.

  An attempt is made to coerce other types of inputs to \code{warning}
  to character vectors.

  \code{suppressWarnings} evaluates its expression in a context that
  ignores all warnings.
}
\value{
  The warning message as \code{\link{character}} string, invisibly.
}
\references{
  Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
  \emph{The New S Language}.
  Wadsworth & Brooks/Cole.
}
\seealso{
  \code{\link{stop}} for fatal errors,
  \code{\link{message}} for diagnostic messages,
  \code{\link{warnings}},
  and \code{\link{options}} with argument \code{warn=}.

  \code{\link{gettext}} for the mechanisms for the automated translation
  of messages.
}
\examples{
\dontshow{oldopt <- options(warn = 1)}
testit <- function() warning("testit")
testit() ## shows call
testit <- function() warning("problem in testit", call. = FALSE)
testit() ## no call
suppressWarnings(warning("testit"))
\dontshow{eigenval <- 10 ^ -stats::rnorm(1, mean = 6)
if(eigenval < 1.e-7) warning("system near singular")
options(oldopt)}
}
\keyword{programming}
\keyword{error}
