% -*- coding: utf-8 -*-
\newcommand{\Rlogo}{\if{html}{\figure{../../html/Rlogo.svg}{options: class="toplogo" alt="[R logo]"}}\if{latex}{\figure{Rlogo.pdf}{options: width=0.5in}}}

\name{NEWS}
\title{R News}
\encoding{UTF-8}

\section{LATER NEWS}{
  \itemize{
    \item News for \R 4.x.y can be found in HTML format at
    \ifelse{html}{\url{NEWS.html}}{\file{doc/html/NEWS.html}},
    and in text format in file
    \ifelse{html}{\href{../NEWS}{NEWS}}{\file{NEWS}}
    in the \file{doc} directory.
  }
}

\section{\Rlogo CHANGES IN R 3.6.3}{

  \subsection{NEW FEATURES}{
    \itemize{
      \item The included LAPACK has been updated to version 3.9.0 (for
      the included routines, just bug fixes).
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item Fixed a C level integer overflow in \code{rhyper()}; reported
      by Benjamin Tyner in \PR{17694}.

      \item Uses of \code{url(gzcon(.))} needing to extend buffer size
      have failed (with HTTP/2 servers), reported by Gábor Csárdi.

      \item \code{predict(loess(..), se=TRUE)} now errors out (instead of
      seg.faulting etc) for large sample sizes, thanks to a report and
      patch by Benjamin Tyner in \PR{17121}.

      \item \code{tools:assertCondition(., "error")} and hence
      \code{assertError()} no longer return errors twice (invisibly).

      \item \code{update(form, new)} in the case of a long \code{new}
      formula sometimes wrongly eliminated the intercept from \code{form},
      or (more rarely) added a garbage term (or seg.faulted !); the fix
      happened by simplifying the C-level logic of \code{terms.formula()}.
      Reported by Mathias Ambühl in \PR{16326}.

      \item The error message from \code{stopifnot(.., <error producing call>)}
      again contains the full \code{"stopifnot(.......)"} call: Its
      attempted suppression did not work consistently. % & was an ugly hack

      \item On Windows, \code{download.file(., , "wininet", headers=character())}
      would fail; reported with patch proposal by Kevin Ushey in \PR{17710}.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.6.2}{

  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{runmed(x, *)} gains a new option \code{na.action}
      determining \emph{how} to handle \code{NaN} or \code{NA} in \code{x}.

      \item \code{dotchart()} gains new options \code{ann}, \code{xaxt},
      \code{frame.plot} and \code{log}.
    }
  }

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item Detection of the C stack direction has been moved from
      run-time to \command{configure}: this is safer with LTO builds and
      allows the detection to be overridden -- see file
      \file{config.site}.

      \item Source-code changes enable installation on platforms using
      \command{gcc -fno-common} (the expected default for
      \command{gcc 10.x}).
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item \code{installTrChar} (which is nowadays is wrapped by
      \code{installChar}) is defined in \file{Rinternals.h}.  (Neither
      are part of the API.)
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item Header \file{Rconfig.h} contains the value of
      \code{FC_LEN_T} deduced at installation which is used by the
      prototypes in headers \file{R_ext/BLAS.h} and
      \file{R_ext/Lapack.h} but to avoid extensive breakage this is
      only exposed when \code{USE_FC_LEN_T} is defined.

      If a package's C/C++ calls to BLAS/LAPACK allow for the
      \sQuote{hidden} arguments used by most Fortran compilers to pass
      the lengths of Fortran character arguments, define
      \code{USE_FC_LEN_T} and include \file{Rconfig.h} (possibly
      \emph{via} \file{R.h}) before including \file{R_ext/BLAS.h} or
      \file{R_ext/Lapack.h}.

      \item A package with Fortran source code and perhaps C (but not
      C++) sources can request for its shared object/DLL to be linked by
      the Fortran compiler by including a line \code{USE_FC_TO_LINK=} in
      \file{src/Makevars[.win]} and using \code{$(SHLIB_OPENMP_FFLAGS)}
      as part of \code{PKG_LIBS}.

      The known reason for doing so is a package which uses Fortran
      (only) OpenMP on a platform where the Fortran OpenMP runtime is
      incompatible with the C one (e.g.\sspace{}\command{gfortran} 9.x
      with \command{clang}).
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} has a new option to mitigate checks
      leaving files/directories in \file{/tmp}.  See the \sQuote{R
	Internals} manual -- this is part of \code{--as-cran}.
    }
  }

  \subsection{Windows}{
    \itemize{
      \item The default standard for C++ in package installation is
      C++11 (as it has been on other platforms where available since \R{}
      3.6.0: the default toolchain on Windows was defaulting to C++98).
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item Support for specifying C++98 in package installation is
      deprecated.

      \item Support in \command{R CMD config} for \samp{F77},
      \samp{FCPIFCPLAGS}, \samp{CPP}, \samp{CXXCPP} and \samp{CXX98} and
      similar is deprecated.  (\samp{CPP} is found from the system
      \command{make} and may well not be set.)

      Use \samp{$CC -E} and \samp{$CXX -E} instead of \samp{CPP} and
      \samp{CXXCPP}.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{runmed(x, *)} when \code{x} contains missing values
      now works consistently for both \code{algorithm="Stuetzle"} and
      \code{"Turlach"}, and no longer segfaults for \code{"Turlach"}, as
      reported by Hilmar Berger.

      \item \code{apply(diag(3), 2:3, mean)} now gives a helpful error message.

      \item \code{dgamma(x, shape, log=TRUE)} now longer overflows
      to \code{Inf} for shape < 1 and very small \code{x}, fixing
      \PR{17577}, reported by Jonathan Rougier.

      \item Buffer overflow in building error messages fixed. Reported
      by Benjamin Tremblay.

      \item \code{options(str = .)} is correctly initialized at
      package \pkg{utils} load time, now.  A consequence is that
      \code{str()} in scripts now is more consistent to interactive use,
      e.g., when displaying function(**) argument lists.

      \item \code{as.numeric(<call>)} now gives correct error message.

      \item Printing \code{ls.str()} no longer wrongly shows
      \code{"<missing>"} in rare cases.

      \item Auto-printing S4 objects no longer duplicates the object,
      for faster speed and reduced memory consumption. Reported by Aaron
      Lun.

      \item \code{pchisq(<LRG>, <LRG>, ncp=100)} no longer takes
      practically forever in some cases.  Hence ditto for corresponding
      \code{qchisq()} calls.

      \item \code{x \%\% L} for finite \code{x} no longer returns
      \code{NaN} when \code{L} is infinite, nor suffers from cancellation
      for large finite \code{L}, thanks to Long Qu's \PR{17611}.

      Analogously, \code{x \%/\% L} and \code{L \%/\% x} suffer less from
      cancellation and return values corresponding to limits for large
      \code{L}.

      \item \code{grepl(NA, *)} now returns \code{logical} as documented.

      \item \code{options(warn=1e11)} is an error now, instead of later
      leading to C stack overflow because of infinite recursion.

      \item \code{R_tryCatch} no longer transfers control for all
      conditions. Reported and patch provided by Lionel Henry in
      \PR{17617}.

      \item \code{format(object.size(.), digits=NULL)} now works, fixing
      \PR{17628} reported by Jonathan Carroll.

      \item \code{get_all_vars(f, d)} now also works for cases, e.g. where
      \code{d} contains a matrix.  Reported by Simon Wood in 2009 and patch
      provided by Ben Bolker in \PR{13624}.

      Additionally, it now also works when some variables are data frames,
      fixing \PR{14905}, reported by Patrick Breheny.

      \item \code{barplot()} could get spacings wrong if there were exactly two
      bars \PR{15522}.  Patch by Michael Chirico.

      \item \code{power.t.test()} works in more cases when returning values
      of n smaller than 2.

      \item \code{dotchart(*, pch=., groups=.)} now works better.  Reported
      by Robert and confirmed by Nic Rochette in \PR{16953}.

      \item \code{canCoerce(obj, cl)} no longer assumes
      \code{length(class(obj)) == 1}.

      \item \code{plot.formula(*, subset = *)} now also works in a boundary
      case reported by Robert Schlicht (TU Dresden).

      \item \code{readBin()} and \code{writeBin()} of a
      \code{rawConnection()} now also work in large cases, thanks to a
      report and proposal by Taeke Harkema in \PR{17665}.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.6.1}{

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item The default detection of the shell variable \code{libNN} is
      overridden for derivatives of Debian Linux, some of which have
      started to have a \file{/usr/lib64} directory.
      (E.g.\sspace{}Ubuntu 19.04.)  As before, it can be specified in
      \file{config.site}.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD config} knows the values of \code{AR} and
      \code{RANLIB}, often set for LTO builds.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item The use of a character vector with \code{.Fortran()} is
      formally deprecated and gives a non-portability warning.  (It has
      long been strongly discouraged in \sQuote{Writing R Extensions}.)
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item On Windows, GUI package installation via \code{menuInstallPkgs()}
      works again, thanks to Len Weil's and Duncan Murdoch's \PR{17556}.

      \item \command{R CMD check} on \code{data()} fixing \PR{17558}
      thanks to Duncan Murdoch.

      \item \code{quasi(*, variance = list(..))} now works more
      efficiently, and should work in all cases fixing \PR{17560}.
      Further, \code{quasi(var = mu(1-mu))} and \code{quasi(var = "mu ^ 3")}
      now work, and \code{quasi(variance = "log(mu)")} now gives a correct
      error message.

      \item Creation of lazy loading database during package installation is
      again robust to Rprofile changing the current working directory
      (\PR{17559}).

      \item \code{boxplot(y ~ f, horizontal=TRUE)} now produces correct x-
      and y-labels.

      \item \code{rbind.data.frame()} allows to keep \code{<NA>} levels
      from factor columns (\PR{17562}) via new option \code{factor.exclude}.

      Additionally, it works in one more case with matrix-columns which
      had been reported on 2017-01-16 by Krzysztof Banas.

      \item Correct messaging in C++ pragma checks in \pkg{tools} code for
      \command{R CMD check}, fixing \PR{17566} thanks to Xavier Robin.

      \item{print()}ing and auto-printing no longer differs for
      \code{function}s with a user defined \code{print.function}, thanks to
      Bill Dunlap's report.

      \item On Windows, \code{writeClipboard(.., format = <n>)} now
      does correctly pass \code{format} to the underlying C code, thanks to
      a bug report (with patch) by Jenny Bryan.

      \item \code{as.data.frame()} treats 1D arrays the same as vectors,
      \PR{17570}.

      \item Improvements in \code{smoothEnds(x, *)} working with
      \code{NA}s (towards \code{runmed()} working in that case, in the next
      version of R).

      \item \code{vcov(glm(<quasi>), dispersion = *)} works correctly
      again, fixing \PR{17571} thanks to Pavel Krivitsky.

      \item \command{R CMD INSTALL} of binary packages on Windows now
      works also with per-directory locking.

      \item \command{R CMD INSTALL} and \code{install.packages()} on Windows
      are now more robust against a locked file in an earlier installation
      of the package to be installed.  The default value of option
      \code{install.lock} on Windows has been changed to \code{TRUE}.

      \item On Unix alikes (when \command{readline} is active), only
      expand tilde (\code{~}) file names starting with a tilde, instead of
      almost all tildes.

      \item In R documentation (\file{*.Rd}) files, \samp{\item [..]} is no
      longer treated specially when rendered in LaTeX and hence pdf, but
      rather shows the brackets in all cases.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.6.0}{

   \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
     \itemize{
       \item Serialization format version 3 becomes the default for
       serialization and saving of the workspace (\code{save()},
       \code{serialize()}, \code{saveRDS()}, \code{compiler::cmpfile()}).
       Serialized data in format 3 cannot be read by versions of \R prior
       to version 3.5.0.  Serialization format version 2 is still
       supported and can be selected by \code{version = 2} in the
       save/serialization functions.  The default can be changed back for
       the whole \R session by setting environment variables
       \env{R_DEFAULT_SAVE_VERSION} and \env{R_DEFAULT_SERIALIZE_VERSION}
       to \code{2}.  For maximal back-compatibility, files
       \file{vignette.rds} and \file{partial.rdb} generated by \command{R
	 CMD build} are in serialization format version 2, and resave by
       default produces files in serialization format version 2 (unless
       the original is already in format version 3).

       \item The default method for generating from a discrete uniform
       distribution (used in \code{sample()}, for instance) has been
       changed.  This addresses the fact, pointed out by Ottoboni and
       Stark, that the previous method made \code{sample()} noticeably
       non-uniform on large populations.  See \PR{17494} for a
       discussion.  The previous method can be requested using
       \code{RNGkind()} or \code{RNGversion()} if necessary for
       reproduction of old results.  Thanks to Duncan Murdoch for
       contributing the patch and Gabe Becker for further assistance.

       The output of \code{RNGkind()} has been changed to also return the
       \sQuote{kind} used by \code{sample()}.
     }
  }

   \subsection{NEW FEATURES}{
    \itemize{
      \item \code{Sys.setFileTime()} has been vectorized so arguments
      \code{path} and \code{time} of length greater than one are now
      supported.

      \item \code{axis()} gets new option \code{gap.axis = NA} for
      specifying a multiplication factor for the minimal \dQuote{gap}
      (distance) between axis labels drawn.   Its default is \code{1}
      for labels \emph{parallel} to the axis, and \code{0.25} for
      perpendicular ones.

      Perpendicular labels no longer overlap, fixing bug \PR{17384}.

      \item The default method of \code{plot()} gains new arguments
      \code{xgap.axis = NA} and \code{ygap.axis = NA} to be passed to
      the x-- and y-- \code{axis(.., gap.axis=*)} calls.

      \item \code{removeSource()} now works not only for functions but
      also for some language objects.

      \item \code{as.call()}, \code{rep.int()}, \code{rep_len()} and
      \code{nchar()} dispatch internally.

      \item \code{is(object, class2)} looks for \code{class2} in the
      calling namespace after looking in the namespace of
      \code{class(object)}.

      \item \code{extendrange(.., f)} with a length-2 \code{f} now
      extends separately to the left and the right.

      \item \code{lengths()} dispatches internally to S4 methods.

      \item \code{download.file()} on Windows now uses \code{URLdecode()}
      to determine the file extension, and uses binary transfer
      (\code{mode = "wb"}) also for file extension \file{.rds}.

      The help page for \code{download.file()} now contains the same
      information on all platforms.

      \item Setting \samp{C} locale for collation \emph{via} environment
      variables \env{LC_ALL} and \env{LC_COLLATE} and \emph{via} a call
      to \code{Sys.setlocale()} now takes precedence over environment
      variable \env{R_ICU_LOCALE}.

      \item There is a new function, \code{nullfile()}, to give the file
      name of the null system device (e.g., \file{/dev/null}) on the
      current platform. % not the null graphics device.

      \item There are two new options, \code{keep.parse.data} and
      \code{keep.parse.data.pkgs}, which control whether parse data are
      included into sources when \code{keep.source} or
      \code{keep.source.pkgs} is \code{TRUE}.  By default,
      \code{keep.parse.data.pkgs} is now \code{FALSE}, which changes
      previous behavior and significantly reduces space and time overhead
      when sources are kept when installing packages.

      \item In \code{rapply(x, ..)}, \code{x} can also be
      \dQuote{list-like} and of length \eqn{\ge 2^{31}}{>= 2^{31}}.

      \item \code{trimws()} gets new optional \code{whitespace}
      argument, allowing more extensive definitions of \dQuote{space},
      such as including Unicode spaces (as wished in \PR{17431}).

      \item \code{weighted.mean()} no longer coerces the weights to a
      double/numeric vector, since \code{sum()} now handles integer
      overflow. This makes \code{weighted.mean()} more polymorphic and
      endomorphic, but be aware that the results are no longer
      guaranteed to be a vector of type \samp{double}.

      \item When loading namespaces, S3 method registrations which
      overwrite previous registrations are now noted by default (using
      \code{packageStartupMessage()}).

      \item \code{compiler::cmpfile()} gains a \code{version} argument, for
      use when the output file should be saved in serialization format 2.

      \item The axis labeling in the default method of \code{pairs()}
      may now be toggled by new options \code{horOdd} and \code{verOdd}.

      \item (Not Windows nor macOS.) Package \pkg{tcltk} now supports an
      environment variable \env{R_DONT_USE_TK} which if set disables Tk
      initialization.  This is intended for use to circumvent errors in
      loading the package, e.g.\sspace{}with recent Linux running under
      an address sanitizer.

      \item The \code{numeric} method of \code{all.equal()} gets
      optional arguments \code{countEQ} and \code{formatFUN}.  If
      \code{countEQ} is true, the mean error is more sensible when many
      entries are \bold{eq}ual.

      \item \code{outer(x,y, FUN = "*")} is more efficient using
      \code{tcrossprod(u,v)} instead of \code{u \%*\% t(v)}.

      \item \code{vcov(<mlm>)} is more efficient via new optional
      arguments in \code{summary.mlm()}.

      \item The default method of \code{summary()} gets an option to
      choose the \emph{kind} of \code{quantile()}s to use; wish of
      \PR{17438}.

      \item Fitting multiple linear models \emph{via} \code{lm()} does
      work with \emph{matrix} offsets, as suggested in \PR{17407}.

      \item The new functions \code{mem.maxVSize()} and
      \code{mem.maxMSize()} allow the maximal size of the vector heap
      and the maximal number of nodes allowed in the current \command{R}
      process to be queried and set.

      \item \code{news()} gains support for \file{NEWS.md} files.

      \item An effort has been started to have our reference manuals,
      i.e., all help pages. show platform-independent information (rather
      than Windows or Unix-alike specifics visible only on that platform).
      Consequently, the Windows version of \code{X11()} / \code{x11()}
      got identical formal arguments to the Unix one.

      \item \code{sessionInfo()$running} has been factored out in a new
      variable \code{osVersion}. % precomputed at utils namespace load time

      \item \code{slice.index()} now also works for multi-dimensional
      margins.

      \item \code{untar()} used with an external \command{tar} command
      assumes this supports decompression including \command{xz} and
      automagically detecting the compression type.  This has been true
      of all mainstream implementations since 2009 (for GNU
      \command{tar}, since version 1.22): older implementations are
      still supported \emph{via} the new argument
      \code{support_old_tars} whose default is controlled by environment
      variable \env{R_SUPPORT_OLD_TARS}.  (It looks like NetBSD and
      OpenBSD have \sQuote{older} \command{tar} commands for this
      purpose.)

      \item The new function \code{asplit()} allow splitting an array or
      matrix by its margins.

      \item New functions \code{errorCondition()} and
      \code{warningCondition()} provide a convenient way to create
      structured error and warning objects.

      \code{.Deprecated()} now signals a warning of class
      \code{"deprecatedWarning"}, and \code{.Defunct()} now signals an
      error of class \code{"defunctError"}.

      \item Many \sQuote{package not found} errors are now signaled as
      errors of class \code{"packageNotFoundError"}.

      \item As an experimental feature, when \code{loadNamespace()} fails
      because the requested package is not available the error is
      initially signaled with a \code{retry_loadNamespace} restart
      available.  This allows a calling handler to try to install the
      package and continue.

      \item \code{S3method()} directives in \file{NAMESPACE} can now
      also be used to perform \emph{delayed} S3 method registration.

      \item Experimentally, setting environment variable
      \env{_R_CHECK_LENGTH_1_LOGIC2_} will lead to warnings (or errors
      if the variable is set to a \sQuote{true} value) when \code{&&} or
      \code{||} encounter and use arguments of length more than one.

      \item Added \code{"lines"} and \code{"chars"} coordinate systems
      to \code{grconvertX()} and \code{grconvertY()}.

      \item \code{getOption()} is more efficient notably for the rare
      case when called with two arguments, from several contributors in
      \PR{17394}.

      \item In \code{.col(dim)} and \code{.row(dim)}, \code{dim} now may
      also be an integer-valued \code{"double"}.

      \item \code{sQuote()} and \code{dQuote()} get an explicit \code{q}
      argument with obvious default instead of using
      \code{getOption("fancyQuotes")} implicitly and unconditionally.

      \item \code{unzip()} can list archives with comments and with
      spaces in file names even using an external \command{unzip} command.

      \item Command line completion has a new setting
      \code{rc.settings(dots = FALSE)} to remove \code{...} from the
      list of possible function arguments.

      \item \code{library()} no longer checks packages with compiled
      code match \samp{R.version$platform}.  \code{loadNamespace()}
      never has, and increasingly the \sQuote{canonical name} does not
      reflect the important characteristics of compiled code.
      %% E.g. 32/64-bit compiler settings

      \item The primitive functions \code{drop()} and \code{unclass()}
      now avoid duplicating their data for atomic vectors that are large
      enough, by returning \code{ALTREP} wrapper objects with adjusted
      attributes.  \R{}-level assignments to change attributes will also
      use wrapper objects to avoid duplicating data for larger atomic
      vectors. \R functions like \code{structure()} and \code{unname()}
      will therefore not duplicate data in these settings.  Generic
      vectors as produced by \code{list()} are not yet covered by this
      optimization but may be in due course.

      \item In \code{formals()}, \code{envir} becomes an optional
      argument instead of being hardwired.

      \item Instead of signalling an error for an invalid S4 object
      \code{x}, \code{str(x)} now gives a warning and subsequently still
      shows most parts of \code{x}, e.g., when slots are missing.

      \item \code{gamma(x)} and \code{lgamma(x)} no longer warn when
      correctly returning \code{Inf} or underflowing to zero.  This
      helps maximum likelihood and similar computations.

      \item \code{convertColor()} is now vectorized, so a lot faster for
      converting many colours at once.  The new argument
      \code{vectorized} to \code{colorConverter()} ensures that
      non-vectorized colour converters still work.  (Thanks to Brodie
      Gaslam.)

      \item \code{download.file()} and \code{url()} get new argument
      \code{headers} for custom HTTP headers, e.g., allowing to perform
      basic http authentication, thanks to a patch contributed by Gábor
      Csárdi.

      \item File-based connection functions \code{file()},
      \code{gzfile()}, \code{bzfile()} and \code{xzfile()} now signal an
      error when used on a directory.

      \item For \code{approx()}, \code{splinefun()} \emph{etc}, a new
      setting \code{ties = c("ordered", <fun>)} allows skipping the
      sorting and still treat ties.

      \item \code{format(x)} gives a more user friendly error message in
      the case where no method is defined.  A minimal method is provided
      in \code{format.default(x)} when \code{isS4(x)} is true.

      \item \code{which(x)} now also works when \code{x} is a long
      vector, thanks to Suharto Anggono's \PR{17201}.  \strong{NB}: this
      may return a double result, breaking the previous guarantee of an
      integer result.

      \item \code{seq.default()} is more careful to return an
      \code{integer} (as opposed to \code{double}) result when its
      arguments are large and/or classed objects; see comment #9 of
      Suharto Anggono's \PR{17497}.

      \item The \code{plot()} method for \code{lm} and \code{glm} fits,
      \code{plot.lm()}, gains a new option \code{iter.smooth} with a
      default of \code{0} for binomial fits, no longer down-weighting
      when smoothing the residuals.

      \item \code{zip()} passes its list of files \emph{via} standard
      input to the external command when too long for the command line
      (on some platforms).

      \item \code{data()} gains an \code{overwrite} argument.

      \item \code{t.test()} now also returns the standard error (in
      list component \code{stderr}).

      \item \code{model.matrix(*, contrasts.arg = CC)} now warns about
      invalid \code{contrasts.arg}s.

      \item Performance of \code{substr()} and \code{substring()} has been
      improved.

      \item \code{stopifnot()} has been simplified thanks to Suharto
      Anggono's proposals to become considerably faster for cheap
      expressions.

      \item The default \sQuote{user agent} has been changed when
      accessing \samp{http://} and \samp{https://} sites using
      \samp{libcurl}.  (A site was found which caused \samp{libcurl} to
      infinite-loop with the previous default.)

      \item \code{sessionInfo()} now also contains \code{RNGkind()} and
      prints it when it differs from the default; based on a proposal and
      patch by Gabe Becker in \PR{17535}.
      Also, \code{RNGversion(getRversion())} works directly.

      \item \code{library()} and \code{require()} now allow more control
      over handling search path conflicts when packages are
      attached. The policy is controlled by the new
      \code{conflicts.policy} option.

      \item \code{barplot()} gets a formula method, thanks to a patch
      proposal by Arni Magnusson in \PR{17521}.

      \item \code{pmax()} and \code{pmin(x)} now also work for long
      vectors, thanks to Suharto Anggono's \PR{17533}.

      \item \code{bxp()} now warns when omitting duplicated arguments.

      \item New \code{hcl.colors()} function to provide wide range of
      HCL-based colour palettes with much better perceptual properties
      than the existing RGB/HSV-based palettes like \code{rainbow()}.

      Also a new \code{hcl.pals()} function to list available palette
      names for \code{hcl.colors()}.

      Contributed by Achim Zeileis.

      \item The default colours for \code{image()} and
      \code{filled.contour()} are now based on \code{hcl.colors()}.

      \item The palette-generating functions \code{rainbow()},
      \code{gray.colors()}, etc.\sspace{}get a new \code{rev} argument
      to facilitate reversing the order of colors.

      \item New \code{str2lang()} and \code{str2expression()} as streamlined
      versions of \code{parse(text=., keep.source=FALSE)} allow to abstract
      typical call constructions, e.g., in \code{formula} manipulations.
      (Somewhat experimental) % << TO DO

      \item Add \code{update_PACKAGES()} for incrementally updating a
      package repository index, instead of rebuilding the index from
      scratch. Thanks to Gabe Becker in \PR{17544} for the patch, based
      on part of his \pkg{switchr} package.
    }
  }

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item The options selected for the C++ compiler default to the
      C++11 standard if supported, otherwise to the C++98 standard.

      \item Visibility macros such as \samp{C_VISIBILITY} can now be
      user-set (including to empty), e.g.\sspace{}in \file{config.site}.

      \item Macro \samp{FCLIBS}, which has sometimes been needed on
      Solaris, has been renamed to \samp{FCLIBS_XTRA}.

      \item Macro \samp{F77} is always set to the value of \samp{FC}, so
      the latter should be set to user-select the Fortran compiler for
      both fixed-form and free-form Fortran.  In particular,
      \command{gfortran} is now the first choice for \samp{F77}, not
      \command{f95}.

      Macros \samp{FFLAGS} and \samp{FCFLAGS} remain distinct to allow
      for a compiler which needs a flag to select free- or fixed-form
      Fortran (most use the source-file extension to choose: \file{.f}
      is fixed-form and \file{.f90} and \file{.f95} are free-form).

      If only one of them is set, its value is used for both.

      \item The special-casing of \samp{CFLAGS}, \samp{CXXFLAGS} and
      \samp{FFLAGS} for Intel compilers on Linux has been removed: we do
      not have recent experience but the generic defaults now chosen are
      the same as those previously special-cased for \samp{x86_64}.

      If necessary, override the defaults on the \command{configure}
      command line or in file \file{config.site}.

      \item Long-untested \command{configure} support for HP-UX and very
      old versions of Linux has been removed.

      \item \command{configure --with-blas} (without specifying a value)
      includes OpenBLAS in its search (before ATLAS and a generic
      BLAS).  This follows recent versions of the \samp{ax_blas}
      autoconf macro.

      \item The \command{configure} macro \samp{MAKEINFO} has been
      updated to \samp{TEXI2ANY}.

      \item Support for \command{make install-strip} has been enhanced.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item Source package installation is by default \sQuote{staged}:
      the package is installed into a temporary location under the final
      library directory and moved into place once the installation is
      complete.  The benefit is that partially-installed packages are
      hidden from other \R sessions.

      The overall default is set by environment variable
      \env{R_INSTALL_STAGED}.  \command{R CMD INSTALL} has new options
      \option{--staged-install} and \option{--no-staged-install}, and
      packages can use the \samp{StagedInstall} field in their
      \file{DESCRIPTION} file to opt out.  (That opt-out is a temporary
      measure which may be withdrawn in future.)

      Staged installation requires either \option{--pkglock} or
      \option{--lock}, one of which is used by default.

      \item The interpretation of source code with extension \file{.f}
      is changing.  Previously this denoted FORTRAN 77 code, but current
      compilers no longer have a FORTRAN 77 mode and interpret it as
      \sQuote{fixed-form} Fortran 90 (or later where supported) code.
      Extensions \file{.f90} and \file{.f95} continue to indicate
      \sQuote{free-form} Fortran code.

      Legal FORTRAN 77 code is also legal fixed-form Fortran 9x; however
      this change legitimizes the use of later features, in particular
      to replace features marked \sQuote{obsolescent} in Fortran 90 and
      \sQuote{deleted} in Fortran 2018 which \command{gfortran} 8.x and
      later warn about.

      \item Packages containing files in the \file{src} directory with
      extensions \file{.f90} or \file{.f95} are now linked using the C
      or C++ compiler rather than the Fortran 9x compiler.  This is
      consistent with fixed-form Fortran code and allows mixing of C++
      and free-form Fortran on most platforms.

      Consequentially, a package which includes free-form Fortran 9x
      code which uses OpenMP should include \samp{SHLIB_OPENMP_CFLAGS}
      (or the \samp{CXXFLAGS} version if they also include C++ code) in
      \samp{PKG_LIBS} rather than \samp{SHLIB_OPENMP_FCFLAGS} ---
      fortunately on almost all current platforms they are the same
      flag.

      \item Macro \samp{PKG_FFLAGS} will be used for the compilation of
      both fixed-form and free-form Fortran code unless
      \samp{PKG_FCFLAGS} is also set (in \file{src/Makevars} or
      \file{src/Makevars.win}).

      \item The make macro \samp{F_VISIBILITY} is now preferred for
      both fixed-form and free-form Fortran, for use in
      \file{src/Makevars} and similar.

      \item \command{R CMD INSTALL} gains a new option \option{--strip}
      which (where supported) strips installed shared object(s): this
      can also be achieved by setting the environment variable
      \env{_R_SHLIB_STRIP_} to a true value.

      The new option \option{--strip-lib} attempts stripping of
      static and shared libraries installed under \file{lib}.

      These are most useful on platforms using GNU \code{binutils} (such
      as Linux) and compiling with \option{-g} flags.

      \item There is more support for installing UTF-8-encoded packages
      in a strict Latin-1 locale (and probably for other Latin locales):
      non-ASCII comments in \R code (and \file{NAMESPACE} files) are
      worked around better.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} now optionally checks makefiles for
      correct and portable use of the \samp{SHLIB_OPENMP_*FLAGS} macros.

      \item \command{R CMD check} now evaluates \code{\\Sexpr{}}
      expressions (including those in macros) before checking the
      contents of \file{Rd} files and so detects issues both in
      evaluating the expressions and in the expanded contents.

      \item \command{R CMD check} now lists missing packages separated
      by commas and with regular quotes such as to be useful as argument
      in calling \code{install.packages(c(..))}; from a suggestion by
      Marcel Ramos.

      \item \code{tools::Rd2latex()} now uses UTF-8 as its default
      output encoding.

      \item \command{R CMD check} now checks line endings of files with
      extension \file{.hpp} and those under \file{inst/include}.  The
      check now includes that a non-empty file is terminated with a
      newline.

      \command{R CMD build} will correct line endings in such files.

      \item \command{R CMD check} now tries re-building all vignettes
      rather than stopping at the first error: whilst doing so it adds
      \sQuote{bookmarks} to the log.  By default (see the \sQuote{R
      Internals} manual) it re-builds each vignette in a separate
      process.

      It now checks for duplicated vignette titles (also known as
      \sQuote{index entries}): they are used as hyperlinks on
      \acronym{CRAN} package pages and so do need to be unique.

      \item \command{R CMD check} has more comprehensive checks on the
      \file{data} directory and the functioning of \code{data()} in a
      package.

      \item \command{R CMD check} now checks
      \command{autoconf}-generated \file{configure} files have their
      corresponding source files, including optionally attempting to
      regenerate them on platforms with \command{autoreconf}.

      \item \command{R CMD build} has a new option
      \option{--compression} to select the compression used for the tarball.

      \item \command{R CMD build} now removes \file{src/*.mod} files on
      all platforms.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item New pointer protection C functions \code{R_PreserveInMSet} and
      \code{R_ReleaseFromMSet} have been introduced to replace
      \code{UNPROTECT_PTR}, which is not safe to mix with \code{UNPROTECT}
      (and with \code{PROTECT_WITH_INDEX}). Intended for use in parsers
      only.

      \item \code{NAMEDMAX} has been raised to 7 to allow further
      protection of intermediate results from (usually ill-advised)
      assignments in arguments to \code{BUILTIN} functions. Properly
      written package code should not be affected.

      \item \code{R_unif_index} is now considered to be part of the C API.

      \item \code{R_GetCurrentEnv()} allows C code to retrieve the current
      environment.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item Argument \code{compressed} of \code{untar()} is
      deprecated --- it is only used for external \code{tar} commands
      which increasingly for extraction auto-detect compression and
      ignore their \option{zjJ} flags.

      \item \code{var(f)} and hence \code{sd(f)} now give an error for
      \code{factor} arguments; they gave a deprecation warning since \R
      3.2.3, \PR{16564}.

      \item Package \pkg{tools}' \code{vignetteDepends()} has been
      deprecated (it called a function deprecated since Feb 2016), being
      partly replaced by newly exported \code{vignetteInfo()}.

      \item The \command{f77_f2c} script has been removed: it
      no longer sufficed to compile the \file{.f} files in \R.

      \item The deprecated legacy support of \command{make} macros such
      as \samp{CXX1X} has been removed: use the \samp{CXX11} forms
      instead.

      \item Make macro \samp{F77_VISIBILITY} is deprecated in favour of
      \samp{F_VISIBILITY}.

      \item Make macros \samp{F77}, \samp{FCPIFCPLAGS} and
      \samp{SHLIB_OPENMP_FCFLAGS} are deprecated in favour of \samp{FC},
      \samp{FPICFLAGS} and \samp{SHLIB_OPENMP_FFLAGS} respectively.

      \item \code{$.data.frame} had become an expensive version of
      the default method, so has been removed. (Thanks to Radford Neal
      for picking this up and to Duncan Murdoch for providing a patch.)
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{replayPlot(r)} now also works in the same \R session
      when \code{r} has been \dQuote{reproduced} from serialization,
      typically after saving to and reading from an RDS file.

      \item \code{substr()} and \code{substring()} now signal an error
      when the input is invalid UTF-8.

      \item \code{file.copy()} now works also when its argument \code{to}
      is of length greater than one.

      \item \code{mantelhaen.test()} no longer suffers from integer
      overflow in largish cases, thanks to Ben Bolker's \PR{17383}.

      \item Calling \code{setGeneric("foo")} in a package no longer
      fails when the enclosing environment of the implicit generic
      \code{foo()} is \code{.GlobalEnv}.

      \item \code{untar(file("<some>.tar.gz"), *)} now gives a better
      error message, suggesting to use \code{gzfile()} instead.

      \item Method dispatch uses more relevant environments when looking
      up class definitions.

      \item The documentation for \code{identify()} incorrectly claimed
      that the indices of identified points were returned in the order
      that the points were selected.  \code{identify()} now has a new
      argument \code{order} to allow the return value to include the
      order in which points were identified; the documentation has been
      updated.  Reported by Richard Rowe and Samuel Granjeaud.

      \item \code{order(...., decreasing=c(TRUE, FALSE))} could fail in
      some cases. Reported from StackOverflow via Karl Nordström.

      \item User macros in Rd files now accept empty and multi-line
      arguments.

      \item Changes in \code{print.*()}, thanks to Lionel Henry's
      patches in \PR{17398}:
      \itemize{
	\item Printing lists, pairlists or attributes containing calls
	with S3 class no longer evaluate those.

	\item Printing S4 objects within lists and pairlists dispatches
	with \code{show()} rather than \code{print()}, as with
	auto-printing.

	\item The indexing tags (names or \code{[[<n>]]}) of recursive
	data structures are now printed correctly in complex cases.

	\item Arguments supplied to \code{print()} are now properly
	forwarded to methods when printing lists, pairlists or
	attributes containing S3 objects.

	\item The print parameters are now preserved when printing S3
	objects or deparsing symbols and calls.  Previously, printing
	lists containing S3 objects or expressions would reset these
	parameters.

	\item Printing lists, pairlists or attributes containing
	functions now uses \code{srcref} attributes if present.
      }

      \item Calling \code{install.packages()} with a length zero
      \code{pkgs} argument now is a no-op (\PR{17422}).

      \item \code{unlist(x)} now returns a correct \code{factor} when
      \code{x} is a nested list with factor leaves, fixing \PR{12572}
      and \PR{17419}.

      \item The documentation \code{help(family)} gives more details
      about the \code{aic} component, thanks to Ben Bolker's prompting.

      \item The documentation for \code{attributes} and
      \code{`attributes<-`} now gives \code{x} as name of the first and
      main argument which the implementation has been requiring, fixing
      \PR{17434}.  For consistency, the first argument name is also
      changed from \code{obj} to \code{x} for \code{`mostattributes<-`}.

      \item \code{strwidth()} now uses \code{par("font")} as default
      font face (\PR{17352}).

      \item \code{plot(<table>, log="x")} no longer warns about \code{log}.

      \item The \code{print()} method for \code{"htest"} objects now
      formats the test statistic and parameter directly and hence no
      longer rounds to units \emph{before} the decimal point.  Consequently,
      printing of \code{t.test()} results with a small number of digits
      now shows non-large \code{df}'s to the full precision (\PR{17444}).

      \item \code{kruskal.test()} and \code{fligner.test()} no longer
      erroneously insist on numeric \code{g} group arguments (\PR{16719}).

      \item Printing a news db via the browser now does a much better
      job (\PR{17433}).

      \item \code{print.aov()} missed column names in the multivariate case
      due to misspelling (reported by Chris Andrews).

      \item \code{axis()} now creates valid \code{at} locations also for
      small subnormal number ranges in log scale plots.

      \item \code{format.POSIXlt()} now also recycles the \code{zone}
      and \code{gmtoff} list components to full length when needed,
      and its internal C code detects \code{have_zone} in more cases.
      In some cases, this changes its output to become compatible with
      \code{format.POSIXct()}.

      \item On Windows, \code{detectCores()} in package \pkg{parallel}
      now detects processors in all processor groups, not just the group
      \R is running in (impacts particularly systems with more than 64
      logical processors).  Reported by Arunkumar Srinivasan.

      \item On Windows, \code{socketSelect()} would hang with more than
      64 sockets, and hence \code{parallel::clusterApplyLB()} would hang
      with more than 64 workers.  Reported by Arunkumar Srinivasan.

      \item \code{as(1L, "double")} now does coerce (\PR{17457}).

      \item \code{lm.influence()}, \code{influence.measures()},
      \code{rstudent()} etc now work (more) correctly for multivariate
      models (\code{"mlm"}), thanks to (anonymous) stackoverflow remarks.

      \item \code{sample.int(2.9, *, replace=TRUE)} again behaves as
      documented and as in R < 3.0.0, namely identically to
      \code{sample.int(2, ..)}.% consider back porting to 3.5.x !

      \item Fixes to \code{convertColor()} for chromatic adaptation;
      thanks to Brodie Gaslam \PR{17473}.

      \item Using \code{\\Sexpr[stage=install]{..}} to create an
      \file{Rd} section no longer gives a warning in \command{R CMD
	check}; problem originally posted by Gábor Csárdi, then reported
      as \PR{17479} with a partial patch by Duncan Murdoch.

      \item Parse data now include a special node for equal assignment.

      \item \code{split.default()} no longer relies on \code{[[<-()}, so
      it behaves as expected when splitting an object by a factor with
      the empty string as one of its levels.  Thanks to Brad Friedman for
      the report.

      \item Line numbers in messages about \file{.Rd} files are now more
      reliable, thanks to a patch from Duncan Murdoch.

      \item In the \code{numeric} method for \code{all.equal()}, a
      numeric \code{scale} argument is now checked to be positive and
      allowed to be of length > 1. (The latter worked originally and
      with a warning in recent years).

      \item Deferred string conversions now record the \code{OutDec}
      option setting when not equal to the default.  Reported by Michael
      Sannella.

      \item When \code{y} is numeric and \code{f} a \code{factor},
      \code{plot(y ~ f)} nicely uses "y" and "f" as y- and x-labels.
      The more direct \code{boxplot(y ~ f)} now does too.  The new
      argument \code{ann = FALSE} may be used to suppress these.

      \item Subassignment to no/empty rows of a data frame is more
      consistent and typically a no-op in all cases instead of sometimes
      an error; part of Emil Bode's \PR{17483}.

      \item Calls like \code{formatC(*, zero.print = "< 0.001")} no
      longer give an error and are further improved via new optional
      argument \code{replace.zero}.  Reported by David Hugh-Jones.

      \item \code{methods::formalArgs("<fn>")} now finds the same
      function as \code{formals("<fn>")}, fixing Emil Bode's \PR{17499}.

      \item The \pkg{methods} package better handles duplicated class
      names across packages.

      \item The default method of \code{seq()} now avoids integer
      overflow, thanks to the report and "cumsum" patch of Suharto
      Anggono's \PR{17497}.

      \item \code{sub()} no longer loses encodings for non-ASCII
      replacements (\PR{17509}).

      \item Fix for rotated raster image on X11 device.  (Partial
      fix for \PR{17148};  thanks to Mikko Korpela).

      \item \code{formula(model.frame(frml, ..))} now returns \code{frml}
      in all cases, thanks to Bill Dunlap.   The previous behavior is
      available as \code{DF2formula(<model.frame>)}.

      \item \code{ar.ols()} also returns scalar \code{var.pred} in
      univariate case (\PR{17517}).

      \item \code{normalizePath()} now treats \code{NA} path as non-existent
      and normalizes it to \code{NA}.  \code{file.access()} treats \code{NA}
      file name as non-existent.  \code{file.edit()} and connection
      functions such as \code{file()} now treat \code{NA} file names as
      errors.

      \item The internal \code{regularize.values()} auxiliary of
      \code{approx()}, \code{splinefun()} etc now warns again when there
      are ties and the caller did not specify \code{ties}.  Further, it no
      longer duplicates \code{x} and \code{y} unnecessarily when \code{x}
      is already sorted (\PR{17515}).

      \item \code{strtoi("", base)} now gives \code{NA} on all platforms,
      following its documentation.  Reported by Michael Chirico.

      \item In the definition of an S4 class, prototype elements are
      checked against the slots of the class, with giving a prototype
      for an undefined slot now being an error.  (Reported by Bill
      Dunlap.)

      \item From \code{setClassUnion()}, if environment variable
      \env{_R_METHODS_SHOW_CHECKSUBCLASSES} is set
      to true, the internal \code{.checkSubclasses()} utility prints
      debugging info to see where it is used.

      \item \code{max.col(m)} with an \code{m} of zero columns now
      returns integer \code{NA} (instead of \code{1}).

      \item \code{axTicks()} no longer returns small \dQuote{almost zero}
      numbers (in exponential format) instead of zero, fixing Ilario
      Gelmetti's \PR{17534}.

      \item \code{isSymmetric(matrix(0, dimnames=list("A","b")))} is
      \code{FALSE} again, as always documented.

      \item The \code{cairo_pdf} graphics device (and other Cairo-based
      devices) now clip correctly to the right and bottom border.

      There was an off-by-one-pixel bug, reported by Lee Kelvin.

      \item \code{as.roman(3) <= 2:4} and all other comparisons now work,
      as do group \code{"Summary"} function calls such as
      \code{max(as.roman(sample(20)))} and \code{as.roman(NA)}.
      (Partly reported by Bill Dunlap in \PR{17542}.)

      \item \code{reformulate("x", response = "sin(y)")} no longer produces
      extra back quotes, \PR{17359}, and gains new optional argument
      \code{env}.

      \item When reading console input from \file{stdin} with re-encoding
      (\command{R --encoding=enc < input}) the code on a Unix-alike now
      ensures that each converted input line is terminated with a
      newline even if re-encoding fails.

      \item \code{as.matrix.data.frame()} now produces better strings from
      logicals, thanks to \PR{17548} from Gabe Becker.

      \item The S4 generic signature of \code{rowSums()},
      \code{rowMeans()}, \code{colSums()} and \code{colMeans()} is
      restricted to \code{"x"}.

      \item \code{match(x, tab)} now works for long \emph{character}
      vectors \code{x}, thanks to \PR{17552} by Andreas Kersting.

      \item Class unions are unloaded when their namespace is
      unloaded (\PR{17531}, adapted from a patch by Brodie Gaslam).

      \item \code{selectMethod()} is robust to ANY-truncation of method
      signatures (thanks to Herve Pages for the report).
    }
  }
}

\section{\Rlogo CHANGES IN R 3.5.3}{

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item Detection of flags for C++98/11/14/17 has been improved: in
      particular if CXX??STD is set, it is tried first with no
      additional flags.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item New macro \samp{F_VISIBILITY} as an alternative to
      \samp{F77_VISIBILITY}.  This will become the preferred form in
      \R 3.6.0.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{writeLines(readLines(fnam), fnam)} now works as expected,
      thanks to Peter Meissner's \PR{17528}.

      \item \code{setClassUnion()} no longer warns, but uses \code{message()}
      for now, when encountering \dQuote{non local} subclasses of class members.

      \item \code{stopifnot(exprs = T)} no longer fails.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.5.2}{

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item New macro \samp{CXX_VISIBILITY} analogous to
      \samp{C_VISIBILITY} (which several packages have been misusing for
      C++ code) for the default C++ compiler (but not necessarily one used
      for non-default C++ dialects like C++14).
    }
  }

  \subsection{TESTING}{
    \itemize{
      \item The random number generator tests in
      \file{tests/p-r-random-tests.R} no longer fail occasionally as
      they now randomly sample from \dQuote{certified} random seeds.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item The \code{"glm"} method of \code{drop1()} miscalculated the
      score test (\code{test="Rao"}) when the model contained an offset.

      \item Linear multiple empty models such as \code{lm(y ~ 0)}
      now have a correctly dimensioned empty coefficient matrix;
      reported by Brett Presnell.

      \item \code{vcov(<empty mlm>)} and hence \code{confint()} now
      work (via a consistency change in \code{summary.lm()}).

      \item \code{confint(<multiple lm()>)} now works correctly;
      reported on R-devel by Steven Pav.

      \item \code{quade.test()} now also works correctly when its
      arguments are not yet sorted along \code{groups}, fixing \PR{15842}.

      \item Installation on a Unix-alike tries harder to link to the
      \samp{pthread} library where required (rather than relying on
      OpenMP to provide it: configuring with \option{--disable-openmp}
      was failing on some Linux systems).

      \item The \code{data.frame} method for \code{print(x)} is fast now
      also for large data frames \code{x} and got an optional argument
      \code{max}, thanks to suggestions by Juan Telleria.

      \item \code{hist()} no longer integer overflows in very rare
      cases, fixing \PR{17450}.

      \item \code{untar()} ignored a character \code{compressed}
      argument: however many external \command{tar} programs ignore
      the flags which should have been set and automagically choose the
      compression type, and if appropriate \command{gzip} or
      \command{bzip2} compression would have been chosen from the magic
      header of the tarball.

      \item \code{zapsmall(x)} now works for more \dQuote{number-like} objects.

      \item The tools-internal function called from \command{R CMD
	INSTALL} now gets a \code{warnOption = 1} argument and only sets
      \code{options(warn = warnOption)} when that increases the warning
      level (\PR{17453}).

      \item Analogously, the tools-internal function called from \command{R CMD
	check} gets a \code{warnOption = 1} argument and uses the larger
      of that and \code{getOption("warn")}, also allowing to be run with
      increased warning level.

      \item Parse data now have deterministic parent nodes (\PR{16041}).

      \item Calling \code{match()} with length one \code{x} and POSIXlt
      \code{table} gave a segfault (\PR{17459}).

      \item Fork clusters could hang due to a race condition in cluster
      initialization (\code{makeCluster()}).

      \item \code{nextn(n)} now also works for larger \code{n} and no
      longer loops infinitely for e.g, \code{n <- 214e7}.

      \item \code{cooks.distance()} and \code{rstandard()} now work
      correctly for multiple linear models (\code{"mlm"}).

      \item \code{polym()} and corresponding \code{lm()} prediction now
      also work for a boundary "vector" case fixing \PR{17474},
      reported by Alexandre Courtiol.

      \item With a very large number of variables \code{terms()} could
      segfault (\PR{17480}).

      \item \code{cut(rep(0, 7))} now works, thanks to Joey Reid and
      Benjamin Tyner (\PR{16802}).

      \item \code{download.file(*, method = "curl", cacheOK = FALSE)}
      should work now on Windows, thanks to Kevin Ushey's patch in
      \PR{17323}.

      \item \code{duplicated(<dataframe with 'f'>)} now works, too,
      thanks to Andreas Kersting's \PR{17485}; ditto for
      \code{anyDuplicated()}.

      \item \code{legend(*, cex = 1:2)} now works less badly.

      \item The \code{print()} method for \code{POSIXct} and
      \code{POSIXlt} now correctly obeys \code{getOption("max.print")},
      fixing a long-standing typo, and it also gets a corresponding
      optional \code{max} argument.

      \item Unserialization of raw vectors serialized in ASCII
      representation now works correctly.

      \item \code{<data frame>[TRUE, <new>] <- list(c1, c2)} now works
      correctly, thanks to Suharto Anggono's \PR{15362} and Emil Bode's
      patch in \PR{17504}.

      \item \code{seq.int(*, by=by, length=n)} no longer wrongly
      \dQuote{drops fractional parts} when \code{by} is integer, thanks
      to Suharto Anggono's report \PR{17506}.

      \item Buffering is disabled for \code{file()} connections to
      non-regular files (like sockets), as well as \code{fifo()} and
      \code{pipe()} connections.  Fixes \PR{17470}, reported by Chris
      Culnane.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.5.1}{

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{file("stdin")} is no longer considered seekable.

      \item \code{dput()} and \code{dump()} are no longer truncating
      when \code{options(deparse.max.lines = *)} is set.

      \item Calls with an S3 class are no longer evaluated when printed,
      fixing part of \PR{17398}, thanks to a patch from Lionel Henry.

      \item Allow \code{file} argument of \command{Rscript} to include space
      even when it is first on the command line.

      \item \code{callNextMethod()} uses the generic from the
      environment of the calling method. Reported by Hervé Pagès with
      well documented examples.

      \item Compressed file connections are marked as blocking.

      \item \code{optim(*, lower = c(-Inf, -Inf))} no longer warns (and
      switches the method), thanks to a suggestion by John Nash.

      \item \code{predict(fm, newdata)} is now correct also for models
      where the formula has terms such as \code{splines::ns(..)} or
      \code{stats::poly(..)}, fixing \PR{17414}, based on a patch from
      Duncan Murdoch.

      \item \code{simulate.lm(glm(*, gaussian(link = <non-default>)))}
      has been corrected, fixing \PR{17415} thanks to Alex Courtiol.

      \item \code{unlist(x)} no longer fails in some cases of nested
      empty lists.  Reported by Steven Nydick.

      \item \code{qr.coef(qr(<all 0, w/ colnames>))} now works.
      Reported by Kun Ren.

      \item The radix sort is robust to vectors with >1 billion elements
      (but long vectors are still unsupported). Thanks to Matt Dowle for
      the fix.

      \item Terminal connections (e.g., stdin) are no longer
      buffered. Fixes \PR{17432}.

      \item \code{deparse(x)}, \code{dput(x)} and \code{dump()} now
      respect \code{c()}'s argument names \code{recursive} and
      \code{use.names}, e.g., for \code{x <- setNames(0, "recursive")},
      thanks to Suharto Anggono's \PR{17427}.

      \item Unbuffered connections now work with encoding conversion.
      Reported by Stephen Berman.

      \item \file{.Renviron} on Windows with \command{Rgui} is again by
      default searched for in user documents directory when invoked
      \emph{via} the launcher icon.  Reported by Jeroen Ooms.

      \item \code{printCoefmat()} now also works with explicit
      \code{right=TRUE}.

      \item \code{print.noquote()} now also works with explicit
      \code{quote=FALSE}.

      \item The default method for \code{pairs(.., horInd=*, verInd=*)}
      now gets the correct order, thanks to reports by Chris Andrews and
      Gerrit Eichner.  Additionally, when \code{horInd} or \code{verInd}
      contain only a subset of variables, all the axes are labeled
      correctly now.

      \item \code{agrep("..|..", .., fixed=FALSE)} now matches when it
      should, thanks to a reminder by Andreas Kolter.

      \item \code{str(ch)} now works for more invalid multibyte strings.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.5.0}{

  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item All packages are by default byte-compiled on installation.
      This makes the installed packages larger (usually marginally so)
      and may affect the format of messages and tracebacks (which often
      exclude \code{.Call} and similar).
    }
  }

  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{factor()} now uses \code{order()} to sort its levels,
      rather than \code{sort.list()}.  This allows \code{factor()} to
      support custom vector-like objects if methods for the appropriate
      generics are defined.  It has the side effect of making
      \code{factor()} succeed on empty or length-one non-atomic
      vector(-like) types (e.g., \code{"list"}), where it failed before.

      \item \code{diag()} gets an optional \code{names} argument: this
      may require updates to packages defining S4 methods for it.

      \item \code{chooseCRANmirror()} and \code{chooseBioCmirror()} no
      longer have a \code{useHTTPS} argument, not needed now all \R
      builds support \samp{https://} downloads.

      \item New \code{summary()} method for \code{warnings()} with a
      (somewhat experimental) \code{print()} method.

      \item (\pkg{methods} package.) \code{.self} is now automatically
      registered as a global variable when registering a reference class
      method.

      \item \code{tempdir(check = TRUE)} recreates the \code{tempdir()}
      directory if it is no longer valid (e.g.\sspace{}because some
      other process has cleaned up the \file{/tmp} directory).

      \item New \code{askYesNo()} function and \code{"askYesNo"} option
      to ask the user binary response questions in a customizable but
      consistent way.  (Suggestion of \PR{17242}.)

      \item New low level utilities \code{...elt(n)} and \code{...length()}
      for working with \code{...} parts inside a function.

      \item \code{isTRUE()} is more tolerant and now true
      in  \preformatted{   x <- rlnorm(99)
   isTRUE(median(x) == quantile(x)["50\%"])}
      New function \code{isFALSE()} defined analogously to \code{isTRUE()}.

      \item The default symbol table size has been increased from 4119
      to 49157; this may improve the performance of symbol resolution
      when many packages are loaded.  (Suggested by Jim Hester.)

      \item \code{line()} gets a new option \code{iter = 1}.

      \item Reading from connections in text mode is buffered,
      significantly improving the performance of \code{readLines()}, as
      well as \code{scan()} and \code{read.table()}, at least when
      specifying \code{colClasses}.

      \item \code{order()} is smarter about picking a default sort
      \code{method} when its arguments are objects.

      \item \code{available.packages()} has two new arguments which
      control if the values from the per-session repository cache are
      used (default true, as before) and if so how old cached values can
      be used (default one hour).

      These arguments can be passed from \code{install.packages()},
      \code{update.packages()} and functions calling that: to enable
      this \code{available.packages()}, \code{packageStatus()} and
      \code{download.file()} gain a \code{\dots} argument.

      \item \code{packageStatus()}'s \code{upgrade()} method no longer
      ignores its \code{\dots} argument but passes it to
      \code{install.packages()}.

      \item \code{installed.packages()} gains a \code{\dots} argument to
      allow arguments (including \code{noCache}) to be passed from
      \code{new.packages()}, \code{old.packages()},
      \code{update.packages()} and \code{packageStatus()}.

      \item \code{factor(x, levels, labels)} now allows duplicated
      \code{labels} (not duplicated \code{levels}!).  Hence you can map
      different values of \code{x} to the same level directly.

      \item Attempting to use \code{names<-()} on an S4 derivative of a
      basic type no longer emits a warning.

      \item The \code{list} method of \code{within()} gains an option
      \code{keepAttrs = FALSE} for some speed-up.

      \item \command{system()} and \command{system2()} now allow the
      specification of a maximum elapsed time (\sQuote{timeout}).

      \item \code{debug()} supports debugging of methods on any object
      of S4 class \code{"genericFunction"}, including group generics.

      \item Attempting to increase the length of a variable containing
      \code{NULL} using \code{length()<-} still has no effect on the
      target variable, but now triggers a warning.

      \item \code{type.convert()} becomes a generic function, with
      additional methods that operate recursively over list and
      \code{data.frame} objects. Courtesy of Arni Magnusson
      (\PR{17269}).

      \item \code{lower.tri(x)} and \code{upper.tri(x)} only needing
      \code{dim(x)} now work via new functions \code{.row()} and
      \code{.col()}, so no longer call \code{as.matrix()} by default in
      order to work efficiently for all kind of matrix-like objects.

      \item \code{print()} methods for \code{"xgettext"} and
      \code{"xngettext"} now use \code{encodeString()} which keeps,
      e.g.\sspace{}\code{"\n"}, visible.  (Wish of \PR{17298}.)

      \item \code{package.skeleton()} gains an optional \code{encoding}
      argument.

      \item \code{approx()}, \code{spline()}, \code{splinefun()} and
      \code{approxfun()} also work for long vectors.

      %% one item with several paragraphs
      \item \code{deparse()} and \code{dump()} are more useful for S4
      objects, \code{dput()} now using the same internal C code instead
      of its previous imperfect workaround R code.  S4 objects now
      typically deparse perfectly, i.e., can be recreated identically
      from deparsed code.

      \code{dput()}, \code{deparse()} and \code{dump()} now print the
      \code{names()} information only once, using the more readable
      \code{(tag = value)} syntax, notably for \code{list()}s, i.e.,
      including data frames.

      These functions gain a new control option \code{"niceNames"} (see
      \code{.deparseOpts()}), which when set (as by default) also uses
      the \code{(tag = value)} syntax for atomic vectors.  On the other
      hand, without deparse options \code{"showAttributes"} and
      \code{"niceNames"}, names are no longer shown also for lists.
      \code{as.character(list(  c (one = 1)))} now includes the name, as
      \code{as.character(list(list(one = 1)))} has always done.

      \code{m:n} now also deparses nicely when \eqn{m > n}.

      The \code{"quoteExpressions"} option, also part of \code{"all"},
      no longer \code{quote()}s formulas as that may not re-parse
      identically.  (\PR{17378})

      \item If the option \code{setWidthOnResize} is set and \code{TRUE},
      \R run in a terminal using a recent \code{readline} library will
      set the \code{width} option when the terminal is
      resized.  Suggested by Ralf Goertz.

      \item If multiple \code{on.exit()} expressions are set using
      \code{add = TRUE} then all expressions will now be run even if one
      signals an error.

      \item \code{mclapply()} gets an option \code{affinity.list} which
      allows more efficient execution with heterogeneous processors,
      thanks to Helena Kotthaus.

      \item The \code{character} methods for \code{as.Date()} and
      \code{as.POSIXlt()} are more flexible \emph{via} new arguments
      \code{tryFormats} and \code{optional}: see their help pages.

      \item \code{on.exit()} gains an optional argument \code{after}
      with default \code{TRUE}. Using \code{after = FALSE} with
      \code{add = TRUE} adds an exit expression before any
      existing ones. This way the expressions are run in a first-in
      last-out fashion. (From Lionel Henry.)

      \item On Windows, \code{file.rename()} internally retries the
      operation in case of error to attempt to recover from possible
      anti-virus interference.

      \item Command line completion on \samp{::} now also includes
      lazy-loaded data.

      \item If the \env{TZ} environment variable is set when date-time
      functions are first used, it is recorded as the session default
      and so will be used rather than the default deduced from the OS
      if \env{TZ} is subsequently unset.

      \item There is now a \code{[} method for class \code{"DLLInfoList"}.

      \item \code{glm()} and \code{glm.fit} get the same
      \code{singular.ok = TRUE} argument that \code{lm()} has had
      forever.  As a consequence, in \code{glm(*, method = <your_own>)},
      user specified methods need to accept a \code{singular.ok}
      argument as well.

      \item \code{aspell()} gains a filter for Markdown (\file{.md} and
      \file{.Rmd}) files.

      \item \code{intToUtf8(multiple = FALSE)} gains an argument to
      allow surrogate pairs to be interpreted.

      \item The maximum number of DLLs that can be loaded into R
      e.g.\sspace{}\emph{via} \code{dyn.load()} has been increased up to 614
      when the OS limit on the number of open files allows.

      \item \code{Sys.timezone()} on a Unix-alike caches the value at
      first use in a session: \emph{inter alia} this means that setting
      \env{TZ} later in the session affects only the \emph{current} time
      zone and not the \emph{system} one.

      \code{Sys.timezone()} is now used to find the system timezone to
      pass to the code used when \R is configured with
      \option{--with-internal-tzcode}.

      \item When \code{tar()} is used with an external command which is
      detected to be GNU \command{tar} or libarchive \command{tar} (aka
      \command{bsdtar}), a different command-line is generated to
      circumvent line-length limits in the shell.

      \item \code{system(*, intern = FALSE)}, \code{system2()} (when not
      capturing output), \code{file.edit()} and \code{file.show()} now
      issue a warning when the external command cannot be executed.

      \item The \dQuote{default} (\code{"lm"} etc) methods of
      \code{vcov()} have gained new optional argument \code{complete =
      TRUE} which makes the \code{vcov()} methods more consistent with
      the \code{coef()} methods in the case of singular designs.  The
      former (back-compatible) behavior is given by \code{vcov(*,
	complete = FALSE)}.

      \item \code{coef()} methods (for \code{lm} etc) also gain a
      \code{complete = TRUE} optional argument for consistency with
      \code{vcov()}. \cr
      For \code{"aov"}, both \code{coef()} and \code{vcov()} methods
      remain back-compatibly consistent, using the \emph{other} default,
      \code{complete = FALSE}.

      \item \code{attach(*, pos = 1)} is now an error instead of a
      warning.

      \item New function \code{getDefaultCluster()} in package
      \pkg{parallel} to get the default cluster set via
      \code{setDefaultCluster()}.

      \item \code{str(x)} for atomic objects \code{x} now treats both
      cases of \code{is.vector(x)} similarly, and hence much less often
      prints \code{"atomic"}.  This is a slight non-back-compatible
      change producing typically both more informative and shorter
      output.

      \item \code{gc()} gets new argument \code{full}.

      \item \code{write.dcf()} gets optional argument \code{useBytes}.

      \item New, partly experimental \code{packageDate()} which tries to
      get a valid \code{"Date"} object from a package \file{DESCRIPTION}
      file, thanks to suggestions in \PR{17324}.

      \item \code{tools::resaveRdaFiles()} gains a \code{version}
      argument, for use when packages should remain compatible with
      earlier versions of \R.

      \item \code{ar.yw(x)} and hence by default \code{ar(x)} now work
      when \code{x} has \code{NA}s, mostly thanks to a patch by Pavel
      Krivitsky in \PR{17366}.   The \code{ar.yw.default()}'s AIC
      computations have become more efficient by using
      \code{determinant()}.

      \item New \code{warnErrList()} utility (from package \pkg{nlme},
      improved).

      \item By default the (arbitrary) signs of the loadings from
      \code{princomp()} are chosen so the first element is non-negative.

      \item If \option{--default-packages} is not used, then
      \command{Rscript} now checks the environment variable
      \env{R_SCRIPT_DEFAULT_PACKAGES}. If this is set, then it takes
      precedence over \env{R_DEFAULT_PACKAGES}. If default packages are
      not specified on the command line or by one of these environment
      variables, then \command{Rscript} now uses the same default
      packages as \command{R}. For now, the previous behavior of not
      including \pkg{methods} can be restored by setting the environment
      variable \env{R_SCRIPT_LEGACY} to \samp{yes}.

      \item When a package is found more than once, the warning from
      \code{find.package(*, verbose=TRUE)} lists all library locations.

      \item POSIXt objects can now also be rounded or truncated to month
      or year.

      \item \code{stopifnot()} can be used alternatively via new argument
      \code{exprs} which is nicer and useful when testing several
      expressions in one call.

      \item The environment variable \env{R_MAX_VSIZE} can now be used
      to specify the maximal vector heap size. On macOS, unless specified
      by this environment variable, the maximal vector heap size is set to
      the maximum of 16GB and the available physical memory. This is to
      avoid having the \command{R} process killed when macOS over-commits
      memory.

      \item \code{sum(x)} and \code{sum(x1, x2, .., x<N>)} with many or
      long logical or integer vectors no longer overflows (and returns
      \code{NA} with a warning), but returns \code{double} numbers in
      such cases.

      \item Single components of \code{"POSIXlt"} objects can now be
      extracted and replaced via \code{[} indexing with 2 indices.

      \item S3 method lookup now searches the namespace registry after
      the top level environment of the calling environment.

      \item Arithmetic sequences created by \code{1:n},
      \code{seq_along}, and the like now use compact internal
      representations via the \code{ALTREP} framework.  Coercing integer
      and numeric vectors to character also now uses the \code{ALTREP}
      framework to defer the actual conversion until first use.

      \item Finalizers are now run with interrupts suspended.

      \item \code{merge()} gains new option \code{no.dups} and by
      default suffixes the second of two duplicated column names,
      thanks to a proposal by Scott Ritchie (and Gabe Becker).

      \item \code{scale.default(x, center, scale)} now also allows
      \code{center} or \code{scale} to be \dQuote{numeric-alike}, i.e.,
      such that \code{as.numeric(.)} coerces them correctly.  This also
      eliminates a wrong error message in such cases.

      \item \code{par*apply} and \code{par*applyLB} gain an optional
      argument \code{chunk.size} which allows to specify the granularity of
      scheduling.

      \item Some \code{as.data.frame()} methods, notably the
      \code{matrix} one, are now more careful in not accepting
      duplicated or \code{NA} row names, and by default produce unique
      non-NA row names.  This is based on new function
      \code{.rowNamesDF(x, make.names = *) <- rNms} where the logical
      argument \code{make.names} allows to specify \emph{how} invalid
      row names \code{rNms} are handled.  \code{.rowNamesDF()} is a
      \dQuote{workaround} compatible default.

      \item R has new serialization format (version 3) which supports
      custom serialization of \code{ALTREP} framework objects.  These
      objects can still be serialized in format 2, but less efficiently.
      Serialization format 3 also records the current native encoding of
      unflagged strings and converts them when de-serialized in R
      running under different native encoding.  Format 3 comes with new
      serialization magic numbers (RDA3, RDB3, RDX3).  Format 3 can be
      selected by \code{version = 3} in \code{save()},
      \code{serialize()} and \code{saveRDS()}, but format 2 remains the
      default for all serialization and saving of the workspace.
      Serialized data in format 3 cannot be read by versions of \R prior
      to version 3.5.0.

      \item The \code{"Date"} and \dQuote{date-time} classes
      \code{"POSIXlt"} and \code{"POSIXct"} now have a working
      \code{length<-()} method, as wished in \PR{17387}.

      \item \code{optim(*, control = list(warn.1d.NelderMead = FALSE))}
      allows to turn off the warning when applying the default
      \code{"Nelder-Mead"} method to 1-dimensional problems.

      \item \code{matplot(.., panel.first = .)} etc now work, as
      \code{log} becomes explicit argument and \code{...} is passed to
      \code{plot()} unevaluated, as suggested by Sebastian Meyer in \PR{17386}.

      \item Interrupts can be suspended while evaluating an expression
      using \code{suspendInterrupts}.  Subexpression can be evaluated
      with interrupts enabled using \code{allowInterrupts}.  These
      functions can be used to make sure cleanup handlers cannot be
      interrupted.

      \item \R 3.5.0 includes a framework that allows packages to
      provide alternate representations of basic \R objects
      (\code{ALTREP}).  The framework is still experimental and may
      undergo changes in future \R releases as more experience is
      gained. For now, documentation is provided in
      \url{https://svn.r-project.org/R/branches/ALTREP/ALTREP.html}.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \code{install.packages()} for source packages now has the
      possibility to set a \sQuote{timeout} (elapsed-time limit).  For
      serial installs this uses the \code{timeout} argument of
      \code{system2()}: for parallel installs it requires the
      \command{timeout} utility command from GNU \pkg{coreutils}.

      \item It is now possible to set \sQuote{timeouts} (elapsed-time
      limits) for most parts of \command{R CMD check} \emph{via}
      environment variables documented in the \sQuote{R Internals}
      manual.

      \item The \sQuote{BioC extra} repository which was dropped from
      Bioconductor 3.6 and later has been removed from
      \code{setRepositories()}.  This changes the mapping for 6--8 used
      by \code{setRepositories(ind=)}.

      \item \command{R CMD check} now also applies the settings of
      environment variables \env{_R_CHECK_SUGGESTS_ONLY_} and
      \env{_R_CHECK_DEPENDS_ONLY_} to the re-building of vignettes.

      \item \command{R CMD check} with environment variable
      \env{_R_CHECK_DEPENDS_ONLY_} set to a true value makes
      test-suite-management packages available and (for the time being)
      works around a common omission of \CRANpkg{rmarkdown} from the
      \samp{VignetteBuilder} field.
    }
  }

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item Support for a system Java on macOS has been
      removed --- install a fairly recent Oracle Java (see \sQuote{R
	Installation and Administration} §C.3.2).

      \item \command{configure} works harder to set additional flags in
      \samp{SAFE_FFLAGS} only where necessary, and to use flags which
      have little or no effect on performance.

      In rare circumstances it may be necessary to override the
      setting of \samp{SAFE_FFLAGS}.

      \item C99 functions \code{expm1}, \code{hypot}, \code{log1p} and
      \code{nearbyint} are now required.

      \item \command{configure} sets a \option{-std} flag for the C++
      compiler for all supported C++ standards (e.g., \option{-std=gnu++11}
      for the C++11 compiler).   Previously this was not done in a few
      cases where the default standard passed the tests made
      (e.g.\sspace\command{clang 6.0.0} for C++11).
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item \sQuote{Writing R Extensions} documents macros
      \code{MAYBE_REFERENCED}, \code{MAYBE_SHARED} and
      \code{MARK_NOT_MUTABLE} that should be used by package \code{C}
      code instead \code{NAMED} or \code{SET_NAMED}.

      \item The object header layout has been changed to support merging
      the \code{ALTREP} branch. This requires re-installing packages
      that use compiled code.

      \item \sQuote{Writing R Extensions} now documents the
      \code{R_tryCatch}, \code{R_tryCatchError}, and
      \code{R_UnwindProtect} functions.

      \item \code{NAMEDMAX} has been raised to 3 to allow protection of
      intermediate results from (usually ill-advised) assignments in
      arguments to \code{BUILTIN} functions. Package \code{C} code using
      \code{SET_NAMED} may need to be revised.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item \code{Sys.timezone(location = FALSE)} is defunct, and is
      ignored (with a warning).

      \item \code{methods:::bind_activation()} is defunct now; it
      typically has been unneeded for years.

      The undocumented \sQuote{hidden} objects \code{.__H__.cbind} and
      \code{.__H__.rbind} in package \pkg{base} are deprecated (in
      favour of \code{cbind} and \code{rbind}).

      \item The declaration of \code{pythag()} in \file{Rmath.h} has
      been removed --- the entry point has not been provided since \R
      2.14.0.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{printCoefmat()} now also works without column names.

      \item The S4 methods on \code{Ops()} for the \code{"structure"} class no
      longer cause infinite recursion when the structure is not an S4 object.

      \item \code{nlm(f, ..)} for the case where \code{f()} has a
      \code{"hessian"} attribute now computes
      \eqn{LL' = H + \mu I}{LL' = H + µI} correctly.  (\PR{17249}).

      \item An S4 method that \dQuote{rematches} to its generic and
      overrides the default value of a generic formal argument to
      \code{NULL} no longer drops the argument from its formals.

      \item \code{Rscript} can now accept more than one argument given on
      the \samp{#!} line of a script. Previously, one could only pass a
      single argument on the \samp{#!} line in Linux.

      \item Connections are now written correctly with encoding
      \code{"UTF-16LE"}.  (\PR{16737}).

      \item Evaluation of \code{..0} now signals an error.  When
      \code{..1} is used and \code{...} is empty, the error message is
      more appropriate.

      \item (Windows mainly.)  Unicode code points which require
      surrogate pairs in UTF-16 are now handled.  All systems should
      properly handle surrogate pairs, even those systems that do not
      need to make use of them.  (\PR{16098})

      \item \code{stopifnot(e, e2, ...)} now evaluates the
      expressions sequentially and in case of an error or warning shows
      the relevant expression instead of the full \code{stopifnot(..)}
      call.

      \item \code{path.expand()} on Windows now accepts paths specified as
      UTF-8-encoded character strings even if not representable in the
      current locale.  (\PR{17120})

      \item \code{line(x, y)} now correctly computes the medians of the
      left and right group's x-values and in all cases reproduces
      straight lines.

      \item Extending S4 classes with slots corresponding to special
      attributes like \code{dim} and \code{dimnames} now works.

      \item Fix for \code{legend()} when \code{fill} has multiple values
      the first of which is \code{NA} (all colours used to default to
      \code{par(fg)}).  (\PR{17288})

      \item \code{installed.packages()} did not remove the cached value
      for a library tree that had been emptied (but would not use the
      old value, just waste time checking it).

      \item The documentation for \code{installed.packages(noCache = TRUE)}
      incorrectly claimed it would refresh the cache.

      \item \code{aggregate(<data.frame>)} no longer uses spurious names
      in some cases.  (\PR{17283})

      \item \code{object.size()} now also works for long vectors.

      \item \code{packageDescription()} tries harder to solve
      re-encoding issues, notably seen in some Windows locales.  This
      fixes the \code{citation()} issue in \PR{17291}.

      \item \code{poly(<matrix>, 3)} now works, thanks to prompting by
      Marc Schwartz.

      \item \code{readLines()} no longer segfaults on very large files
      with embedded \code{'\0'} (aka \sQuote{nul}) characters.
      (\PR{17311})

      \item \code{ns()} (package \pkg{splines}) now also works for a
      single observation.  \code{interpSpline()} gives a more friendly
      error message when the number of points is less than four.

      \item \code{dist(x, method = "canberra")} now uses the correct
      definition; the result may only differ when \code{x} contains
      values of differing signs, e.g.\sspace{}not for 0-1 data.

      \item \code{methods:::cbind()} and \code{methods:::rbind()} avoid
      deep recursion, thanks to Suharto Anggono via \PR{17300}.

      \item Arithmetic with zero-column data frames now works more
      consistently; issue raised by Bill Dunlap.

      Arithmetic with data frames gives a data frame for \code{^} (which
      previously gave a numeric matrix).

      \item \code{pretty(x, n)} for large \code{n} or large
      \code{diff(range(x))} now works better (though
      it was never meant for large \code{n}); internally it uses the
      same rounding fuzz (1e-10) as \code{seq.default()} --- as it did up
      to 2010-02-03 when both were 1e-7.

      \item Internal C-level \code{R_check_class_and_super()} and hence
      \code{R_check_class_etc()} now also consider non-direct super
      classes and hence return a match in more cases.  This e.g., fixes
      behaviour of derived classes in package \CRANpkg{Matrix}.

      \item Reverted unintended change in behavior of \code{return}
      calls in \code{on.exit} expressions introduced by stack unwinding
      changes in \R 3.3.0.

      \item Attributes on symbols are now detected and prevented; attempt
      to add an attribute to a symbol results in an error.

      \item \code{fisher.test(*, workspace = <n>)} now may also increase
      the internal stack size which allows larger problem to be solved,
      fixing \PR{1662}.

      \item The \pkg{methods} package no longer directly copies slots
      (attributes) into a prototype that is of an \dQuote{abnormal}
      (reference) type, like a symbol.

      \item The \pkg{methods} package no longer attempts to call
      \code{length<-()} on \code{NULL} (during the bootstrap process).

      \item The \pkg{methods} package correctly shows methods when there
      are multiple methods with the same signature for the same generic
      (still not fully supported, but at least the user can see them).

      \item \code{sys.on.exit()} is now always evaluated in the right
      frame. (From Lionel Henry.)

      \item \code{seq.POSIXt(*, by = "<n> DSTdays")} now should work
      correctly in all cases and is faster.  (\PR{17342})

      \item \code{.C()} when returning a logical vector now always maps
      values other than FALSE and NA to TRUE (as documented).

      \item Subassignment with zero length vectors now coerces as
      documented (\PR{17344}).\cr
      Further, \code{x <- numeric(); x[1] <- character()} now signals
      an error \sQuote{\verb{replacement has length zero}} (or a
      translation of that) instead of doing nothing.

      \item (Package \pkg{parallel}.)  \code{mclapply()}, \code{pvec()}
      and \code{mcparallel()} (when \code{mccollect()} is used to
      collect results) no longer leave zombie processes behind.

      \item \code{R CMD INSTALL <pkg>} now produces the intended error
      message when, e.g., the \code{LazyData} field is invalid.

      \item \code{as.matrix(dd)} now works when the data frame \code{dd}
      contains a column which is a data frame or matrix, including a
      0-column matrix/d.f. .

      \item \code{mclapply(X, mc.cores)} now follows its documentation
      and calls \code{lapply()} in case \code{mc.cores = 1} also in the
      case \code{mc.preschedule} is false.  (\PR{17373})

      \item \code{aggregate(<data.frame>, drop=FALSE)} no longer calls
      the function on <empty> parts but sets corresponding results to
      \code{NA}.  (Thanks to Suharto Anggono's patches in \PR{17280}).

      \item The \code{duplicated()} method for data frames is now based
      on the \code{list} method (instead of string coercion).  Consequently
      \code{unique()} is better distinguishing data frame rows, fixing
      \PR{17369} and \PR{17381}.  The methods for matrices and arrays
      are changed accordingly.

      \item Calling \code{names()} on an S4 object derived from
      \code{"environment"} behaves (by default) like calling
      \code{names()} on an ordinary environment.

      \item \code{read.table()} with a non-default separator now
      supports quotes following a non-whitespace character, matching the
      behavior of \code{scan()}.

      \item \code{parLapplyLB} and \code{parSapplyLB} have been fixed to do
      load balancing (dynamic scheduling).  This also means that results of
      computations depending on random number generators will now really be
      non-reproducible, as documented.

      \item Indexing a list using dollar and empty string (\code{l$""})
      returns NULL.

      \item Using \code{ \\usage\{ data(<name>, package="<pkg>") \} }
      no longer produces \command{R CMD check} warnings.

      \item \code{match.arg()} more carefully chooses the environment
      for constructing default \code{choices}, fixing \PR{17401} as
      proposed by Duncan Murdoch.

      \item Deparsing of consecutive \code{!} calls is now consistent
      with deparsing unary \code{-} and \code{+} calls and creates code
      that can be reparsed exactly; thanks to a patch by Lionel Henry in
      \PR{17397}.  (As a side effect, this uses fewer parentheses in
      some other deparsing involving \code{!} calls.)
    }
  }
}

\section{\Rlogo CHANGES IN R 3.4.4}{

  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{Sys.timezone()} tries more heuristics on Unix-alikes and so
      is more likely to succeed (especially on Linux).  For the slowest
      method, a warning is given recommending that \env{TZ} is set to
      avoid the search.

      \item The version of LAPACK included in the sources has been
      updated to 3.8.0 (for the routines used by \R, a very minor bug-fix
      change).

      \item \code{parallel::detectCores(logical = FALSE)} is ignored on
      Linux systems, since the information is not available with
      virtualized OSes.
    }
  }

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item \command{configure} will use \command{pkg-config} to find the
      flags to link to \code{jpeg} if available (as it should be for the
      recently-released \code{jpeg-9c} and \code{libjpeg-turbo}).  (This
      amends the code added in \R 3.3.0 as the module name in
      \code{jpeg-9c} is not what that tested for.)
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item \code{Sys.timezone(location = FALSE)} (which was a stop-gap
      measure for Windows long ago) is deprecated.  It no longer returns
      the value of environment variable \env{TZ} (usually a location).

      \item Legacy support of \command{make} macros such as \samp{CXX1X}
      is formally deprecated: use the \samp{CXX11} forms instead.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{power.prop.test()} now warns when it cannot solve the
      problem, typically because of impossible constraints. (\PR{17345})

      \item \code{removeSource()} no longer erroneously removes
      \code{NULL} in certain cases, thanks to Dénes Tóth.

      \item \code{nls(`NO [mol/l]` ~ f(t))} and \code{nls(y ~ a)} now
      work.  (Partly from \PR{17367})

      \item \command{R CMD build} checks for GNU \command{cp} rather
      than assuming Linux has it.  (\PR{17370} says \sQuote{Alpine
	Linux} does not.)

      \item Non-UTF-8 multibyte character handling fixed more
      permanently (\PR{16732}).

      \item \code{sum(<large ints>, <stuff>)} is more consistent.
      (\PR{17372})

      \item \code{rf()} and \code{rbeta()} now also work correctly when
      \code{ncp} is not scalar, notably when (partly) \code{NA}.
      (\PR{17375})

      \item \code{is.na(NULL)} no longer warns.  (\PR{16107})

      \item \command{R CMD INSTALL} now correctly sets C++ compiler flags
      when all source files are in sub-directories of \file{src}.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.4.3}{

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item A workaround has been added for the changes in location of
      time-zone files in macOS 10.13 \sQuote{High Sierra} and
      again in 10.13.1, so the default time zone is deduced
      correctly from the system setting when \R is configured with
      \option{--with-internal-tzcode} (the default on macOS).

      \item \command{R CMD javareconf} has been updated to recognize the
      use of a Java 9 SDK on macOS.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{raw(0) & raw(0)} and \code{raw(0) | raw(0)}
      again return \code{raw(0)} (rather than \code{logical(0)}).

      \item \code{intToUtf8()} converts integers corresponding to
      surrogate code points to \code{NA} rather than invalid UTF-8, as
      well as values larger than the current Unicode maximum of
      \code{0x10FFFF}.  (This aligns with the current RFC3629.)

      \item Fix calling of methods on S4 generics that dispatch on
      \code{\dots} when the call contains \code{\dots}.

      \item Following Unicode \sQuote{Corrigendum 9}, the UTF-8
      representations of U+FFFE and U+FFFF are now regarded as valid by
      \code{utf8ToInt()}.

      \item \code{range(c(TRUE, NA), finite = TRUE)} and similar no longer
      return \code{NA}. (Reported by Lukas Stadler.)

      \item The self starting function \code{attr(SSlogis, "initial")}
      now also works when the y values have exact minimum zero and is
      slightly changed in general, behaving symmetrically in the y range.

      \item The printing of named raw vectors is now formatted nicely as
      for other such atomic vectors, thanks to Lukas Stadler.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.4.2}{

  \subsection{NEW FEATURES}{
    \itemize{
      \item Setting the \code{LC_ALL} category in \code{Sys.setlocale()}
      invalidates any cached locale-specific day/month names and the
      AM/PM indicator for \code{strptime()} (as setting \code{LC_TIME}
      has since \R 3.1.0).

      \item The version of LAPACK included in the sources has been
      updated to 3.7.1, a bug-fix release.

      \item The default for \code{tools::write_PACKAGES(rds_compress=)}
      has been changed to \code{"xz"} to match the compression used by
      \acronym{CRAN}.

      \item \code{c()} and \code{unlist()} are now more efficient in
      constructing the \code{names(.)} of their return value, thanks to
      a proposal by Suharto Anggono.  (\PR{17284})
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} checks for and \command{R CMD build}
      corrects CRLF line endings in shell scripts \command{configure}
      and \command{cleanup} (even on Windows).
    }
  }

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item The order of selection of OpenMP flags has been changed:
      Oracle Developer Studio 12.5 accepts \option{-fopenmp} and
      \option{-xopenmp} but only the latter enables OpenMP so it is now
      tried first.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{within(List, rm(x1, x2))} works correctly again,
      including when \code{List[["x2"]]} is \code{NULL}.

      \item \code{regexec(pattern, text, *)} now applies
      \code{as.character(.)} to its first two arguments, as documented.

      \item \code{write.table()} and related functions,
      \code{writeLines()}, and perhaps other functions writing text to
      connections did not signal errors when the writes failed,
      e.g.\sspace{}due to a disk being full.  Errors will now be
      signalled if detected during the write, warnings if detected when
      the connection is closed.  (\PR{17243})

      \item \code{rt()} assumed the \code{ncp} parameter was a scalar.  (\PR{17306})

      \item \code{menu(choices)} with more than 10 choices which easily
      fit into one \code{getOption("width")}-line no longer erroneously
      repeats choices.  (\PR{17312})

      \item \code{length()<-} on a pairlist succeeds.
      (\url{https://stat.ethz.ch/pipermail/r-devel/2017-July/074680.html})

      \item Language objects such as \code{quote(("\n"))} or \R
      functions are correctly printed again, where \R 3.4.1 accidentally
      duplicated the backslashes.

      \item Construction of \code{names()} for very large objects in
      \code{c()} and \code{unlist()} now works, thanks to Suharto
      Anggono's patch proposals in \PR{17292}.

      \item Resource leaks (and similar) reported by Steve Grubb fixed.
      (\PR{17314}, \PR{17316}, \PR{17317}, \PR{17318}, \PR{17319}, \PR{17320})

      \item \code{model.matrix(~1, mf)} now gets the row names from
      \code{mf} also when they differ from \code{1:nrow(mf)}, fixing
      \PR{14992} thanks to the suggestion by Sebastian Meyer.

      \item \code{sigma(fm)} now takes the correct denominator degrees
      of freedom for a fitted model with \code{NA} coefficients.  (\PR{17313})

      \item \code{hist(x, "FD")} no longer \dQuote{dies} with a somewhat
      cryptic error message when \code{x} has extreme outliers or
      \code{IQR()} zero:  \code{nclass.FD(x)} tries harder to find a
      robust bin width \eqn{h} in the latter case, and
      \code{hist.default(*, breaks)} now checks and corrects a too large
      \code{breaks} number.  (\PR{17274})

      \item \code{callNextMethod()} works for \code{\dots} methods.

      \item \code{qr.coef(qd, y)} now has correct names also when
      \code{qd} is a complex QR or stems from \code{qr(*, LAPACK=TRUE)}.

      \item Setting \code{options(device = *)} to an invalid function no
      longer segfaults when plotting is initiated.  (\PR{15883})

      \item \code{encodeString(<very large string>)} no longer
      segfaults.  (\PR{15885})

      \item It is again possible to use \command{configure
	--enable-maintainer-mode} without having installed
      \command{notangle} (it was required in \R 3.4.[01]).

      \item S4 method dispatch on \code{\dots} calls the method by name
      instead of \code{.Method} (for consistency with default dispatch),
      and only attempts to pass non-missing arguments from the generic.

      \item \code{readRDS(textConnection(.))} works again.  (\PR{17325})

      \item \code{(1:n)[-n]} no longer segfaults for \code{n <- 2.2e9}
      (on a platform with enough RAM).

      \item \code{x <- 1:2; tapply(x, list(x, x), function(x) "")[1,2]}
      now correctly returns \code{NA}.  (\PR{17333})

      \item Running of finalizers after explicit GC request moved from
      the \R interface \code{do_gc} to the \code{C} interface
      \code{R_gc}.  This helps with reclaiming inaccessible connections.

      \item \code{help.search(topic)} and \code{??topic} matching topics
      in vignettes with multiple file name extensions (e.g.,
      \file{*.md.rsp} but not \file{*.Rmd}) failed with an error
      when using \code{options(help_type = "html")}.

      \item The X11 device no longer uses the Xlib backing store (\PR{16497}).

      \item \code{array(character(), 1)} now gives (a 1D array with)
      \code{NA} as has been documented for a long time as in the other
      cases of zero-length array initialization and also compatibly with
      \code{matrix(character(), *)}.  As mentioned there, this also
      fixes \PR{17333}.

      \item \code{splineDesign(.., derivs = 4)} no longer segfaults.

      \item \code{fisher.test(*, hybrid=TRUE)} now (again) will use the
      hybrid method when Cochran's conditions are met, fixing \PR{16654}.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.4.1}{

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item The deprecated support for PCRE versions older than 8.20
      has been removed.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{getParseData()} gave incorrect column information when
      code contained multi-byte characters.  (\PR{17254})

      \item Asking for help using expressions like \code{?stats::cor()}
      did not work.  (\PR{17250})

      \item \code{readRDS(url(....))} now works.

      \item \command{R CMD Sweave} again returns \samp{status = 0} on
      successful completion.

      \item Vignettes listed in \file{.Rbuildignore} were not being
      ignored properly.  (\PR{17246})

      \item \code{file.mtime()} no longer returns NA on Windows when the
      file or directory is being used by another process.  This affected
      \code{installed.packages()}, which is now protected against this.

      \item \command{R CMD INSTALL} Windows .zip file obeys \code{--lock}
      and \code{--pkglock} flags.

      \item (Windows only)  The \code{choose.files()} function could
      return incorrect results when called with \code{multi = FALSE}.
      (\PR{17270})

      \item \code{aggregate(<data.frame>, drop = FALSE)} now also works in
      case of near-equal numbers in \code{by}.  (\PR{16918})

      \item \code{fourfoldplot()} could encounter integer overflow when
      calculating the odds ratio. (\PR{17286})

      \item \code{parse()} no longer gives spurious warnings when
      extracting srcrefs from a file not encoded in the current locale.

      This was seen from \command{R CMD check} with \file{inst/doc/*.R}
      files, and \code{check} has some additional protection for such files.

      \item \code{print.noquote(x)} now always returns its argument
      \code{x} (invisibly).

      \item Non-UTF-8 multibyte character sets were not handled properly
      in source references.  (\PR{16732})
    }
  }
}

\section{\Rlogo CHANGES IN R 3.4.0}{

  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item (Unix-alike)
      The default methods for \code{download.file()} and \code{url()}
      now choose \code{"libcurl"} except for \samp{file://}
      URLs.  There will be small changes in the format and wording of
      messages, including in rare cases if an issue is a warning or an
      error.  For example, when HTTP re-direction occurs, some messages
      refer to the final URL rather than the specified one.

      Those who use proxies should check that their settings are
      compatible (see \code{?download.file}: the most commonly used
      forms work for both \code{"internal"} and \code{"libcurl"}).

      \item \code{table()} has been amended to be more internally
      consistent and become back compatible to \R \eqn{\le}{<=} 2.7.2
      again.  Consequently, \code{table(1:2, exclude = NULL)} no longer
      contains a zero count for \code{<NA>}, but \code{useNA = "always"}
      continues to do so.

      \item \code{summary.default()} no longer rounds, but its print
      method does resulting in less extraneous rounding, notably of
      numbers in the ten thousands.

      \item \code{factor(x, exclude = L)} behaves more rationally when
      \code{x} or \code{L} are character vectors.  Further,
      \code{exclude = <factor>} now behaves as documented for long.

      \item Arithmetic, logic (\code{&}, \code{|}) and comparison (aka
      \sQuote{relational}, e.g., \code{<}, \code{==}) operations with
      arrays now behave consistently, notably for arrays of length zero.

      Arithmetic between length-1 arrays and longer non-arrays had
      silently dropped the array attributes and recycled.  This now
      gives a warning and will signal an error in the future, as it has
      always for logic and comparison operations in these cases (e.g.,
      compare \code{matrix(1,1) + 2:3} and \code{matrix(1,1) < 2:3}).

      \item The JIT (\sQuote{Just In Time}) byte-code compiler is now
      enabled by default at its level 3. This means functions will be
      compiled on first or second use and top-level loops will be
      compiled and then run.  (Thanks to Tomas Kalibera for extensive
      work to make this possible.)

      For now, the compiler will not compile code containing explicit
      calls to \code{browser()}: this is to support single stepping from
      the \code{browser()} call.

      JIT compilation can be disabled for the rest of the session using
      \code{compiler::enableJIT(0)} or by setting environment variable
      \env{R_ENABLE_JIT} to \code{0}.

      \item \code{xtabs()} works more consistently with \code{NA}s, also
      in its result no longer setting them to \code{0}.  Further, a new
      logical option \code{addNA} allows to count \code{NA}s where
      appropriate.  Additionally, for the case \code{sparse = TRUE}, the
      result's \code{dimnames} are identical to the default case's.

      \item Matrix products now consistently bypass BLAS when the inputs
      have \code{NaN}/\code{Inf} values. Performance of the check of
      inputs has been improved. Performance when BLAS is used is
      improved for matrix/vector and vector/matrix multiplication (DGEMV
      is now used instead of DGEMM).

      One can now choose from alternative matrix product implementations
      \emph{via} \code{options(matprod = )}.  The \code{"internal"}
      implementation is not optimized for speed but consistent in
      precision with other summations in R (using \code{long double}
      accumulators where available).  \code{"blas"} calls BLAS directly
      for best speed, but usually with undefined behavior for inputs
      with \code{NaN}/\code{Inf}.
    }
  }

  \subsection{NEW FEATURES}{
    \itemize{
      \item User errors such as \code{integrate(f, 0:1, 2)} are now caught.

      \item Add \code{signature} argument to \code{debug()},
      \code{debugonce()}, \code{undebug()} and \code{isdebugged()} for
      more conveniently debugging S3 and S4 methods.  (Based on a patch by
      Gabe Becker.)

      \item Add \code{utils::debugcall()} and
      \code{utils::undebugcall()} for debugging the function that would
      be called by evaluating the given expression. When the call is to
      an S4 generic or standard S3 generic, \code{debugcall()} debugs the
      method that would be dispatched. A number of internal utilities
      were added to support this, most notably
      \code{utils::isS3stdGeneric()}.  (Based on a patch by Gabe Becker.)

      \item Add \code{utils::strcapture()}. Given a character vector and
      a regular expression containing capture expressions,
      \code{strcapture()} will extract the captured tokens into a
      tabular data structure, typically a \code{data.frame}.

      \item \code{str()} and \code{strOptions()} get a new option
      \code{drop.deparse.attr} with improved but \emph{changed} default
      behaviour for expressions.  For \code{expression} objects
      \code{x}, \code{str(x)} now may remove extraneous white space and
      truncate long lines.

      \item \code{str(<looooooooong_string>)} is no longer very slow;
      inspired by Mikko Korpela's proposal in \PR{16527}.

      \item \code{str(x)}'s default method is more \dQuote{accurate} and
      hence somewhat more generous in displaying character vectors; this
      will occasionally change \R outputs (and need changes to some
      \file{*.Rout(.save)} files).
      \cr %% same \item
      For a classed integer vector such as \code{x <- xtabs(~ c(1,9,9,9))},
      \code{str(x)} now shows both the class and \code{"int"}, instead
      of only the latter.

      \item \code{isSymmetric(m)} is much faster for large asymmetric
      matrices \code{m} \emph{via} pre-tests and a new option \code{tol1}
      (with which strict back compatibility is possible but not the
      default).

      \item The result of \code{eigen()} now is of class \code{"eigen"}
      in the default case when eigenvectors are computed.

      \item Zero-length date and date-time objects (of classes
      \code{"POSIX[cl]?t"}) now \code{print()} \dQuote{recognizably}.

      \item \code{xy.coords()} and \code{xyz.coords()} get a new
      \code{setLab} option.

      \item The \code{method} argument of \code{sort.list()},
      \code{order()} and \code{sort.int()} gains an \code{"auto"} option
      (the default) which should behave the same as before when
      \code{method} was not supplied.

      \item \code{stopifnot(E, ..)} now reports differences when
      \code{E} is a call to \code{all.equal()} and that is not true.

      \item \code{boxplot(<formula>, *)} gain optional arguments
      \code{drop}, \code{sep}, and \code{lex.order} to pass to
      \code{split.default()} which itself gains an argument
      \code{lex.order} to pass to \code{interaction()} for more
      flexibility.

      \item The \code{plot()} method for \code{ppr()} has enhanced
      default labels (\code{xmin} and \code{main}).

      \item \code{sample.int()} gains an explicit \code{useHash} option
      (with a back compatible default).

      \item \code{identical()} gains an \code{ignore.srcref} option
      which drops \code{"srcref"} and similar attributes when true (as
      by default).

      \item \code{diag(x, nrow = n)} now preserves \code{typeof(x)}, also
      for logical, integer and raw \code{x} (and as previously for
      complex and numeric).

      \item \code{smooth.spline()} now allows direct specification of
      \code{lambda}, gets a \code{hatvalues()} method and keeps
      \code{tol} in the result, and optionally parts of the internal
      matrix computations.

      \item \code{addNA()} is faster now, e.g.\sspace{}when applied twice.
      (Part of \PR{16895}.)

      \item New option \code{rstandard(<lm>, type = "predicted")}
      provides the \dQuote{PRESS}--related leave-one-out
      cross-validation errors for linear models.

      \item After seven years of deprecation, duplicated factor levels
      now produce a warning when printed and an error in \code{levels<-}
      instead of a warning.

      \item Invalid factors, e.g., with duplicated levels (invalid but
      constructable) now give a warning when printed, \emph{via} new
      function \code{.valid.factor()}.

      \item \code{sessionInfo()} has been updated for Apple's change in
      OS naming as from \sQuote{10.12} (\sQuote{macOS Sierra} \emph{vs}
      \sQuote{OS X El Capitan}).

      Its \code{toLatex()} method now includes the \code{running}
      component.

      \item \code{options(interrupt=)} can be used to specify a default
      action for user interrupts.  For now, if this option is not set
      and the \code{error} option is set, then an unhandled user
      interrupt invokes the \code{error} option.  (This may be dropped in
      the future as \code{interrupt} conditions are not \code{error}
      conditions.)

      \item In most cases user interrupt handlers will be called with a
      \code{"resume"} restart available.  Handlers can invoke this
      restart to resume computation. At the browser prompt the \code{r}
      command will invoke a \code{"resume"} restart if one is
      available. Some read operations cannot be resumed properly when
      interrupted and do not provide a \code{"resume"} restart.

      \item Radix sort is now chosen by \code{method = "auto"} for
      \code{sort.int()} for double vectors (and hence used for
      \code{sort()} for unclassed double vectors), excluding
      \sQuote{long} vectors.

      \code{sort.int(method = "radix")} no longer rounds double vectors.

      \item The \code{default} and \code{data.frame} methods for
      \code{stack()} preserve the names of empty elements in the levels
      of the \code{ind} column of the return value.  Set the new
      \code{drop} argument to \code{TRUE} for the previous behavior.

      \item Speedup in \code{simplify2array()} and hence \code{sapply()} and
      \code{mapply()} (for the case of names and common length > 1),
      thanks to Suharto Anggono's \PR{17118}.

      \item \code{table(x, exclude = NULL)} now sets
      \code{useNA = "ifany"} (instead of \code{"always"}).
      Together with the bug fixes for this case, this recovers more
      consistent behaviour  compatible to older versions of \R.  As
      a consequence, \code{summary()} for a logical vector no longer
      reports (zero) counts for \code{NA} when there are no \code{NA}s.

      \item \code{dump.frames()} gets a new option
      \code{include.GlobalEnv} which allows to also dump the global
      environment, thanks to Andreas Kersting's proposal in \PR{17116}.

      \item \code{system.time()} now uses \code{message()} instead of
      \code{cat()} when terminated early, such that
      \code{suppressMessages()} has an effect; suggested by Ben Bolker.

      \item \code{citation()} supports \file{inst/CITATION} files from
      package source trees, with \code{lib.loc} pointing to the
      directory containing the package.

      %% Would need more work (notably in  ../src/main/sort.c )
      %% \item New \code{orderL(lst, ....)} for use in \code{do.call()} to
      %% avoid the name problem seen in \PR{17119}.

      \item \code{try()} gains a new argument \code{outFile} with a
      default that can be modified \emph{via}
      \code{options(try.outFile = .)}, useful notably for \code{Sweave}.

      \item The unexported low-level functions in package \pkg{parallel}
      for passing serialized \R objects to and from forked children now
      support long vectors on 64-bit platforms.  This removes some
      limits on higher-level functions such as \code{mclapply()} (but
      returning gigabyte results from forked processes \emph{via}
      serialization should be avoided if at all possible).

      \item Connections now \code{print()} without error even if
      invalid, e.g.\sspace{}after having been destroyed.

      \item \code{apropos()} and \code{find(simple.words = FALSE)} no
      longer match object names starting with \samp{.} which are known
      to be internal objects (such as \code{.__S3MethodsTable__.}).

      \item Convenience function \code{hasName()} has been added; it
      is intended to replace the common idiom \code{!is.null(x$name)}
      without the usually unintended partial name matching.

      \item \code{strcapture()} no longer fixes column names nor coerces
      strings to factors (suggested by Bill Dunlap).

      \item \code{strcapture()} returns \code{NA} for non-matching
      values in \code{x} (suggested by Bill Dunlap).

      \item \code{source()} gets new optional arguments, notably
      \code{exprs}; this is made use of in the new utility function
      \code{withAutoprint()}.

      \item \code{sys.source()} gets a new \code{toplevel.env} argument.
      This argument is useful for frameworks running package tests;
      contributed by Tomas Kalibera.

      \item \code{Sys.setFileTime()} and
      \code{file.copy(copy.date = TRUE)} will set timestamps with
      fractions of seconds on platforms/filesystems which support this.

      \item (Windows only.) \code{file.info()} now returns file
      timestamps including fractions of seconds; it has done so on other
      platforms since \R 2.14.0.  (NB: some filesystems do not
      record modification and access timestamps to sub-second
      resolution.)

      \item The license check enabled by
      \code{options(checkPackageLicense = TRUE)} is now done when the
      package's namespace is first loaded.

      \item \code{ppr()} and \code{supsmu()} get an optional
      \code{trace} argument, and \code{ppr(.., sm.method = ..spline)} is
      no longer limited to sample size \eqn{n \le 2500}{n <= 2500}.

      \item The \code{POSIXct} method for \code{print()} gets optional
      \code{tz} and \code{usetz} arguments, thanks to a report from
      Jennifer S. Lyon.

      \item New function \code{check_packages_in_dir_details()} in
      package \pkg{tools} for analyzing package-check log files to
      obtain check details.

      \item Package \pkg{tools} now exports function
      \code{CRAN_package_db()} for obtaining information about current
      packages in the \acronym{CRAN} package repository, and several
      functions for obtaining the check status of these packages.

      \item The (default) Stangle driver \code{Rtangle} allows
      \code{annotate} to be a function and gets a new
      \code{drop.evalFALSE} option.

      \item The default method for \code{quantile(x, prob)} should now
      be monotone in \code{prob}, even in border cases, see \PR{16672}.

      \item \code{bug.report()} now tries to extract an email address
      from a \samp{BugReports} field, and if there is none, from a
      \samp{Contacts} field.

      \item The \code{format()} and \code{print()} methods for
      \code{object.size()} results get new options \code{standard} and
      \code{digits}; notably, \code{standard = "IEC"} and
      \code{standard = "SI"} allow more standard (but less common)
      abbreviations than the default ones, e.g.\sspace{}for kilobytes.
      (From contributions by Henrik Bengtsson.)

      \item If a reference class has a validity method,
      \code{validObject} will be called automatically from the
      default initialization method for reference classes.

      \item \code{tapply()} gets new option \code{default = NA}
      allowing to change the previously hardcoded value.

      \item \code{read.dcf()} now consistently interprets any
      \sQuote{whitespace} to be stripped to include newlines.

      \item The maximum number of DLLs that can be loaded into R
      e.g.\sspace{}\emph{via} \code{dyn.load()} can now be increased by
      setting the environment variable \code{R_MAX_NUM_DLLS} before
      starting R.

      \item Assigning to an element of a vector beyond the current
      length now over-allocates by a small fraction. The new vector is
      marked internally as growable, and the true length of the new
      vector is stored in the \code{truelength} field. This makes
      building up a vector result by assigning to the next element
      beyond the current length more efficient, though pre-allocating is
      still preferred.  The implementation is subject to change and not
      intended to be used in packages at this time.

      \item Loading the \pkg{parallel} package namespace no longer sets
      or changes the \code{.Random.seed}, even if \env{R_PARALLEL_PORT}
      is unset.

      NB: This can break reproducibility of output, and did for a
      \acronym{CRAN} package.

      \item Methods \code{"wget"} and \code{"curl"} for
      \code{download.file()} now give an \R error rather than a non-zero
      return value when the external command has a non-zero status.

      \item Encoding name \code{"utf8"} is mapped to \code{"UTF-8"}.
      Many implementations of \code{iconv} accept \code{"utf8"}, but not
      GNU \pkg{libiconv} (including the late 2016 version 1.15).

      \item \code{sessionInfo()} shows the full paths to the library or
      executable files providing the BLAS/LAPACK implementations
      currently in use (not available on Windows).

      \item The binning algorithm used by bandwidth selectors
      \code{bw.ucv()}, \code{bw.bcv()} and \code{bw.SJ()} switches to a
      version linear in the input size \code{n} for \code{n > nb/2}.
      (The calculations are the same, but for larger \code{n/nb} it is
      worth doing the binning in advance.)

      \item There is a new option \code{PCRE_study} which controls when
      \code{grep(perl = TRUE)} and friends \sQuote{study} the compiled
      pattern.  Previously this was done for 11 or more input strings:
      it now defaults to 10 or more (but most examples need many more
      for the difference from studying to be noticeable).

      \item \code{grep(perl = TRUE)} and friends can now make use of
      PCRE's Just-In-Time mechanism, for PCRE \eqn{\ge}{>=} 8.20 on
      platforms where JIT is supported.  It is used by default whenever
      the \code{pattern} is studied (see the previous item).  (Based on
      a patch from Mikko Korpela.)

      This is controlled by a new option \code{PCRE_use_JIT}.

      Note that in general this makes little difference to the speed,
      and may take a little longer: its benefits are most evident on
      strings of thousands of characters.  As a side effect it reduces
      the chances of C stack overflow in the PCRE library on very long
      strings (millions of characters, but see next item).

      Warning: segfaults were seen using PCRE with JIT enabled on 64-bit
      Sparc builds.

      \item There is a new option \code{PCRE_limit_recursion} for
      \code{grep(perl = TRUE)} and friends to set a recursion limit
      taking into account \R's estimate of the remaining C stack space
      (or 10000 if that is not available).  This reduces the chance of C
      stack overflow, but because it is conservative may report a
      non-match (with a warning) in examples that matched before.  By
      default it is enabled if any input string has 1000 or more bytes.
      (\PR{16757})

      \item \code{getGraphicsEvent()} now works on
      \code{X11(type = "cairo")} devices.  Thanks to Frederick Eaton (for
      reviving an earlier patch).

      \item There is a new argument \code{onIdle} for
      \code{getGraphicsEvent()}, which allows an R function to be run
      whenever there are no pending graphics events.  This is currently
      only supported on X11 devices.  Thanks to Frederick Eaton.

      \item The \code{deriv()} and similar functions now can compute
      derivatives of \code{log1p()}, \code{sinpi()} and similar
      one-argument functions, thanks to a contribution by Jerry Lewis.

      \item \code{median()} gains a formal \code{\dots} argument, so
      methods with extra arguments can be provided.

      \item \code{strwrap()} reduces \code{indent} if it is more than
      half \code{width} rather than giving an error.  (Suggested by Bill
      Dunlap.)

      \item When the condition \code{code} in \code{if(.)} or
      \code{while(.)} is not of length one, an error instead of a
      warning may be triggered by setting an environment variable, see
      the help page.

      \item Formatting and printing of bibliography entries
      (\code{bibentry}) is more flexible and better documented.  Apart
      from setting \code{options(citation.bibtex.max = 99)} you can also
      use \code{print(<citation>, bibtex=TRUE)} (or \code{format(..)})
      to get the BibTeX entries in the case of more than one entry.
      This also affects \code{citation()}.
      Contributions to enable \code{style = "html+bibtex"} are welcome.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item Entry points \code{R_MakeExternalPtrFn} and
      \code{R_ExternalPtrFn} are now declared in header
      \file{Rinternals.h} to facilitate creating and retrieving an \R{}
      external pointer from a C function pointer without ISO C warnings
      about the conversion of function pointers.

      \item There was an exception for the native Solaris C++ compiler
      to the dropping (in \R 3.3.0) of legacy C++ headers from headers
      such as \file{R.h} and \file{Rmath.h} --- this has now been
      removed.  That compiler has strict C++98 compliance hence does not
      include extensions in its (non-legacy) C++ headers: some
      packages will need to request C++11 or replace non-C++98 calls
      such as \code{lgamma}: see §1.6.4 of \sQuote{Writing R Extensions}.

      Because it is needed by about 70 CRAN packages, headers \file{R.h}
      and \file{Rmath.h} still declare \preformatted{use namespace std;}
      when included on Solaris.

      \item When included from C++, the \R headers now use forms such as
      \code{std::FILE} directly rather than including the line \preformatted{using std::FILE;}
      C++ code including these headers might be relying on the latter.

      \item Headers \file{R_ext/BLAS.h} and \file{R_ext/Lapack.h} have
      many improved declarations including \code{const} for
      double-precision complex routines. \emph{Inter alia} this avoids
      warnings when passing \sQuote{string literal} arguments from C++11
      code.

      \item Headers for Unix-only facilities \file{R_ext/GetX11Image.h},
      \file{R_ext/QuartzDevice.h} and \file{R_ext/eventloop.h} are no
      longer installed on Windows.

      \item No-longer-installed headers \file{GraphicsBase.h},
      \file{RGraphics.h}, \file{Rmodules/RX11.h} and
      \file{Rmodules/Rlapack.h} which had a LGPL license no longer do so.

      \item \code{HAVE_UINTPTR_T} is now defined where appropriate by
      \code{Rconfig.h} so that it can be included before
      \code{Rinterface.h} when \code{CSTACK_DEFNS} is defined and a C
      compiler (not C++) is in use.  \code{Rinterface.h} now includes C
      header \file{stdint.h} or C++11 header \file{cstdint} where
      needed.

      \item Package \pkg{tools} has a new function
      \code{package_native_routine_registration_skeleton()} to assist
      adding native-symbol registration to a package.  See its help and
      §5.4.1 of \sQuote{Writing R Extensions} for how to use it.  (At
      the time it was added it successfully automated adding
      registration to over 90\% of \acronym{CRAN} packages which lacked
      it.  Many of the failures were newly-detected bugs in the
      packages, e.g.\sspace50 packages called entry points with varying
      numbers of arguments and 65 packages called entry points not in
      the package.)
      %% 235 fail out of 2460, with 15 others working with
      %% character_only = FALSE.
    }
  }

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item \code{readline} headers (and not just the library) are
      required unless configuring with \option{--with-readline=no}.

      \item \command{configure} now adds a compiler switch for C++11
      code, even if the compiler supports C++11 by default.  (This
      ensures that \command{g++} 6.x uses C++11 mode and not its default
      mode of C++14 with \sQuote{GNU extensions}.)

      The tests for C++11 compliance are now much more comprehensive.
      For gcc < 4.8, the tests from R 3.3.0 are used in order to maintain
      the same behaviour on Linux distributions with long-term support.

      \item An alternative compiler for C++11 is now specified with
      \samp{CXX11}, not \samp{CXX1X}. Likewise C++11 flags are specified
      with \samp{CXX11FLAGS} and the standard (e.g., \samp{-std=gnu++11})
      is specified with \samp{CXX11STD}.

      \item \command{configure} now tests for a C++14-compliant compiler
      by testing some basic features.  This by default tries flags for
      the compiler specified by \samp{CXX11}, but an alternative compiler,
      options and standard can be specified by variables \samp{CXX14},
      \samp{CXX14FLAGS} and \samp{CXX14STD} (e.g., \option{-std=gnu++14}).

      \item There is a new macro \code{CXXSTD} to help specify the
      standard for C++ code, e.g.\sspace{}\option{-std=c++98}.  This
      makes it easier to work with compilers which default to a later
      standard: for example, with \code{CXX=g++6 CXXSTD=-std=c++98}
      \command{configure} will select commands for \command{g++} 6.x
      which conform to C++11 and C++14 where specified but otherwise use
      C++98.

      \item Support for the defunct IRIX and OSF/1 OSes and Alpha CPU
      has been removed.

      \item \command{configure} checks that the compiler specified by
      \samp{$CXX $CXXFLAGS} is able to compile C++ code.

      \item \command{configure} checks for the required header
      \file{sys/select.h} (or \file{sys/time.h} on legacy systems) and
      system call \code{select} and aborts if they are not found.

      \item If available, the POSIX 2008 system call \code{utimensat}
      will be used by \code{Sys.setFileTime()} and
      \code{file.copy(copy.date = TRUE)}.  This may result in slightly
      more accurate file times.  (It is available on Linux and FreeBSD
      but not macOS.)
      %% My Solaris 10 system does not have it, but Oracle's online help does

      \item The minimum version requirement for \code{libcurl} has been
      reduced to 7.22.0, although at least 7.28.0 is preferred and
      earlier versions are little tested.  (This is to support Debian 7
      \sQuote{Wheezy} LTS and Ubuntu \sQuote{Precise} 12.04 LTS,
      although the latter is close to end-of-life.)
      %% Debian Wheezy LTS is supported until 2018-05-31

      \item \command{configure} tests for a C++17-compliant compiler.
      The tests are experimental and subject to change in the future.
    }
  }

  \subsection{INCLUDED SOFTWARE}{
    \itemize{
      \item (Windows only) Tcl/Tk version 8.6.4 is now included in the
      binary builds.  The \file{tcltk*.chm} help file is no longer
      included; please consult the online help at
      \url{http://www.tcl.tk/man/} instead.

      \item The version of LAPACK included in the sources has been
      updated to 3.7.0: no new routines have been added to \R{}.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item There is support for compiling C++14 or C++17 code in
      packages on suitable platforms: see \sQuote{Writing R Extensions}
      for how to request this.

      \item The order of flags when \samp{LinkingTo} other packages has
      been changed so their include directories come earlier, before
      those specified in \code{CPPFLAGS}.  This will only have an effect
      if non-system include directories are included with \option{-I}
      flags in \code{CPPFLAGS} (and so not the default
      \code{-I/usr/local/include} which is treated as a system include
      directory on most platforms).
      %% This ensures that BH's 'boost' directory gets precedent over
      %% any Boost headers in, say, /opt/csw/include .

      \item Packages which register native routines for \code{.C} or
      \code{.Fortran} need to be re-installed for this version (unless
      installed with R-devel SVN revision r72375 or later).

      \item Make variables with names containing \code{CXX1X} are
      deprecated in favour of those using \code{CXX11}, but for the time
      being are still made available \emph{via} file
      \file{etc/Makeconf}.  Packages using them should be converted to
      the new forms and made dependent on \samp{R (>= 3.4.0)}.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item Running \command{R CMD check --as-cran} with
      \env{_R_CHECK_CRAN_INCOMING_REMOTE_} false now skips tests that
      require remote access.  The remaining (local) tests typically
      run quickly compared to the remote tests.

      \item \command{R CMD build} will now give priority to vignettes
      produced from files in the \file{vignettes} directory over those
      in the \file{inst/doc} directory, with a warning that the latter
      are being ignored.

      \item \command{R CMD config} gains a \option{--all} option for
      printing names and values of all basic configure variables.

      It now knows about all the variables used for the C++98, C++11 and
      C++14 standards.

      \item \command{R CMD check} now checks that output files in
      \file{inst/doc} are newer than the source files in \file{vignettes}.

      \item For consistency with other package subdirectories, files
      named \file{*.r} in the \file{tests} directory are now recognized
      as tests by \command{R CMD check}. (Wish of \PR{17143}.)

      \item \command{R CMD build} and \command{R CMD check} now use the
      \emph{union} of \env{R_LIBS} and \code{.libPaths()}.  They may not
      be equivalent, e.g., when the latter is determined by
      \env{R_PROFILE}.

      \item \command{R CMD build} now preserves dates when it copies files
      in preparing the tarball.  (Previously on Windows it changed the
      dates on all files; on Unix, it changed some dates when installing
      vignettes.)

      \item The new option \command{R CMD check --no-stop-on-test-error}
      allows running the remaining tests (under \file{tests/}) even if
      one gave an error.

      \item Check customization \emph{via} environment variables to
      detect side effects of \code{.Call()} and \code{.External()} calls
      which alter their arguments is described in §8 of the \sQuote{R
      Internals} manual.

      \item \command{R CMD check} now checks any \samp{BugReports} field
      to be non-empty and a suitable single URL.

      \item \command{R CMD check --as-cran} now NOTEs if the package
      does not register its native routines or does not declare its
      intentions on (native) symbol search.  (This will become a WARNING
      in due course.)
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item (Windows only) Function \code{setInternet2()} is defunct.

      \item Installation support for \code{readline} emulations based on
      \code{editline} (aka \code{libedit}) is deprecated.

      \item Use of the C/C++ macro \samp{NO_C_HEADERS} is defunct and
      silently ignored.

      \item \code{unix.time()}, a traditional synonym for
      \code{system.time()}, has been deprecated.

      \item \code{structure(NULL, ..)} is now deprecated as you cannot
      set attributes on \code{\link{NULL}}.

      \item Header \file{Rconfig.h} no longer defines
      \samp{SUPPORT_OPENMP}; instead use \samp{_OPENMP} (as documented
      for a long time).

      \item (C-level Native routine registration.)  The deprecated
      \code{styles} member of the \code{R_CMethodDef} and
      \code{R_FortranMethodDef} structures has been removed.
      Packages using these will need to be re-installed for \R 3.4.0.

      \item The deprecated support for PCRE versions older than 8.20
      will be removed in \R 3.4.1. (Versions 8.20--8.31 will still be
      accepted but remain deprecated.)
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item Getting or setting \code{body()} or \code{formals()} on
      non-functions for now signals a warning and may become an error
      for setting.

      \item \code{match(x, t)}, \code{duplicated(x)} and
      \code{unique(x)} work as documented for complex numbers with \code{NA}s
      or \code{NaN}s, where all those containing \code{NA} do match,
      whereas in the case of \code{NaN}'s both real and imaginary parts
      must match, compatibly with how \code{print()} and \code{format()}
      work for complex numbers.

      \item \code{deparse(<complex>, options = "digits17")} prints more
      nicely now, mostly thanks to a suggestion by Richie Cotton.

      \item Rotated symbols in plotmath expressions are now positioned
      correctly on \code{x11(type = "Xlib")}. (\PR{16948})

      \item \code{as<-()} avoids an infinite loop when a virtual class
      is interposed between a subclass and an actual superclass.

      \item Fix level propagation in \code{unlist()} when the list
      contains zero-length lists or factors.

      \item Fix S3 dispatch on S4 objects when the \pkg{methods} package is
      not attached.

      \item Internal S4 dispatch sets \code{.Generic} in the method
      frame for consistency with \code{standardGeneric()}.  (\PR{16929})

      \item Fix \code{order(x, decreasing = TRUE)} when \code{x} is an
      integer vector containing \code{MAX_INT}.  Ported from a fix Matt
      Dowle made to \CRANpkg{data.table}.

      \item Fix caching by \code{callNextMethod()}, resolves \PR{16973}
      and \PR{16974}.

      \item \code{grouping()} puts NAs last, to be consistent with the
      default behavior of \code{order()}.

      \item Point mass limit cases: \code{qpois(-2, 0)} now gives
      \code{NaN} with a warning and \code{qgeom(1, 1)} is \code{0}.
      (\PR{16972})

      \item \code{table()} no longer drops an \code{"NaN"} factor level,
      and better obeys \code{exclude = <chr>}, thanks to Suharto Anggono's
      patch for \PR{16936}.  Also, in the case of \code{exclude = NULL}
      and \code{NA}s, these are tabulated correctly (again).

      Further, \code{table(1:2, exclude = 1, useNA = "ifany")} no longer
      erroneously reports \code{<NA>} counts.

      Additionally, all cases of empty \code{exclude} are equivalent,
      and \code{useNA} is not overwritten when specified (as it was by
      \code{exclude = NULL}).

      \item \code{wilcox.test(x, conf.int=TRUE)} no longer errors out in
      cases where the confidence interval is not available, such as for
      \code{x = 0:2}.

      \item \code{droplevels(f)} now keeps <NA> levels when present.

      \item In integer arithmetic, \code{NULL} is now treated as
      \code{integer(0)} whereas it was previously treated as \code{double(0)}.

      \item The radix sort considers \code{NA_real_} and \code{NaN} to
      be equivalent in rank (like the other sort algorithms).

      \item When \code{index.return=TRUE} is passed to \code{sort.int()},
      the radix sort treats \code{NA}s like \code{sort.list()} does
      (like the other sort algorithms).

      \item When in \code{tabulate(bin, nbin)} \code{length(bin)} is
      larger than the maximal integer, the result is now of type
      \code{double} and hence no longer silently overflows to wrong
      values.  (\PR{17140})

      \item \code{as.character.factor()} respects S4 inheritance when
      checking the type of its argument. (\PR{17141})

      \item The \code{factor} method for \code{print()} no longer sets
      the class of the factor to \code{NULL}, which would violate a
      basic constraint of an S4 object.

      \item \code{formatC(x, flag = f)} allows two new flags, and
      signals an error for invalid flags also in the case of character
      formatting.

      \item Reading from \code{file("stdin")} now also closes the
      connection and hence no longer leaks memory when reading from a
      full pipe, thanks to Gábor Csárdi, see thread starting at
      \url{https://stat.ethz.ch/pipermail/r-devel/2016-November/073360.html}.

      \item Failure to create file in \code{tempdir()} for compressed
      \code{pdf()} graphics device no longer errors (then later
      segfaults).  There is now a warning instead of error and
      compression is turned off for the device.  Thanks to Alec
      Wysoker (\PR{17191}).

      \item Asking for \code{methods()} on \code{"|"} returns only S3
      methods. See
      \url{https://stat.ethz.ch/pipermail/r-devel/2016-December/073476.html}.

      \item \code{dev.capture()} using Quartz Cocoa device (macOS) returned
      invalid components if the back-end chose to use ARGB instead of RGBA
      image format. (Reported by Noam Ross.)

      \item \code{seq("2", "5")} now works too, equivalently to
      \code{"2":"5"} and \code{seq.int()}.

      \item \code{seq.int(to = 1, by = 1)} is now correct, other cases are
      integer (instead of \code{double}) when \code{seq()} is integer
      too, and the "non-finite" error messages are consistent between
      \code{seq.default()} and \code{seq.int()}, no longer mentioning
      \code{NaN} etc.

      \item \code{rep(x, times)} and \code{rep.int(x, times)} now work
      when \code{times} is larger than the largest value representable
      in an integer vector.  (\PR{16932})

      \item \code{download.file(method = "libcurl")} does not check for
      URL existence before attempting downloads; this is more robust to
      servers that do not support HEAD or range-based retrieval, but may
      create empty or incomplete files for aborted download requests.

      \item Bandwidth selectors \code{bw.ucv()}, \code{bw.bcv()} and
      \code{bw.SJ()} now avoid integer overflow for large sample sizes.

      \item \code{str()} no longer shows \code{"list output truncated"},
      in cases that list was not shown at all.  Thanks to Neal Fultz
      (\PR{17219})

      \item Fix for \code{cairo_pdf()} (and \code{svg()} and
      \code{cairo_ps()}) when replaying a saved display list that contains
      a mix of \pkg{grid} and \pkg{graphics} output.
      (Report by Yihui Xie.)

      %% It never failed in a released version of R: pre-3.3.3 did
      %% \item \code{rep(3, list(4))} works again, as \code{\link{list}}s
      %% \emph{are} vectors.

      \item The \code{str()} and \code{as.hclust()} methods for
      \code{"dendrogram"} now also work for deeply nested dendrograms
      thanks to non-recursive implementations by Bradley Broom.

      \item \code{sample()} now uses two uniforms for added precision
      when the uniform generator is \code{Knuth-TAOCP},
      \code{Knuth-TAOCP-2002}, or a user-defined generator and the
      population size is \eqn{2^{25}}{2^25} or greater.

      \item If a vignette in the \file{vignettes} directory is listed in
      \file{.Rbuildignore}, \command{R CMD build} would not include it
      in the tarball, but would include it in the vignette database,
      leading to a check warning.  (\PR{17246})

      \item \code{tools::latexToUtf8()} infinite looped on certain
      inputs.  (\PR{17138})

      \item \code{terms.formula()} ignored argument names when determining
      whether two terms were identical.  (\PR{17235})

      \item \code{callNextMethod()} was broken when called from a method
      that augments the formal arguments of a primitive generic.

      \item Coercion of an S4 object to a vector during sub-assignment
      into a vector failed to dispatch through the \code{as.vector()}
      generic (often leading to a segfault).

      \item Fix problems in command completion:  Crash (\PR{17222})
      and junk display in Windows, handling special characters in
      filenames on all systems.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.3.3}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item Changes when redirection of a \samp{http://} URL to a
      \samp{https://} URL is encountered:

      \itemize{
	\item The internal methods of \code{download.file()} and
	\code{url()} now report that they cannot follow this (rather
	than failing silently).

	\item (Unix-alike) \code{download.file(method = "auto")} (the
	default) re-tries with \code{method = "libcurl"}.

	\item (Unix-alike) \code{url(method = "default")} with an
	explicit \code{open} argument re-tries with
	\code{method = "libcurl"}.  This covers many of the usages,
	e.g.\sspace{}\code{readLines()} with a URL argument.
      }
    }
  }

  \subsection{INSTALLATION on a UNIX-ALIKE}{
    \itemize{
      \item The \command{configure} check for the \code{zlib} version is
      now robust to versions longer than 5 characters, including
      \code{1.2.11}.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item Environmental variable \env{_R_CHECK_TESTS_NLINES_} controls
      how \command{R CMD check} reports failing tests (see §8 of the
      \sQuote{R Internals} manual).
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item (C-level Native routine registration.)  The undocumented
      \code{styles} field of the components of \code{R_CMethodDef} and
      \code{R_FortranMethodDef} is deprecated.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{vapply(x, *)} now works with long vectors \code{x}.
      (\PR{17174})

      \item \code{isS3method("is.na.data.frame")} and similar are
      correct now.  (\PR{17171})

      \item \code{grepRaw(<long>, <short>, fixed = TRUE)} now works,
      thanks to a patch by Mikko Korpela.  (\PR{17132})

      \item Package installation into a library where the package exists
      \emph{via} symbolic link now should work wherever
      \code{Sys.readlink()} works, resolving \PR{16725}.

      \item \code{"Cincinnati"} was missing an \code{"n"} in the
      \code{precip} dataset.

      \item Fix buffer overflow vulnerability in \code{pdf()} when
      loading an encoding file.  Reported by Talos (TALOS-2016-0227).

      \item \code{getDLLRegisteredRoutines()} now produces its warning
      correctly when multiple DLLs match, thanks to Matt Dowle's \PR{17184}.

      \item \code{Sys.timezone()} now returns non-NA also on platforms
      such as \samp{Ubuntu 14.04.5 LTS}, thanks to Mikko Korpela's
      \PR{17186}.

      \item \code{format(x)} for an illegal \code{"POSIXlt"} object
      \code{x} no longer segfaults.

      \item \code{methods(f)} now also works for \code{f} \code{"("}
      or \code{"{"}.

      \item (Windows only)  \code{dir.create()} did not check the length
      of the path to create, and so could overflow a buffer and crash
      \R.  (\PR{17206})

      \item On some systems, very small hexadecimal numbers in hex notation
      would underflow to zero.  (\PR{17199})

      \item \code{pmin()} and \code{pmax()} now work again for
      \code{ordered} factors and 0-length S3 classed objects, thanks to
      Suharto Anggono's \PR{17195} and \PR{17200}.

      \item \code{bug.report()} did not do any validity checking on a
      package's \samp{BugReports} field.  It now ignores an empty field,
      removes leading whitespace and only attempts to open
      \samp{http://} and \samp{https://} URLs, falling back to emailing
      the maintainer.

      \item Bandwidth selectors \code{bw.ucv()} and
      \code{bw.SJ()} gave incorrect answers or incorrectly reported an
      error (because of integer overflow) for inputs longer than
      46341.  Similarly for \code{bw.bcv()} at length 5793.

      Another possible integer overflow is checked and may result in an
      error report (rather than an incorrect result) for much longer
      inputs (millions for a smooth distribution).

      \item \code{findMethod()} failed if the active signature had
      expanded beyond what a particular package used. (Example with
      packages \CRANpkg{XR} and \CRANpkg{XRJulia} on \acronym{CRAN}.)

      \item \code{qbeta()} underflowed too early in some very asymmetric
      cases.  (\PR{17178})

      \item \command{R CMD Rd2pdf} had problems with packages with
      non-ASCII titles in \file{.Rd} files (usually the titles were
      omitted).
    }
  }
}

\section{\Rlogo CHANGES IN R 3.3.2}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{extSoftVersion()} now reports the version (if any) of
      the \code{readline} library in use.

      \item The version of LAPACK included in the sources has been
      updated to 3.6.1, a bug-fix release including a speedup for the
      non-symmetric case of \code{eigen()}.

      \item Use \code{options(deparse.max.lines=)} to limit the number
      of lines recorded in \code{.Traceback} and other deparsing
      activities.

      \item \code{format(<AsIs>)} looks more regular, also for
      non-character atomic matrices.

      \item \code{abbreviate()} gains an option \code{named = TRUE}.

      \item The online documentation for package \pkg{methods} is
      extensively rewritten.  The goals are to simplify
      documentation for basic use, to note old features not
      recommended and to correct out-of-date information.

      \item Calls to \code{setMethod()} no longer print a message when
      creating a generic function in those cases where that is
      natural: S3 generics and primitives.
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item Versions of the \code{readline} library >= 6.3 had been
      changed so that terminal window resizes were not signalled to
      \code{readline}: code has been added using a explicit signal
      handler to work around that (when \R is compiled against readline
      >= 6.3).  (\PR{16604})

      \item \command{configure} works better with Oracle Developer
      Studio 12.5.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} reports more dubious flags in files
      \file{src/Makevars[.in]}, including \option{-w} and \option{-g}.

      \item \command{R CMD check} has been set up to filter important
      warnings from recent versions of \command{gfortran} with
      \option{-Wall -pedantic}: this now reports non-portable GNU
      extensions such as out-of-order declarations.

      \item \command{R CMD config} works better with paths containing
      spaces, even those of home directories (as reported by Ken Beath).
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item Use of the C/C++ macro \samp{NO_C_HEADERS} is deprecated
      (no C headers are included by \R headers from C++ as from \R
      3.3.0, so it should no longer be needed).
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item The check for non-portable flags in \command{R CMD check}
      could be stymied by \file{src/Makevars} files which contained
      targets.

      \item (Windows only) When using certain desktop themes in Windows
      7 or higher, \kbd{Alt-Tab} could cause \command{Rterm} to stop
      accepting input.  (\PR{14406}; patch submitted by Jan Gleixner.)

      \item \code{pretty(d, ..)} behaves better for date-time \code{d}
      (\PR{16923}).

      \item When an S4 class name matches multiple classes in the S4
      cache, perform a dynamic search in order to obey namespace
      imports.  This should eliminate annoying messages about multiple
      hits in the class cache.  Also, pass along the package from the
      \code{ClassExtends} object when looking up superclasses in the
      cache.

      \item \code{sample(NA_real_)} now works.

      \item Packages using non-ASCII encodings in their code did not
      install data properly on systems using different encodings.

      \item \code{merge(df1, df2)} now also works for data frames with
      column names \code{"na.last"}, \code{"decreasing"}, or
      \code{"method"}.  (\PR{17119})

      \item \code{contour()} caused a segfault if the \code{labels}
      argument had length zero.  (Reported by Bill Dunlap.)

      \item \code{unique(warnings())} works more correctly, thanks to a
      new \code{duplicated.warnings()} method.

      \item \code{findInterval(x, vec = numeric(), all.inside = TRUE)}
      now returns \code{0}s as documented.  (Reported by Bill Dunlap.)

      \item (Windows only) \command{R CMD SHLIB} failed when a symbol
      in the resulting library had the same name as a keyword in
      the \file{.def} file.  (\PR{17130})

      \item \code{pmax()} and \code{pmin()} now work with (more ?)
      classed objects, such as \code{"Matrix"} from the \CRANpkg{Matrix}
      package, as documented for a long time.

      \item \code{axis(side, x = D)} and hence \code{Axis()} and
      \code{plot()} now work correctly for \code{"Date"} and time
      objects \code{D}, even when \dQuote{time goes backward}, e.g.,
      with decreasing \code{xlim}.  (Reported by William May.)

      \item \code{str(I(matrix(..)))} now looks as always intended.

      \item \code{plot.ts()}, the \code{plot()} method for time series,
      now respects \code{cex}, \code{lwd} and \code{lty}.  (Reported by
      Greg Werbin.)

      \item \code{parallel::mccollect()} now returns a named list (as
      documented) when called with \code{wait = FALSE}.  (Reported by
      Michel Lang.)

      \item If a package added a class to a class union in another
      package, loading the first package gave erroneous warnings
      about \dQuote{undefined subclass}.

      \item \code{c()}'s argument \code{use.names} is documented now, as
      belonging to the (C internal) default method.   In
      \dQuote{parallel}, argument \code{recursive} is also moved from
      the generic to the default method, such that the formal argument list
      of \pkg{base} generic \code{c()} is just \code{(...)}.

      \item \code{rbeta(4, NA)} and similarly \code{rgamma()} and
      \code{rnbinom()} now return \code{NaN}'s with a warning, as other
      r<dist>(), and as documented.  (\PR{17155})

      \item Using \code{options(checkPackageLicense = TRUE)} no longer
      requires acceptance of the licence for non-default standard
      packages such as \pkg{compiler}.  (Reported by Mikko Korpela.)

      \item \code{split(<very_long>, *)} now works even when the split
      off parts are long. (\PR{17139})

      \item \code{min()} and \code{max()} now also work correctly when
      the argument list starts with \code{character(0)}.  (\PR{17160})

      \item Subsetting very large matrices (\code{prod(dim(.)) >= 2^31})
      now works thanks to Michael Schubmehl's \PR{17158}.

      \item \code{bartlett.test()} used residual sums of squares
      instead of variances, when the argument was a list of \code{lm} objects.
      (Reported by Jens Ledet Jensen).

      \item \code{plot(<lm>, which = *)} now correctly labels the
      contour lines for the standardized residuals for \code{which = 6}.
      It also takes the correct \eqn{p} in case of singularities (also
      for \code{which = 5}).  (\PR{17161})

      \item \code{xtabs(~ exclude)} no longer fails from wrong scope,
      thanks to Suharto Anggono's \PR{17147}.

      \item Reference class calls to \code{methods()} did not
      re-analyse previously defined methods, meaning that calls to
      methods defined later would fail. (Reported by Charles Tilford).

      \item \code{findInterval(x, vec, left.open = TRUE)} misbehaved in some
      cases. (Reported by Dmitriy Chernykh.)
    }
  }
}

\section{\Rlogo CHANGES IN R 3.3.1}{
  \subsection{BUG FIXES}{
    \itemize{
      \item \command{R CMD INSTALL} and hence \code{install.packages()}
      gave an internal error installing a package called
      \pkg{description} from a tarball on a case-insensitive file system.

      \item \code{match(x, t)} (and hence \code{x \%in\% t}) failed
      when \code{x} was of length one, and either \code{character} and \code{x}
      and \code{t} only differed in their \code{Encoding} or when
      \code{x} and \code{t} where \code{complex} with \code{NA}s or \code{NaN}s.
      (\PR{16885}.)

      \item \code{unloadNamespace(ns)} also works again when \code{ns} is a
      \sQuote{namespace}, as from \code{getNamespace()}.

      \item \code{rgamma(1, Inf)} or \code{rgamma(1, 0, 0)} no longer give
      \code{NaN} but the correct limit.

      \item \code{length(baseenv())} is correct now.

      \item \code{pretty(d, ..)} for date-time \code{d} rarely failed
      when \code{"halfmonth"} time steps were tried (\PR{16923}) and
      on \sQuote{inaccurate} platforms such as 32-bit Windows or
      a configuration with \command{--disable-long-double}; see comment
      #15 of \PR{16761}.

      \item In \code{text.default(x, y, labels)}, the rarely(?) used
      default for \code{labels} is now correct also for the case of a
      2-column matrix \code{x} and missing \code{y}.

      \item \code{as.factor(c(a = 1L))} preserves \code{names()} again
      as in \R < 3.1.0.

      \item \code{strtrim(""[0], 0[0])} now works.

      \item Use of \code{Ctrl-C} to terminate a reverse incremental
      search started by \code{Ctrl-R} in the \code{readline}-based Unix
      terminal interface is now supported when \R{} was compiled against
      \code{readline} >= 6.0 (\code{Ctrl-G} always worked).
      (\PR{16603})

      \item \code{diff(<difftime>)} now keeps the \code{"units"}
      attribute, as subtraction already did, \PR{16940}.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.3.0}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item \code{nchar(x, *)}'s argument \code{keepNA} governing how
      the result for \code{NA}s in \code{x} is determined, gets a new
      default \code{keepNA = NA} which returns \code{NA} where
      \code{x} is \code{NA}, except for \code{type = "width"} which still
      returns \code{2}, the formatting / printing width of \code{NA}.

      \item All builds have support for \samp{https:} URLs in the
      default methods for \code{download.file()}, \code{url()} and code
      making use of them.

      Unfortunately that cannot guarantee that any particular
      \samp{https:} URL can be accessed.  For example, server and client
      have to successfully negotiate a cryptographic protocol (TLS/SSL,
      \dots) and the server's identity has to be verifiable \emph{via}
      the available certificates.  Different access methods may allow
      different protocols or use private certificate bundles: we
      encountered a \samp{https:} CRAN mirror which could be accessed by
      one browser but not by another nor by \code{download.file()} on
      the same Linux machine.
    }
  }

  \subsection{NEW FEATURES}{
    \itemize{
      \item The \code{print} method for \code{methods()} gains a
      \code{byclass} argument.

      \item New functions \code{validEnc()} and \code{validUTF8()} to
      give access to the validity checks for inputs used by
      \code{grep()} and friends.

      \item Experimental new functionality for S3 method checking, notably
      \code{isS3method()}.

      Also, the names of the \R \sQuote{language elements} are exported
      as character vector \code{tools::langElts}.

      \item \code{str(x)} now displays \code{"Time-Series"} also for
      matrix (multivariate) time-series, i.e. when \code{is.ts(x)} is true.

      \item (Windows only)  The GUI menu item to install local packages
      now accepts \file{*.tar.gz} files as well as \file{*.zip} files
      (but defaults to the latter).

      \item New programmeR's utility function \code{chkDots()}.

      \item \code{D()} now signals an error when given invalid input,
      rather than silently returning \code{NA}.  (Request of John Nash.)

      \item \code{formula} objects are slightly more \dQuote{first class}:
      e.g., \code{formula()} or \code{new("formula", y ~ x)} are now
      valid.  Similarly, for \code{"table"}, \code{"ordered"} and
      \code{"summary.table"}.  Packages defining S4 classes with the above
      S3/S4 classes as slots should be reinstalled.
      % notably if their classes are reused in other
      % packages. e.g. re-install arules for arulesSequence, flexmix for betareg

      \item New function \code{strrep()} for repeating the elements of a
      character vector.

      \item \code{rapply()} preserves attributes on the list when
      \code{how = "replace"}.

      \item New S3 generic function \code{sigma()} with methods for
      extracting the estimated standard deviation aka \dQuote{residual
	standard deviation} from a fitted model.

      \item \code{news()} now displays \R and package news files within
      the HTML help system if it is available.  If no news file is found,
      a visible \code{NULL} is returned to the console.

      \item \code{as.raster(x)} now also accepts \code{raw} arrays
      \code{x} assuming values in \code{0:255}.

      \item Subscripting of matrix/array objects of type
      \code{"expression"} is now supported.

      \item \code{type.convert("i")} now returns a factor instead of a
      complex value with zero real part and missing imaginary part.

      \item Graphics devices \code{cairo_pdf()} and \code{cairo_ps()}
      now allow non-default values of the cairographics \sQuote{fallback
	resolution} to be set.

      This now defaults to 300 on all platforms: that is the default
      documented by cairographics, but apparently was not used by all
      system installations.

      \item \code{file()} gains an explicit \code{method} argument
      rather than implicitly using
      \code{getOption("url.method", "default")}.

      \item Thanks to a patch from Tomas Kalibera, \code{x[x != 0]} is
      now typically faster than \code{x[which(x != 0)]} (in the case
      where \code{x} has no NAs, the two are equivalent).

      \item \code{read.table()} now always uses the names for a named
      \code{colClasses} argument (previously names were only used when
      \code{colClasses} was too short). (In part, wish of \PR{16478}.)

      \item (Windows only) \code{download.file()} with default
      \code{method = "auto"} and a \samp{ftps://} URL chooses
      \code{"libcurl"} if that is available.

      \item The out-of-the box Bioconductor mirror has been changed to
      one using \samp{https://}: use \code{chooseBioCmirror()} to choose
      a \samp{http://} mirror if required.

      \item The data frame and formula methods for \code{aggregate()}
      gain a \code{drop} argument.

      \item \code{available.packages()} gains a \code{repos} argument.

      \item The undocumented switching of methods for \code{url()} on
      \samp{https:} and \samp{ftps:} URLs is confined to
      \code{method = "default"} (and documented).

      \item \code{smoothScatter()} gains a \code{ret.selection} argument.

      \item \code{qr()} no longer has a \code{\dots} argument to pass
      additional arguments to methods.

      \item \code{[} has a method for class \code{"table"}.

      \item It is now possible (again) to \code{replayPlot()} a
      display list snapshot that was created by \code{recordPlot()}
      in a different \R session.

      It is still not a good idea to use snapshots as a persistent
      storage format for \R plots, but it is now not completely silly to
      use a snapshot as a format for transferring an R plot between two
      R sessions.

      The underlying changes mean that packages providing graphics
      devices (e.g., \CRANpkg{Cairo}, \CRANpkg{RSvgDevice},
      \CRANpkg{cairoDevice}, \CRANpkg{tikzDevice}) will need to be
      reinstalled.

      Code for restoring snapshots was contributed by Jeroen Ooms
      and JJ Allaire.

      Some testing code is available at
      \url{https://github.com/pmur002/R-display-list}.

      \item \code{tools::undoc(dir = D)} and \code{codoc(dir = D)} now
      also work when \code{D} is a directory whose \code{normalizePath()}ed
      version does not end in the package name, e.g.\sspace{}from a symlink.

      \item \code{abbreviate()} has more support for multi-byte
      character sets -- it no longer removes bytes within characters and
      knows about Latin vowels with accents.  It is still only
      really suitable for (most) European languages, and still warns on
      non-ASCII input.

      \code{abbreviate(use.classes = FALSE)} is now implemented, and
      that is more suitable for non-European languages.

      \item \code{match(x, table)} is faster (sometimes by an order of
      magnitude) when \code{x} is of length one and \code{incomparables}
      is unchanged, thanks to Peter Haverty (\PR{16491}).

      \item More consistent, partly not back-compatible behavior of
      \code{NA} and \code{NaN} coercion to complex numbers, operations
      less often resulting in complex \code{NA} (\code{NA_complex_}).

      \item \code{lengths()} considers methods for \code{length} and
      \code{[[} on \code{x}, so it should work automatically on any
      objects for which appropriate methods on those generics are
      defined.

      \item The logic for selecting the default screen device on OS X
      has been simplified: it is now \code{quartz()} if that is
      available even if environment variable \env{DISPLAY} has been set
      by the user.

      The choice can easily be overridden \emph{via} environment
      variable \env{R_INTERACTIVE_DEVICE}.

      \item On Unix-like platforms which support the \command{getline} C
      library function, \code{system(*, intern = TRUE)} no longer
      truncates (output) lines longer than 8192 characters, thanks to
      Karl Millar. (\PR{16544})

      \item \code{rank()} gains a \code{ties.method = "last"} option,
      for convenience (and symmetry).

      %% \item \code{getRcode(vignette(..))} is the \R source file name of
      %% a vignette.

      \item \code{regmatches(invert = NA)} can now be used to extract
      both non-matched and matched substrings.

      \item \code{data.frame()} gains argument \code{fix.empty.names};
      \code{as.data.frame.list()} gets new \code{cut.names},
      \code{col.names} and \code{fix.empty.names}.

      \item \code{plot(x ~ x, *)} now warns that it is the same as
      \code{plot(x ~ 1, *)}.

      \item \code{recordPlot()} has new arguments \code{load} and
      \code{attach} to allow package names to be stored as part of a
      recorded plot.  \code{replayPlot()} has new argument
      \code{reloadPkgs} to load/attach any package names that were
      stored as part of a recorded plot.

      \item S4 dispatch works within calls to \code{.Internal()}. This
      means explicit S4 generics are no longer needed for
      \code{unlist()} and \code{as.vector()}.

      \item Only font family names starting with \samp{"Hershey"} (and
      not \samp{"Her"} as before) are given special treatment by the
      graphics engine.

      \item S4 values are automatically coerced to vector (\emph{via}
      \code{as.vector}) when subassigned into atomic vectors.

      \item \code{findInterval()} gets a \code{left.open} option.

      \item The version of LAPACK included in the sources has been
      updated to 3.6.0, including those \sQuote{deprecated} routines
      which were previously included.  \emph{Ca} 40 double-complex
      routines have been added at the request of a package maintainer.

      As before, the details of what is included are in
      \file{src/modules/lapack/README} and this now gives information on
      earlier additions.

      \item \code{tapply()} has been made considerably more efficient
      without changing functionality, thanks to proposals from Peter
      Haverty and Suharto Anggono.  (\PR{16640})

      \item \code{match.arg(arg)} (the one-argument case) is faster; so
      is \code{sort.int()}.  (\PR{16652})

      \item The \code{format} method for \code{object_size} objects now
      also accepts \dQuote{binary} units such as \code{"KiB"} and e.g.,
      \code{"Tb"}.  (Partly from \PR{16649}.)

      \item Profiling now records calls of the form \code{foo::bar} and
      some similar cases directly rather than as calls to
      \code{<Anonymous>}.  Contributed by Winston Chang.

      \item New string utilities \code{startsWith(x, prefix)} and
      \code{endsWith(x, suffix)}.  Also provide speedups for some
      \code{grepl("^...", *)} uses (related to proposals in \PR{16490}).

      \item Reference class finalizers run at exit, as well as on
      garbage collection.

      \item Avoid \pkg{parallel} dependency on \pkg{stats} for port
      choice and random number seeds.  (\PR{16668})

      \item The radix sort algorithm and implementation from
      \CRANpkg{data.table} (\code{forder}) replaces the previous radix
      (counting) sort and adds a new method for \code{order()}.
      Contributed by Matt Dowle and Arun Srinivasan, the new algorithm
      supports logical, integer (even with large values), real, and
      character vectors.  It outperforms all other methods, but there
      are some caveats (see \code{?sort}).

      \item The \code{order()} function gains a \code{method} argument
      for choosing between \code{"shell"} and \code{"radix"}.

      \item New function \code{grouping()} returns a permutation that
      stably rearranges data so that identical values are adjacent.  The
      return value includes extra partitioning information on the
      groups.  The implementation came included with the new radix sort.

      \item \code{rhyper(nn, m, n, k)} no longer returns \code{NA} when
      one of the three parameters exceeds the maximal integer.

      \item \code{switch()} now warns when no alternatives are provided.

      \item \code{parallel::detectCores()} now has default \code{logical
	= TRUE} on all platforms -- as this was the default on Windows,
      this change only affects Sparc Solaris.

      Option \code{logical = FALSE} is now supported on Linux and recent
      versions of OS X (for the latter, thanks to a suggestion of Kyaw
      Sint).

      \item \code{hist()} for \code{"Date"} or \code{"POSIXt"} objects
      would sometimes give misleading labels on the breaks, as they
      were set to the day before the start of the period being
      displayed.  The display format has been changed, and the shift of the
      start day has been made conditional on \code{right = TRUE} (the
      default).  (\PR{16679})

      \item \R now uses a new version of the logo (donated to the R
      Foundation by RStudio).  It is defined in \file{.svg} format, so
      will resize without unnecessary degradation when displayed on
      HTML pages---there is also a vector PDF version.  Thanks to
      Dirk Eddelbuettel for producing the corresponding X11 icon.

      \item New function \code{.traceback()} returns the stack trace
      which \code{traceback()} prints.

      \item \code{lengths()} dispatches internally.

      \item \code{dotchart()} gains a \code{pt.cex} argument to control
      the size of points separately from the size of plot labels.
      Thanks to Michael Friendly and Milan Bouchet-Valat for ideas
      and patches.

      \item \code{as.roman(ch)} now correctly deals with more diverse
      character vectors \code{ch}; also arithmetic with the resulting
      roman numbers works in more cases.  (\PR{16779})

      \item \code{prcomp()} gains a new option \code{rank.} allowing to
      directly aim for less than \code{min(n,p)} PC's.  The
      \code{summary()} and its \code{print()} method have been amended,
      notably for this case.

      \item \code{gzcon()} gains a new option \code{text}, which marks
      the connection as text-oriented (so e.g.\sspace{}\code{pushBack()}
      works).  It is still always opened in binary mode.

      \item The \code{import()} namespace directive now accepts an
      argument \code{except} which names symbols to exclude from the
      imports. The \code{except} expression should evaluate to a
      character vector (after substituting symbols for strings). See
      Writing R Extensions.

      \item New convenience function \code{Rcmd()} in package
      \pkg{tools} for invoking \command{R CMD} tools from within \R.

      \item New functions \code{makevars_user()} and
      \code{makevars_site()} in package \pkg{tools} to determine the
      location of the user and site specific \file{Makevars} files for
      customizing package compilation.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} has a new option
      \option{--ignore-vignettes} for use with non-Sweave vignettes
      whose \samp{VignetteBuilder} package is not available.

      \item \command{R CMD check} now by default checks code usage
      (\emph{via} \CRANpkg{codetools}) with only the base package
      attached.  Functions from default packages other than \pkg{base}
      which are used in the package code but not imported are reported
      as undefined globals, with a suggested addition to the
      \code{NAMESPACE} file.

      \item \command{R CMD check --as-cran} now also checks DOIs in
      package \file{CITATION} and Rd files.

      \item \command{R CMD Rdconv} and \command{R CMD Rd2pdf} each have
      a new option \option{--RdMacros=pkglist} which allows Rd macros
      to be specified before processing.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item The previously included versions of \code{zlib},
      \code{bzip2}, \code{xz} and PCRE have been removed, so suitable
      external (usually system) versions are required (see the
      \sQuote{R Installation and Administration} manual).

      \item The unexported and undocumented Windows-only devices
      \code{cairo_bmp()}, \code{cairo_png()} and \code{cairo_tiff()}
      have been removed.  (These devices should be used as
      e.g.\sspace{}\code{bmp(type = "cairo")}.)

      \item (Windows only)  Function \code{setInternet2()} has no effect
      and will be removed in due course.  The choice between methods
      \code{"internal"} and \code{"wininet"} is now made by the
      \code{method} arguments of \code{url()} and \code{download.file()}
      and their defaults can be set \emph{via} options.  The
      out-of-the-box default remains \code{"wininet"} (as it has been
      since \R 3.2.2).

      \item \code{[<-} with an S4 value into a list currently embeds the
      S4 object into its own list such that the end result is roughly
      equivalent to using \code{[[<-}.  That behavior is deprecated.  In
      the future, the S4 value will be coerced to a list with
      \code{as.list()}.

      \item Package \pkg{tools}' functions
      \code{package.dependencies()}, \code{pkgDepends()}, etc are
      deprecated now, mostly in favor of \code{package_dependencies()}
      which is both more flexible and efficient.
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item Support for very old versions of \command{valgrind}
      (e.g., 3.3.0) has been removed.

      \item The included \command{libtool} script (generated by
      \command{configure}) has been updated to version 2.4.6 (from 2.2.6a).

      \item \code{libcurl} version 7.28.0 or later with support for the
      \code{https} protocol is required for installation (except on
      Windows).

      \item BSD networking is now required (except on Windows) and so
      \code{capabilities("http/ftp")} is always true.

      \item \command{configure} uses \command{pkg-config} for PNG, TIFF
      and JPEG where this is available.  This should work better with
      multiple installs and with those using static libraries.

      \item The minimum supported version of OS X is 10.6 (\sQuote{Snow
	Leopard}): even that has been unsupported by Apple since 2012.

      \item The \command{configure} default on OS X is
      \option{--disable-R-framework}: enable this if you intend to
      install under \file{/Library/Frameworks} and use with \code{R.app}.

      \item The minimum preferred version of PCRE has since \R 3.0.0
      been 8.32 (released in Nov 2012).  Versions 8.10 to 8.31 are now
      deprecated (with warnings from \command{configure}), but will
      still be accepted until \R 3.4.0.

      \item \command{configure} looks for C functions \code{__cospi},
      \code{__sinpi} and \code{__tanpi} and uses these if \code{cospi}
      \emph{etc} are not found.  (OS X is the main instance.)

      \item (Windows) R is now built using \command{gcc}
      4.9.3.  This build will require recompilation of at least those packages
      that include C++ code, and possibly others.  A build of R-devel using
      the older toolchain will be temporarily available for comparison
      purposes.

      During the transition, the environment variable
      \env{R_COMPILED_BY} has been defined to indicate which toolchain
      was used to compile R (and hence, which should be used to compile
      code in packages).  The \code{COMPILED_BY} variable described below
      will be a permanent replacement for this.

      \item (Windows) A \command{make} and \command{R CMD config} variable
      named \code{COMPILED_BY} has been added.  This indicates
      which toolchain was used to compile R (and hence, which should be
      used to compile code in packages).
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item The \command{make} macro \code{AWK} which used to be made
      available to files such as \file{src/Makefile} is no longer set.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item The API call \code{logspace_sum} introduced in \R 3.2.0 is
      now remapped as an entry point to \code{Rf_logspace_sum}, and its
      first argument has gained a \code{const} qualifier.  (\PR{16470})

      Code using it will need to be reinstalled.

      Similarly, entry point \code{log1pexp} also defined in
      \file{Rmath.h} is remapped there to \code{Rf_log1pexp}

      \item \code{R_GE_version} has been increased to \code{11}.

      \item New API call \code{R_orderVector1}, a faster
      one-argument version of \code{R_orderVector}.

      \item When \R{} headers such as \file{R.h} and \file{Rmath.h} are
      called from C++ code in packages they include the C++ versions of
      system headers such as \file{<cmath>} rather than the legacy
      headers such as \file{<math.h>}.  (Headers \file{Rinternals.h} and
      \file{Rinterface.h} already did, and inclusion of system headers
      can still be circumvented by defining \code{NO_C_HEADERS},
      including as from this version for those two headers.)

      The manual has long said that \R{} headers should \bold{not} be
      included within an \code{extern "C"} block, and almost all the
      packages affected by this change were doing so.

      \item Including header \file{S.h} from C++ code would fail on some
      platforms, and so gives a compilation error on all.

      \item The deprecated header \file{Rdefines.h} is now compatible
      with defining \code{R_NO_REMAP}.

      \item The connections interface now includes a function
      \code{R_GetConnection()} which allows packages implementing
      connections to convert R \code{connection} objects to
      \code{Rconnection} handles. Code which previously
      used the low-level R-internal \code{getConnection()} entry point
      should switch.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item C-level \code{asChar(x)} is fixed for when \code{x} is not a
      vector, and it returns \code{"TRUE"}/\code{"FALSE"} instead of
      \code{"T"}/\code{"F"} for logical vectors.

      \item The first arguments of \code{.colSums()} etc (with an
      initial dot) are now named \code{x} rather than \code{X} (matching
      \code{colSums()}): thus error messages are corrected.

      \item A \code{coef()} method for class \code{"maov"} has been
      added to allow \code{vcov()} to work with multivariate
      results. (\PR{16380})

      \item \code{method = "libcurl"} connections signal errors rather
      than retrieving HTTP error pages (where the ISP reports the
      error).

      \item \code{xpdrows.data.frame()} was not checking for unique
      row names; in particular, this affected assignment to non-existing
      rows \emph{via} numerical indexing. (\PR{16570})

      \item \code{tail.matrix()} did not work for zero rows matrices,
      and could produce row \dQuote{labels} such as \code{"[1e+05,]"}.

      \item Data frames with a column named \code{"stringsAsFactors"}
      now format and print correctly.  (\PR{16580})

      \item \code{cor()} is now guaranteed to return a value with
      absolute value less than or equal to 1. (\PR{16638})

      \item Array subsetting now keeps \code{names(dim(.))}.

      \item Blocking socket connection selection recovers more
      gracefully on signal interrupts.

      \item The \code{data.frame} method of \code{rbind()} construction
      \code{row.names} works better in borderline integer cases, but
      may change the names assigned.  (\PR{16666})

      \item (X11 only)  \code{getGraphicsEvent()} miscoded buttons and
      missed mouse motion events.  (\PR{16700})

      \item \code{methods(round)} now also lists \code{round.POSIXt}.

      \item \code{tar()} now works with the default \code{files = NULL}.
      (\PR{16716})

      \item Jumps to outer contexts, for example in error recovery, now
      make intermediate jumps to contexts where \code{on.exit()} actions
      are established instead of trying to run all \code{on.exit()}
      actions before jumping to the final target. This unwinds the stack
      gradually, releases resources held on the stack, and significantly
      reduces the chance of a segfault when running out of C stack
      space. Error handlers established using
      \code{withCallingHandlers()} and \code{options("error")}
      specifications are ignored when handling a C stack overflow error
      as attempting one of these would trigger a cascade of C stack
      overflow errors.  (These changes resolve \PR{16753}.)

      \item The spacing could be wrong when printing a complex array.
      (Report and patch by Lukas Stadler.)

      \item \code{pretty(d, n, min.n, *)} for date-time objects \code{d}
      works again in border cases with large \code{min.n}, returns a
      \code{labels} attribute also for small-range dates and in such cases
      its returned length is closer to the desired \code{n}.  (\PR{16761})
      Additionally, it finally does cover the range of \code{d}, as it
      always claimed.

      \item \code{tsp(x) <- NULL} did not handle correctly objects
      inheriting from both \code{"ts"} and \code{"mts"}.  (\PR{16769})

      \item \code{install.packages()} could give false errors when
      \code{options("pkgType")} was \code{"binary"}.  (Reported by
      Jose Claudio Faria.)

      \item A bug fix in \R 3.0.2 fixed problems with \code{locator()}
      in X11, but introduced problems in Windows.  Now both should be
      fixed.  (\PR{15700})

      \item \code{download.file()} with \code{method = "wininet"}
      incorrectly warned of download file length difference when
      reported length was unknown. (\PR{16805})

      \item \code{diag(NULL, 1)} crashed because of missed type
      checking.  (\PR{16853})
    }
  }
}

\section{\Rlogo CHANGES IN R 3.2.5}{
  \subsection{BUG FIXES}{
    \itemize{
      \item \code{format.POSIXlt()} behaved incorrectly in \R 3.2.4.
      E.g.\sspace{}the output of
      \code{format(as.POSIXlt(paste0(1940:2000, "-01-01"), tz = "CET"),
	usetz = TRUE)} ended in two \code{"CEST"} time formats.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.2.4}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{install.packages()} and related functions now give a
      more informative warning when an attempt is made to install a base
      package.

      \item \code{summary(x)} now prints with less rounding when
      \code{x} contains infinite values. (Request of \PR{16620}.)

      \item \code{provideDimnames()} gets an optional \code{unique} argument.

      \item \code{shQuote()} gains \code{type = "cmd2"} for quoting
      in \command{cmd.exe} in Windows.  (Response to \PR{16636}.)

      \item The \code{data.frame} method of \code{rbind()} gains an
      optional argument \code{stringsAsFactors} (instead of only
      depending on \code{getOption("stringsAsFactors")}).

      \item \code{smooth(x, *)} now also works for long vectors.

      \item \code{tools::texi2dvi()} has a workaround for problems with
      the \command{texi2dvi} script supplied by \pkg{texinfo 6.1}.

      It extracts more error messages from the LaTeX logs when in
      emulation mode.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} will leave a log file
      \file{build_vignettes.log} from the re-building of vignettes in
      the \file{.Rcheck} directory if there is a problem, and always if
      environment variable \env{_R_CHECK_ALWAYS_LOG_VIGNETTE_OUTPUT_} is
      set to a true value.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item Use of \samp{SUPPORT_OPENMP} from header \file{Rconfig.h} is
      deprecated in favour of the standard OpenMP define \samp{_OPENMP}.

      (This has been the recommendation in the manual for a while now.)

      \item The \command{make} macro \code{AWK} which is long unused by
      \R itself but recorded in file \file{etc/Makeconf} is deprecated
      and will be removed in \R 3.3.0.

      \item The C header file \file{S.h} is no longer documented: its
      use should be replaced by \file{R.h}.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{kmeans(x, centers = <1-row>)} now works. (\PR{16623})

      \item \code{Vectorize()} now checks for clashes in argument names.
      (\PR{16577})

      \item \code{file.copy(overwrite = FALSE)} would signal a successful
      copy when none had taken place.  (\PR{16576})

      \item \code{ngettext()} now uses the same default domain as
      \code{gettext()}.  (\PR{14605})

      \item \code{array(.., dimnames = *)} now warns about
      non-\code{list} dimnames and, from \R 3.3.0, will signal the same
      error for invalid dimnames as \code{matrix()} has always done.

      \item \code{addmargins()} now adds dimnames for the extended
      margins in all cases, as always documented.

      \item \code{heatmap()} evaluated its \code{add.expr} argument
      in the wrong environment.  (\PR{16583})

      \item \code{require()} etc now give the correct entry of
      \code{lib.loc} in the warning about an old version of a package
      masking a newer required one.

      \item The internal deparser did not add parentheses when
      necessary,  e.g. before \code{[]} or \code{[[]]}.  (Reported by
      Lukas Stadler; additional fixes included as well).

      \item \code{as.data.frame.vector(*, row.names=*)} no longer
      produces \sQuote{corrupted} data frames from row names of incorrect
      length, but rather warns about them.  This will become an error.

      \item \code{url} connections with \code{method = "libcurl"} are
      destroyed properly. (\PR{16681})

      \item \code{withCallingHandler()} now (again) handles warnings
      even during S4 generic's argument evaluation.  (\PR{16111})

      \item \code{deparse(..., control = "quoteExpressions")}
      incorrectly quoted empty expressions.  (\PR{16686})

      \item \code{format()}ting datetime objects (\code{"POSIX[cl]?t"})
      could segfault or recycle wrongly.  (\PR{16685})

      \item \code{plot.ts(<matrix>, las = 1)} now does use \code{las}.

      \item \code{saveRDS(*, compress = "gzip")} now works as
      documented.  (\PR{16653})

      \item (Windows only) The \command{Rgui} front end did not
      always initialize the console properly, and could cause
      \R to crash.  (\PR{16698})

      \item \code{dummy.coef.lm()} now works in more cases, thanks to a
      proposal by Werner Stahel (\PR{16665}).  In addition, it now works
      for multivariate linear models (\code{"mlm"}, \code{\link{manova}})
      thanks to a proposal by Daniel Wollschlaeger.

      \item The \code{as.hclust()} method for \code{"dendrogram"}s
      failed often when there were ties in the heights.

      \item \code{reorder()} and \code{midcache.dendrogram()} now are
      non-recursive and hence applicable to somewhat deeply nested
      dendrograms, thanks to a proposal by Suharto Anggono in \PR{16424}.

      \item \code{cor.test()} now calculates very small p values
      more accurately (affecting the result only in extreme not
      statistically relevant cases).  (\PR{16704})

      \item \code{smooth(*, do.ends=TRUE)} did not always work correctly
      in \R versions between 3.0.0 and 3.2.3.

      \item \code{pretty(D)} for date-time objects \code{D} now also
      works well if \code{range(D)} is (much) smaller than a second.  In
      the case of only one unique value in \code{D}, the pretty range
      now is more symmetric around that value than previously.
      \cr
      Similarly, \code{pretty(dt)} no longer returns a length 5 vector
      with duplicated entries for \code{Date} objects \code{dt} which
      span only a few days.

      \item The figures in help pages such as \code{?points} were
      accidentally damaged, and did not appear in \R 3.2.3.
      (\PR{16708})

      \item \code{available.packages()} sometimes deleted the wrong
      file when cleaning up temporary files.  (\PR{16712})

      \item The \code{X11()} device sometimes froze on Red Hat
      Enterprise Linux 6. It now waits for \code{MapNotify} events
      instead of \code{Expose} events, thanks to Siteshwar
      Vashisht. (\PR{16497})

      \item \code{[dpqr]nbinom(*, size=Inf, mu=.)} now works as limit
      case, for \sQuote{dpq} as the Poisson.  (\PR{16727})\cr
      \code{pnbinom()} no longer loops infinitely in border cases.

      \item \code{approxfun(*, method="constant")} and hence \code{ecdf()}
      which calls the former now correctly \dQuote{predict} \code{NaN}
      values as \code{NaN}.

      \item \code{summary.data.frame()} now displays \code{NA}s in
      \code{Date} columns in all cases.  (\PR{16709})
    }
  }
}

\section{\Rlogo CHANGES IN R 3.2.3}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item Some recently-added Windows time zone names have been added
      to the conversion table used to convert these to Olson names.
      (Including those relating to changes for Russia in Oct 2014, as in
      \PR{16503}.)

      \item (Windows) Compatibility information has been added to the
      manifests for \file{Rgui.exe}, \file{Rterm.exe} and
      \file{Rscript.exe}.  This should allow \code{win.version()} and
      \code{Sys.info()} to report the actual Windows version up to
      Windows 10.

      \item Windows \code{"wininet"} FTP first tries EPSV / PASV mode
      rather than only using active mode (reported by Dan Tenenbaum).
      %% https://stat.ethz.ch/pipermail/r-devel/2015-August/071595.html

      \item \code{which.min(x)} and \code{which.max(x)} may be much
      faster for logical and integer \code{x} and now also work for long
      vectors.

      \item The \sQuote{emulation} part of \code{tools::texi2dvi()} has
      been somewhat enhanced, including supporting \code{quiet = TRUE}.
      It can be selected by \code{texi2dvi = "emulation"}.

      (Windows) MiKTeX removed its \code{texi2dvi.exe} command in Sept
      2015: \code{tools::texi2dvi()} tries \code{texify.exe} if it is
      not found.

      \item (Windows only) Shortcuts for printing and saving have
      been added to menus in \command{Rgui.exe}.  (Request of \PR{16572}.)

      \item \code{loess(..., iterTrace=TRUE)} now provides diagnostics
      for robustness iterations, and the \code{print()} method for
      \code{summary(<loess>)} shows slightly more.

      \item The included version of PCRE has been updated to 8.38, a
      bug-fix release.

      \item \code{View()} now displays nested data frames in a more
      friendly way.  (Request with patch in \PR{15915}.)
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item The included configuration code for \code{libintl} has been
      updated to that from \code{gettext} version 0.19.5.1 --- this
      should only affect how an external library is detected (and the
      only known instance is under OpenBSD).  (Wish of \PR{16464}.)

      \item \command{configure} has a new argument
      \option{--disable-java} to disable the checks for Java.

      \item The \command{configure} default for \code{MAIN_LDFLAGS} has
      been changed for the FreeBSD, NetBSD and Hurd OSes to one more
      likely to work with compilers other than \command{gcc} (FreeBSD 10
      defaults to \command{clang}).

      \item \command{configure} now supports the OpenMP flags
      \option{-fopenmp=libomp} (clang) and \option{-qopenmp} (Intel C).

      \item Various macros can be set to override the default
      behaviour of \command{configure} when detecting OpenMP: see file
      \file{config.site}.

      \item Source installation on Windows has been modified to allow
      for MiKTeX installations without \command{texi2dvi.exe}.  See file
      \file{MkRules.dist}.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{regexpr(pat, x, perl = TRUE)} with Python-style named
      capture did not work correctly when \code{x} contained \code{NA}
      strings.  (\PR{16484})

      \item The description of dataset \code{ToothGrowth} has been
      improved/corrected.  (\PR{15953})

      \item \code{model.tables(type = "means")} and hence
      \code{TukeyHSD()} now support \code{"aov"} fits without an
      intercept term.  (\PR{16437})

      \item \code{close()} now reports the status of a \code{pipe()}
      connection opened with an explicit \code{open} argument.
      (\PR{16481})

      \item Coercing a list without names to a data frame is faster if
      the elements are very long. (\PR{16467})

      \item (Unix-only) Under some rare circumstances piping the output
      from \command{Rscript} or \command{R -f} could result in
      attempting to close the input file twice, possibly crashing the
      process.  (\PR{16500})

      \item (Windows) \code{Sys.info()} was out of step with
      \code{win.version()} and did not report Windows 8.

      \item \code{topenv(baseenv())} returns \code{baseenv()} again as
      in \R 3.1.0 and earlier.  This also fixes \code{compilerJIT(3)}
      when used in \file{.Rprofile}.

      \item \code{detach()}ing the \pkg{methods} package keeps
      \code{.isMethodsDispatchOn()} true, as long as the methods
      namespace is not unloaded.% This keeps a sane state, see the reg-S4 test

      \item Removed some spurious warnings from \command{configure} about the
      preprocessor not finding header files.  (\PR{15989})

      \item \code{rchisq(*, df=0, ncp=0)} now returns \code{0} instead
      of \code{NaN}, and \code{dchisq(*, df=0, ncp=*)} also no longer
      returns \code{NaN} in limit cases (where the limit is unique).
      (\PR{16521})

      \item \code{pchisq(*, df=0, ncp > 0, log.p=TRUE)} no longer
      underflows (for ncp > ~60).

      \item \code{nchar(x, "w")} returned -1 for characters it did not
      know about (e.g.\sspace{}zero-width spaces): it now assumes 1.
      It now knows about most zero-width characters and a few more
      double-width characters.

      \item Help for \code{which.min()} is now more precise about
      behavior with logical arguments.  (\PR{16532})

      \item The print width of character strings marked as
      \code{"latin1"} or \code{"bytes"} was in some cases computed
      incorrectly.

      \item \code{abbreviate()} did not give names to the return value
      if \code{minlength} was zero, unlike when it was positive.

      \item (Windows only) \code{dir.create()} did not always warn
      when it failed to create a directory.  (\PR{16537})

      \item When operating in a non-UTF-8 multibyte locale
      (e.g.\sspace{}an East Asian locale on Windows), \code{grep()} and
      related functions did not handle UTF-8 strings properly.
      (\PR{16264})

      \item \code{read.dcf()} sometimes misread lines longer than 8191
      characters.  (Reported by Hervé Pagès with a patch.)

      \item \code{within(df, ..)} no longer drops columns whose name
      start with a \code{"."}.

      \item The built-in \code{HTTP} server converted entire
      \code{Content-Type} to lowercase including parameters which
      can cause issues for multi-part form boundaries (\PR{16541}).

      \item Modifying slots of S4 objects could fail when the
      \pkg{methods} package was not attached. (\PR{16545})

      \item \code{splineDesign(*, outer.ok=TRUE)} (\pkg{splines}) is better now
      (\PR{16549}), and \code{interpSpline()} now allows \code{sparse=TRUE}
      for speedup with non-small sizes.

      \item If the expression in the traceback was too long,
      \code{traceback()} did not report the source line number.  (Patch
      by Kirill Müller.)

      \item The browser did not truncate the display of the function when
      exiting with \code{options("deparse.max.lines")} set.
      (\PR{16581})

      \item When \code{bs(*, Boundary.knots=)} had boundary knots inside
      the data range, extrapolation was somewhat off.  (Patch by Trevor
      Hastie.)

      \item \code{var()} and hence \code{sd()} warn about
      \code{factor} arguments which are deprecated now. (\PR{16564})

      \item \code{loess(*, weights = *)} stored wrong weights and hence
      gave slightly wrong predictions for \code{newdata}.  (\PR{16587})

      \item \code{aperm(a, *)} now preserves \code{names(dim(a))}.

      \item \code{poly(x, ..)} now works when either \code{raw=TRUE} or
      \code{coef} is specified.  (\PR{16597})

      \item \code{data(package=*)} is more careful in determining the path.

      \item \code{prettyNum(*, decimal.mark, big.mark)}: fixed bug
      introduced when fixing \PR{16411}.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.2.2}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item It is now easier to use secure downloads from
      \samp{https://} URLs on builds which support them: no longer do
      non-default options need to be selected to do so.  In particular,
      packages can be installed from repositories which offer
      \samp{https://} URLs, and those listed by \code{setRepositories()}
      now do so (for some of their mirrors).

      Support for \samp{https://} URLs is available on Windows, and on
      other platforms if support for \code{libcurl} was compiled in and
      if that supports the \code{https} protocol (system installations
      can be expected to do).  So \samp{https://} support can be
      expected except on rather old OSes (an example being OS X
      \sQuote{Snow Leopard}, where a non-system version of
      \code{libcurl} can be used).

      (Windows only) The default method for accessing URLs \emph{via}
      \code{download.file()} and \code{url()} has been changed to be
      \code{"wininet"} using Windows API calls.  This changes the way
      proxies need to be set and security settings made: there have been
      some reports of \samp{ftp:} sites being inaccessible under the new default
      method (but the previous methods remain available).
    }
  }

  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{cmdscale()} gets new option \code{list.} for increased
      flexibility when a list should be returned.

      \item \command{configure} now supports \code{texinfo} version 6.0,
      which (unlike the change from 4.x to 5.0) is a minor update.
      (Wish of \PR{16456}.)

      \item (Non-Windows only) \code{download.file()} with default
      \code{method = "auto"} now chooses \code{"libcurl"} if that is
      available and a \samp{https://} or \samp{ftps://} URL is used.

      \item (Windows only) \code{setInternet2(TRUE)} is now the default.
      The command-line option \command{--internet2} and environment
      variable \env{R_WIN_INTERNET2} are now ignored.

      Thus by default the \code{"internal"} method for
      \code{download.file()} and \code{url()} uses the \code{"wininet"}
      method: to revert to the previous default use
      \code{setInternet2(FALSE)}.

      This means that \samp{https://} URLs can be read by default by
      \code{download.file()} (they have been readable by \code{file()}
      and \code{url()} since \R 3.2.0).

      There are implications for how proxies need to be set (see
      \code{?download.file}).

      \item \code{chooseCRANmirror()} and \code{chooseBioCmirror()} now
      offer HTTPS mirrors in preference to HTTP mirrors.  This changes
      the interpretation of their \code{ind} arguments: see their help
      pages.

      \item \code{capture.output()} gets optional arguments \code{type}
      and \code{split} to pass to \code{sink()}, and hence can be used to
      capture messages.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item Header \file{Rconfig.h} now defines \code{HAVE_ALLOCA_H} if
      the platform has the \file{alloca.h} header (it is needed to
      define \code{alloca} on Solaris and AIX, at least: see
      \sQuote{Writing R Extensions} for how to use it).
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item The \command{libtool} script generated by
      \command{configure} has been modified to support FreeBSD >= 10
      (\PR{16410}).
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item The HTML help page links to demo code failed due to a change
      in \R 3.2.0.  (\PR{16432})

      \item If the \code{na.action} argument was used in
      \code{model.frame()}, the original data could be
      modified. (\PR{16436})

      \item \code{getGraphicsEvent()} could cause a crash if a graphics
      window was closed while it was in use. (\PR{16438})

      \item \code{matrix(x, nr, nc, byrow = TRUE)} failed if \code{x}
      was an object of type \code{"expression"}.

      \item \code{strptime()} could overflow the allocated storage on
      the C stack when the timezone had a non-standard format much
      longer than the standard formats. (Part of \PR{16328}.)

      \item \code{options(OutDec = s)} now signals a warning (which will
      become an error in the future) when \code{s} is not a string with
      exactly one character, as that has been a documented requirement.

      \item \code{prettyNum()} gains a new option \code{input.d.mark}
      which together with other changes, e.g., the default for
      \code{decimal.mark}, fixes some \code{format()}ting variants with
      non-default \code{getOption("OutDec")} such as in \PR{16411}.

      \item \code{download.packages()} failed for \code{type} equal to
      either \code{"both"} or \code{"binary"}.  (Reported by Dan
      Tenenbaum.)

      \item The \code{dendrogram} method of \code{labels()} is much more
      efficient for large dendrograms, now using \code{rapply()}.
      (Comment #15 of \PR{15215})

      \item The \code{"port"} algorithm of \code{nls()} could give
      spurious errors.  (Reported by Radford Neal.)

      \item Reference classes that inherited from reference classes in
      another package could invalidate methods of the inherited
      class. Fixing this requires adding the ability for methods to be
      \dQuote{external}, with the object supplied explicitly as the first
      argument, named \code{.self}. See "Inter-Package Superclasses"
      in the documentation.

      \item \code{readBin()} could fail on the SPARC architecture
      due to alignment issues.  (Reported by Radford Neal.)

      \item \code{qt(*, df=Inf, ncp=.)} now uses the natural
      \code{qnorm()} limit instead of returning \code{NaN}. (\PR{16475})

      \item Auto-printing of S3 and S4 values now searches for
      \code{print()} in the base namespace and \code{show()} in the
      \pkg{methods} namespace instead of searching the global
      environment.

      \item \code{polym()} gains a \code{coefs = NULL} argument and
      returns class \code{"poly"} just like \code{poly()} which gets a
      new \code{simple=FALSE} option.  They now lead to correct
      \code{predict()}ions, e.g., on subsets of the original data.
      (\PR{16239})

      \item \code{rhyper(nn, <large>)} now works correctly. (\PR{16489})

      \item \code{ttkimage()} did not (and could not) work so was
      removed. Ditto for \code{tkimage.cget()} and
      \code{tkimage.configure()}. Added two Ttk widgets and missing
      subcommands for Tk's \code{image} command:
      \code{ttkscale()},
      \code{ttkspinbox()},
      \code{tkimage.delete()},
      \code{tkimage.height()},
      \code{tkimage.inuse()},
      \code{tkimage.type()},
      \code{tkimage.types()},
      \code{tkimage.width()}. (\PR{15372}, \PR{16450})

      \item \code{getClass("foo")} now also returns a class definition when it is
      found in the cache more than once.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.2.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{utf8ToInt()} now checks that its input is valid UTF-8
      and returns \code{NA} if it is not.

      \item \code{install.packages()} now allows \code{type = "both"}
      with \code{repos = NULL} if it can infer the type of file.

      \item \code{nchar(x, *)} and \code{nzchar(x)} gain a new argument
      \code{keepNA} which governs how the result for \code{NA}s in
      \code{x} is determined.  For \code{nzchar()} in general and
      \code{nchar()} in the \R 3.2.x series, the default
      remains \code{FALSE} which is fully back compatible.
      From \R 3.3.0, \code{nchar()}'s default will change to
      \code{keepNA = NA} and you are advised to consider this for code
      portability.

      \item \code{news()} more flexibly extracts dates from package
      \file{NEWS.Rd} files.

      \item \code{lengths(x)} now also works (trivially) for atomic
      \code{x} and hence can be used more generally as an efficient
      replacement of \code{sapply(x, length)} and similar.

      \item The included version of PCRE has been updated to 8.37, a
      bug-fix release.

      \item \code{diag()} no longer duplicates a matrix when extracting
      its diagonal.

      \item \code{as.character.srcref()} gains an argument to allow
      characters corresponding to a range of source references to be
      extracted.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{acf()} and \code{ccf()} now guarantee values strictly
      in \eqn{[-1,1]} (instead of sometimes very slightly outside). \PR{15832}.

      \item \code{as.integer("111111111111")} now gives NA (with a warning) as
      it does for the corresponding numeric or negative number
      coercions.  Further, \code{as.integer(M + 0.1)} now gives \code{M}
      (instead of NA) when M is the maximal representable integer.

      \item On some platforms \code{nchar(x, "c")} and \code{nchar(x, "w")}
      would return values (possibly \code{NA}) for inputs which were
      declared to be UTF-8 but were not, or for invalid strings without a
      marked encoding in a multi-byte locale, rather than give an
      error.  Additional checks have been added to mitigate this.

      \item \code{apply(a, M, function(u) c(X = ., Y = .))} again
      has dimnames containing "X" and "Y" (as in R < 3.2.0).

      \item (Windows only) In some cases, the \command{--clean} option
      to \command{R CMD INSTALL} could fail.  (\PR{16178})

      \item (Windows only) \code{choose.files()} would occasionally
      include characters from the result of an earlier call in
      the result of a later one.  (\PR{16270})

      \item A change in \code{RSiteSearch()} in \R 3.2.0 caused it to
      submit invalid URLs.  (\PR{16329})

      \item \command{Rscript} and command line \command{R} silently
      ignored incomplete statements at the end of a script; now they
      are reported as parse errors.  (\PR{16350})

      \item Parse data for very long strings was not stored.  (\PR{16354})

      \item \code{plotNode()}, the workhorse of the \code{plot} method
      for \code{"dendrogram"}s is no longer recursive, thanks to Suharto
      Anggono, and hence also works for deeply nested dendrograms.  (\PR{15215})

      \item The parser could overflow internally when given numbers
      in scientific format with extremely large exponents.  (\PR{16358})

      \item If the CRAN mirror was not set, \code{install.packages(type = "both")}
      and related functions could repeatedly query the user for it.
      (Part of \PR{16362})

      \item The low-level functions \code{.rowSums()} etc. did not
      check the length of their argument, so could segfault. (\PR{16367})

      \item The \code{quietly} argument of \code{library()} is now
      correctly propagated from \code{.getRequiredPackages2()}.

      \item Under some circumstances using the internal PCRE when
      building \R from source would cause external libs such as
      \code{-llzma} to be omitted from the main link.

      \item The .Primitive default methods of the logic operators, i.e.,
      \code{!}, \code{&} and \code{|}, now give correct error messages
      when appropriate, e.g., for \code{`&`(TRUE)} or \code{`!`()}.
      (\PR{16385})

      \item \code{cummax(x)} now correctly propagates \code{NA}s also
      when \code{x} is of type \code{integer} and begins with an \code{NA}.

      \item \code{summaryRprof()} could fail when the profile contained
      only two records.  (\PR{16395})

      \item HTML vignettes opened using \code{vignette()} did not support
      links into the rest of the HTML help system.  (Links worked properly
      when the vignette was opened using \code{browseVignettes()} or from
      within the help system.)

      \item \code{arima(*, xreg = .)} (for \eqn{d \ge 1}{d >= 1})
      computes estimated variances based on a the number of effective
      observations as in \R version 3.0.1 and earlier.  (\PR{16278})

      \item \code{slotNames(.)} is now correct for \code{"signature"}
      objects (mostly used internally in \pkg{methods}).

      \item On some systems, the first string comparison after
      a locale change would result in \code{NA}.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.2.0}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{anyNA()} gains a \code{recursive} argument.

      \item When \code{x} is missing and \code{names} is not false
      (including the default value), \code{Sys.getenv(x, names)} returns
      an object of class \code{"Dlist"} and hence prints tidily.

      \item (Windows.)  \code{shell()} no longer consults the
      environment variable \env{SHELL}: too many systems have been
      encountered where it was set incorrectly (usually to a path where
      software was compiled, not where it was installed).
      \env{R_SHELL}, the preferred way to select a non-default shell,
      can be used instead.

      \item Some unusual arguments to \code{embedFonts()} can now be
      specified as character vectors, and the defaults have been changed
      accordingly.

      \item Functions in the \code{Summary} group duplicate less.
      (\PR{15798})

      \item (Unix-alikes.) \code{system(cmd, input = )} now uses
      \sQuote{shell-execution-environment} redirection, which will be
      more natural if \code{cmd} is not a single command (but requires a
      POSIX-compliant shell). (Wish of \PR{15508})

      \item \code{read.fwf()} and \code{read.DIF()} gain a
      \code{fileEncoding} argument, for convenience.

      \item Graphics devices can add attributes to their description in
      \code{.Device} and \code{.Devices}.  Several of those included with
      \R use a \code{"filepath"} attribute.

      \item \code{pmatch()} uses hashing in more cases and so is faster
      at the expense of using more memory. (\PR{15697})

      \item \code{pairs()} gains new arguments to select sets of
      variables to be plotted against each other.

      \item \code{file.info(, extra_cols = FALSE)} allows a minimal set
      of columns to be computed on Unix-alikes: on some systems without
      properly-configured caching this can be significantly faster with
      large file lists.

      \item New function \code{dir.exists()} in package \pkg{base} to
      test efficiently whether one or more paths exist and are
      directories.

      \item \code{dput()} and friends gain new controls
      \samp{hexNumeric} and \samp{digits17} which output double and
      complex quantities as, respectively, binary fractions (exactly,
      see \code{sprintf("\%a")}) and as decimals with up to 17
      significant digits.

      \item \code{save()}, \code{saveRDS()} and \code{serialize()} now
      support \code{ascii = NA} which writes ASCII files using
      \code{sprintf("\%a")} for double/complex quantities.  This is
      read-compatible with \code{ascii = TRUE} but avoids
      binary->decimal->binary conversions with potential loss of
      precision.  Unfortunately the Windows C runtime's lack of C99
      compliance means that the format cannot be read correctly there in
      \R before 3.1.2.

      \item The default for \code{formatC(decimal.mark =)} has been
      changed to be \code{getOption("OutDec")}; this makes it more
      consistent with \code{format()} and suitable for use in print
      methods, e.g.\sspace{}those for classes \code{"density"}, \code{"ecdf"},
      \code{"stepfun"} and \code{"summary.lm"}.

      \code{getOption("OutDec")} is now consulted by the print method
      for class \code{"kmeans"}, by \code{cut()}, \code{dendrogram()},
      \code{plot.ts()} and \code{quantile()} when constructing labels
      and for the report from \code{legend(trace = TRUE)}.

      (In part, wish of \PR{15819}.)

      \item \code{printNum()} and hence \code{format()} and
      \code{formatC()} give a warning if \code{big.mark} and
      \code{decimal.mark} are set to the same value (period and comma
      are not uncommonly used for each, and this is a check that
      conventions have not got mixed).

      \item \code{merge()} can create a result which uses long vectors
      on 64-bit platforms.

      \item \code{dget()} gains a new argument \code{keep.source} which
      defaults to \code{FALSE} for speed (\code{dput()} and
      \code{dget()} are most often used for data objects where this can
      make \code{dget()} many times faster).

      \item Packages may now use a file of common macro definitions in
      their help files, and may import definitions from other packages.

      \item A number of macros have been added in the new
      \file{share/Rd} directory for use in package overview help pages,
      and \code{promptPackage()} now makes use of them.

      \item \code{tools::parse_Rd()} gains a new \code{permissive}
      argument which converts unrecognized macros into text.  This is
      used by \code{utils:::format.bibentry} to allow LaTeX markup to be
      ignored.

      \item \code{options(OutDec =)} can now specify a multi-byte
      character, e.g., \code{options(OutDec = "\u00b7")} in a UTF-8
      locale.

      \item \code{is.recursive(x)} is no longer true when \code{x} is an
      external pointer, a weak reference or byte code; the first enables
      \code{all.equal(x, x)} when \code{x <- getClass(.)}.

      \item \code{ls()} (aka \code{objects()}) and
      \code{as.list.environment()} gain a new argument \code{sorted}.

      \item The \code{"source"} attribute (which has not been added to
      functions by \R since before \R version 2.14.0) is no longer
      treated as special.

      \item Function \code{returnValue()} has been added to give
      \code{on.exit()} code access to a function's return value for
      debugging purposes.

      \item \code{crossprod(x, y)} allows more matrix coercions when
      \code{x} or \code{y} are vectors, now equalling
      \code{t(x) \%*\% y} in these cases (also reported by Radford Neal).
      Similarly, \code{tcrossprod(x,y)} and \code{\%*\%} work in more
      cases with vector arguments.

      \item Utility function \code{dynGet()} useful for detecting
      cycles, aka infinite recursions.

      \item The byte-code compiler and interpreter include new
      instructions that allow many scalar subsetting and assignment and
      scalar arithmetic operations to be handled more efficiently. This
      can result in significant performance improvements in scalar
      numerical code.

      \item \code{apply(m, 2, identity)} is now the same as the matrix
      \code{m} when it has \emph{named} row names.

      \item A new function \code{debuggingState()} has been added,
      allowing to temporarily turn off debugging.

      \item \code{example()} gets a new optional argument
      \code{run.donttest} and \code{tools::Rd2ex()} a corresponding
      \code{commentDonttest}, with a default such that
      \code{example(..)} in help examples will run \code{\\donttest}
      code only if used interactively (a change in behaviour).

      \item \code{rbind.data.frame()} gains an optional argument
      \code{make.row.names}, for potential speedup.

      \item New function \code{extSoftVersion()} to report on the
      versions of third-party software in use in this session.
      Currently reports versions of \code{zlib}, \code{bzlib}, the
      \code{liblzma} from \code{xz}, PCRE, ICU, TRE and the \code{iconv}
      implementation.

      A similar function \code{grSoftVersion()} in package \pkg{grDevices}
      reports on third-party graphics software.

      Function \code{tcltk::tclVersion()} reports the Tcl/Tk version.

      \item Calling \code{callGeneric()} without arguments now works
      with primitive generics to some extent.

      \item \code{vapply(x, FUN, FUN.VALUE)} is more efficient notably
      for large \code{length(FUN.VALUE)}; as extension of \PR{16061}.

      \item \code{as.table()} now allows tables with one or more
      dimensions of length 0 (such as \code{as.table(integer())}).

      \item \code{names(x) <- NULL} now clears the names of call
      and \code{\dots} objects.

      \item \code{library()} will report a warning when an insufficient
      dependency version is masking a sufficient one later on the
      library search path.

      \item A new \code{plot()} method for class \code{"raster"} has
      been added.

      \item New \code{check_packages_in_dir_changes()} function in
      package \pkg{tools} for conveniently analyzing how changing
      sources impacts the check results of their reverse dependencies.

      \item Speed-up from Peter Haverty for \code{ls()} and
      \code{methods:::.requirePackage()} speeding up package loading.
      (\PR{16133})

      \item New \code{get0()} function, combining \code{exists()} and
      \code{get()} in one call, for efficiency.

      \item \code{match.call()} gains an \code{envir} argument for
      specifying the environment from which to retrieve
      the \code{\dots} in the call, if any; this environment was wrong
      (or at least undesirable) when the \code{definition} argument was
      a function.

      \item \code{topenv()} has been made \code{.Internal()} for
      speedup, based on Peter Haverty's proposal in \PR{16140}.

      \item \code{getOption()} no longer calls \code{options()} in the main
      case.

      \item Optional use of \code{libcurl} (version 7.28.0 from Oct 2012
      or later) for Internet access:
      \itemize{
	\item \code{capabilities("libcurl")} reports if this is
	available.

	\item \code{libcurlVersion()} reports the version in use, and
	other details of the \code{"libcurl"} build including which URL
	schemes it supports.

	\item \code{curlGetHeaders()} retrieves the headers for
	\samp{http://}, \samp{https://}, \samp{ftp://} and
	\samp{ftps://} URLs: analysis of these headers can provide
	insights into the `existence' of a URL (it might for example be
	permanently redirected) and is so used in \command{R CMD
	  check --as-cran}.

	\item \code{download.file()} has a new optional method
	\code{"libcurl"} which will handle more URL schemes, follow
	redirections, and allows simultaneous downloads of multiple
	URLs.

	\item \code{url()} has a new method \code{"libcurl"} which
	handles more URL schemes and follows redirections.  The default
	method is controlled by a new option \code{url.method}, which
	applies also to the opening of URLs \emph{via} \code{file()}
	(which happens implicitly in functions such as
	\code{read.table}.)

	\item When \code{file()} or \code{url()} is invoked with a
	\code{https://} or \code{ftps://} URL which the current method
	cannot handle, it switches to a suitable method if one is
	available.
      }

      \item (Windows.) The DLLs \file{internet.dll} and
      \file{internet2.dll} have been merged.  In this version it is safe
      to switch (repeatedly) between the internal and Windows internet
      functions within an \R session.

      The Windows internet functions are still selected by flag
      \option{--internet2} or \code{setInternet2()}.  This can be
      overridden for an \code{url()} connection \emph{via} its new
      \code{method} argument.

      \code{download.file()} has new method \code{"wininet"}, selected
      as the default by \option{--internet2} or \code{setInternet2()}.

      \item \code{parent.env<-} can no longer modify the parent of a
      locked namespace or namespace imports environment.  Contributed by
      Karl Millar.

      \item New function \code{isNamespaceLoaded()} for readability and speed.

      \item \code{names(env)} now returns all the object names of an
      \code{environment} \code{env}, equivalently to
      \code{ls(env, all.names = TRUE, sorted = FALSE)} and also to
      the names of the corresponding list,
      \code{names(as.list(env, all.names = TRUE))}.
      Note that although \code{names()} returns a character vector, the
      names have no particular ordering.

      \item The memory manager now grows the heap more aggressively. This
      reduces the number of garbage collections, in particular while
      data or code are loaded, at the expense of slightly increasing the
      memory footprint.

      \item New function \code{trimws()} for removing leading/trailing
      whitespace.

      \item \code{cbind()} and \code{rbind()} now consider S4 inheritance
      during S3 dispatch and also obey \code{deparse.level}.

      \item \code{cbind()} and \code{rbind()} will delegate recursively
      to \code{methods::cbind2} (\code{methods::rbind2}) when at least
      one argument is an S4 object and S3 dispatch fails (due to
      ambiguity).

      \item (Windows.)  \code{download.file(quiet = FALSE)} now uses
      text rather than Windows progress bars in non-interactive use.

      \item New function \code{hsearch_db()} in package \pkg{utils} for
      building and retrieving the help search database used by
      \code{help.search()}, along with functions for inspecting the
      concepts and keywords in the help search database.

      \item New function \code{.getNamespaceInfo()}, a no-check version
      of \code{getNamespaceInfo()} mostly for internal speedups.

      \item The help search system now takes \samp{\keyword} entries in
      Rd files which are not standard keywords (as given in
      \file{KEYWORDS} in the \R documentation directory) as concepts.
      For standard keyword entries the corresponding descriptions are
      additionally taken as concepts.

      \item New \code{lengths()} function for getting the lengths of all
      elements in a list.

      \item New function \code{toTitleCase()} in package \pkg{tools},
      tailored to package titles.

      \item The matrix methods of \code{cbind()} and \code{rbind()}
      allow matrices as inputs which have \eqn{2^{31}}{2^31} or more
      elements.  (For \code{cbind()}, wish of \PR{16198}.)

      \item The default method of \code{image()} has an explicit check
      for a numeric or logical matrix (which was always required).

      \item \code{URLencode()} will not by default encode further URLs
      which appear to be already encoded.

      \item \code{BIC(mod)} and \code{BIC(mod, mod2)} now give non-NA
      numbers for \code{arima()} fitted models, as \code{nobs(mod)} now
      gives the number of \dQuote{used} observations for such models.
      This fixes \PR{16198}, quite differently than proposed there.

      \item The \code{print()} methods for \code{"htest"},
      \code{"pairwise.htest"} and \code{"power.htest"} objects now have
      a \code{digits} argument defaulting to (a function of)
      \code{getOption("digits")}, and influencing all printed numbers
      coherently.  Unavoidably, this changes the display of such test
      results in some cases.

      \item Code completion for namespaces now recognizes all loaded
      namespaces, rather than only the ones that are also attached.

      \item The code completion mechanism can now be replaced by a
      user-specified completer function, for (temporary) situations
      where the usual code completion is inappropriate.

      \item \code{unzip()} will now warn if it is able to detect truncation
      when unpacking a file of 4GB or more (related to \PR{16243}).

      \item \code{methods()} reports S4 in addition to S3 methods;
      output is simplified when the \code{class} argument is
      used.  \code{.S3methods()} and \code{methods::.S4methods()} report
      S3 and S4 methods separately.

      \item Higher order functions such as the \code{apply} functions
      and \code{Reduce()} now force arguments to the functions they apply
      in order to eliminate undesirable interactions between lazy
      evaluation and variable capture in closures.  This resolves
      \PR{16093}.
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item The \code{\\donttest} sections of \R's help files can be
      tested by\cr
      \command{make check TEST_DONTTEST=TRUE} .

      \item It is possible to request the use of system
      \command{valgrind} headers \emph{via} \command{configure} option
      \option{--with-system-valgrind-headers}: note the possible future
      incompatibility of such headers discussed in the 'R Installation
      and Administration' manual. (Wish of \PR{16068}.)

      \item The included version of \code{liblzma} has been updated to
      \code{xz-utils} 5.0.7 (minor bug fixes from 5.0.5).

      \item \command{configure} options \option{--with-system-zlib},
       \option{--with-system-bzlib} and \option{--with-system-pcre} are
       now the default.  For the time being there is fallback to the
       versions included in the \R sources if no system versions are
       found or (unlikely) if they are too old.

       Linux users should check that the \code{-devel} or \code{-dev}
       versions of packages \pkg{zlib}, \pkg{bzip2}/\pkg{libbz2} and
       \pkg{pcre} as well as \pkg{xz-devel}/\pkg{liblzma-dev} (or
       similar names) are installed.

       \item \command{configure} by default looks for the
       \command{texi2any} script from \pkg{texinfo} 5.1 or later, rather
       than the \command{makeinfo} program.  (\command{makeinfo} is a
       link to the Perl script \command{texi2any} in \pkg{texinfo} 5.x.)

       \item \command{R CMD INSTALL} gains an  option
       \option{--built-timestamp=STAMP} allowing 100\% reproducible
       package building, thanks to Dirk Eddelbuettel.
     }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item There is support for testing the \code{\\dontrun} and
      \code{\\donttest} parts of examples in packages.

      \code{tools::testInstalledPackage()} accepts new arguments
      \code{commentDontrun = FALSE} and \code{commentDonttest = FALSE}.

      \command{R CMD check} gains options \option{--run-dontrun} and
      \option{--run-donttest}.

      \item The \acronym{HTML} generated by \code{tools::Rd2HTML()} and
      \code{tools::toHTML()} methods is now
      \sQuote{\acronym{XHTML} 1.0 Strict}.

      \item The \pkg{compiler} package's utility function
      \code{setCompilerOptions()} now returns the old values
      invisibly. The initial optimization level can also be set with the
      environment variable \env{R_COMPILER_OPTIMIZE}.

      \item \command{R CMD build} adds a \samp{NeedsCompilation} field
      if one is not already present in the \file{DESCRIPTION} file.

      \item \command{R CMD check} gains option \option{--test-dir} to
      specify an alternative set of tests to run.

      \item \command{R CMD check} will now by default continue with
      testing after many types of errors, and will output a summary
      count of errors at the end if any have occurred.

      \item \command{R CMD check} now checks that the \samp{Title} and
      \samp{Description} fields are correctly terminated.

      \item \command{R CMD check --as-cran} now:
      \itemize{
	\item checks a \file{README.md} file can be processed: this
	needs \command{pandoc} installed.

	\item checks the existence and accessibility of URLs in the
	\file{DESCRIPTION}, \file{CITATION}, \file{NEWS.Rd} and
	\file{README.md} files and in the help files (provided the build
	has \code{libcurl} support).

	\item reports non-ASCII characters in R source files when there
	is no package encoding declared in the \file{DESCRIPTION} file.

	\item reports (apparent) S3 methods exported but not registered.

	\item reports overwriting registered S3 methods from
	base/recommended packages.  (Such methods are replaced in the
	affected package for the rest of the session, even if the
	replacing namespace is unloaded.)

	\item reports if the \code{Title} field does not appear to be in
	title case (see \sQuote{Writing R Extensions}: there may be
	false positives, but note that technical words should be
	single-quoted and will then be accepted).
      }

      Most of these checks can also be selected by environment
      variables: see the \sQuote{R Internals} manual.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item New C API utility \code{logspace_sum(logx[], n)}.

      \item Entry points \code{rbinom_mu}, \code{rnbinom_mu} and
      \code{rmultinom} are remapped (by default) to \code{Rf_rbinom_mu}
      etc.  This requires packages using them to be re-installed.

      \item \code{.C(DUP = FALSE)} and \code{.Fortran(DUP = FALSE)} are
      now ignored, so arguments are duplicated if \code{DUP = TRUE}
      would do so.  As their help has long said, \code{.Call()} is much
      preferred.

      \item New entry point \code{R_allocLD}, like \code{R_alloc} but
      guaranteed to have sufficient alignment for \code{long double}
      pointers.

      \item \code{isPairList()} now returns \code{TRUE} for DOTSXP.
    }
  }

  \subsection{WINDOWS BUILD CHANGES}{
    A number of changes to the Windows build system are in development.
    The following are currently in place.
    \itemize{
      \item Installation using external binary distributions
      of \pkg{zlib}, \pkg{bzip2}, \pkg{liblzma}, \pkg{pcre},
      \pkg{libpng}, \pkg{jpeglib} and \pkg{libtiff} is now required,
      and the build instructions have been revised.

      \item A new \command{make} target \code{rsync-extsoft} has been
      added to obtain copies of the external libraries from
      \acronym{CRAN}.

      \item Building the manuals now requires \command{texi2any} from
      \pkg{texinfo} 5.1 or later.  \acronym{CRAN} binary builds include
      the manuals, but by default builds from source will not, and they
      will be accessed from \acronym{CRAN}.  See the comments in
      \file{src/gnuwin32/MkRules.dist} for how to specify the location
      of \command{texi2any}.

      \item (Windows) Changes have been made to support an experimental
      Windows toolchain based on GCC 4.9.2.  The default toolchain
      continues to be based on GCC 4.6.3, as the new toolchain is not
      yet stable enough.  A change to a new toolchain is expected during
      the R 3.2.x lifetime.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item  (Windows) The use of macro \code{ZLIB_LIBS} in file
      \file{src/Makevars.win} (which has not been documented for a long
      time) now requires an external \file{libz.a} to be available (it is
      part of the \sQuote{goodies} used to compile Windows binary
      packages).  It would be simpler to use \code{-lz} instead.

      \item The default for option \code{pkgType} on platforms using
      binary packages is now \code{"both"}, so source packages will be
      tried if binary versions are not available or not up to date.

      There are options for what \code{install.packages(type = "both")}
      (possibly called \emph{via} \code{update.packages()}) will do if
      compilation of a source package is desirable: see \code{?options}
      (under \pkg{utils}).

      If you intend not to accept updates as source packages, you should
      use \code{update.packages(type = "binary")}.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item \code{download.file(method = "lynx")} is defunct.

      \item Building \R using the included versions of \code{zlib},
      \code{bzip2}, \code{xz} and PCRE is deprecated: these are frozen
      (bar essential bug-fixes) and will be removed for \R 3.3.0.

      \item The \command{configure} option
      \option{--with-valgrind-instrumentation=3} has been withdrawn, as
      it did not work with recent \command{valgrind} headers: it is now
      treated as level \code{2}.

      \item The \code{MethodsList} class in package \pkg{methods} had
      been deprecated in \R 2.11.0 and is defunct now.  Functions using
      it are defunct if they had been deprecated in \R 2.11.0, and are
      deprecated now, otherwise.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item Fixed two obscure bugs in pairlist subassignment, reported by
      Radford Neal as part of pqR issue 16.

      \item Fixes for bugs in handling empty arguments and argument
      matching by name in \code{log()}.

      \item \code{all.equal()} gains methods for \code{environment}s and
      \code{refClass}es.

      \item \code{[<-} and \code{[[<-} gain S4 \code{data.frame} methods
      to avoid corruption of S4 class information by the S3 methods.

      \item \code{callNextMethod()} should now work within a \code{.local}
      call when \code{\dots} is absent from \code{formals(.local)}.

      \item \code{dput(pairlist(x))} generates a call to the
      \code{pairlist} constructor instead of the \code{list}
      constructor.

      \item Fix \code{missing()} when arguments are propagated through
      \code{\dots} . (\PR{15707})

      \item \code{eigen(m)} now defaults to \code{symmetric = TRUE} even
      when the dimnames are asymmetric if the matrix is otherwise
      symmetric.  (\PR{16151})

      \item Fix issues with forwarding \code{\dots} through
      \code{callGeneric()} and \code{callNextMethod()}.  (\PR{16141})

      \item \code{callGeneric()} now works after a \code{callNextMethod()}.

      \item Subclass information is kept consistent when replacing an
      ordinary S4 class with an \dQuote{old class} \emph{via} the
      \code{S4Class} argument to \code{setOldClass()}. Thus, for
      example, a \code{data.frame} is valid for a \code{list} argument
      in the signature, and a \code{factor} is valid for \code{vector}
      arguments.

      \item In \code{qbeta()} the inversion of \code{pbeta()} is much
      more sophisticated.  This works better in corner cases some of
      which failed completely previously (\PR{15755}), or were using
      too many iterations.

      \item Auto-printing no longer duplicates objects when printing is
      dispatched to a method.

      \item \code{kmeans(x, k)} would fail when \code{nrow(x) >= 42949673}.
      (Comment 6 of \PR{15364})

      \item \sQuote{Abbreviated} locale-specific day and month names
      could have been truncated in those rare locales where there are
      the same as the full names.

      \item An irrelevant warning message from updating subclass
      information was silenced (the namespace would not be writable
      in this case).
    }
  }
}

\section{\Rlogo CHANGES IN R 3.1.3}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item The internal method of \code{download.file()} can now handle
      files larger than 2GB on 32-bit builds which support such files
      (tested on 32-bit \R running on 64-bit Windows).

      \item \code{kruskal.test()} warns on more types of suspicious input.

      \item The \code{as.dendrogram()} method for \code{"hclust"}
      objects gains a \code{check} argument protecting against memory
      explosion for invalid inputs.

      \item \code{capabilities()} has a new item \code{long.double}
      which indicates if the build uses a \code{long double} type which
      is longer than \code{double}.

      \item \code{nlm()} no longer modifies the callback argument in
      place (a new vector is allocated for each invocation, which mimics
      the implicit duplication that occurred in R < 3.1.0); note that
      this is a change from the previously documented
      behavior. (\PR{15958})

      \item \code{icuSetCollate()} now accepts \code{locale = "ASCII"}
      which uses the basic C function \code{strcmp} and so collates
      strings byte-by-byte in numerical order.

      \item \code{sessionInfo()} tries to report the OS version in use
      (not just that compiled under, and including details of Linux
      distributions).

      \item \code{model.frame()} (used by \code{lm()} and many other
      modelling functions) now warns when it drops contrasts
      from factors.  (Wish of \PR{16119})

      \item \code{install.packages()} and friends now accept the value
      \code{type = "binary"} as a synonym for the native binary type on
      the platform (if it has one).

      \item Single source or binary files can be supplied for
      \code{install.packages(type = "both")} and the appropriate type
      and \code{repos = NULL} will be inferred.

      \item New function \code{pcre_config()} to report on some of the
      configuration options of the version of PCRE in use.  In
      particular, this reports if regular expressions using
      \samp{\p{xx}} are supported.

      \item (Windows.) \code{download.file(cacheOK = FALSE)} is now
      supported when \file{internet2.dll} is used.

      \item \code{browseURL()} has been updated to work with Firefox
      36.0 which has dropped support for the \option{-remote} interface.
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item The included version of PCRE has been updated to 8.36.

      \item \command{configure} accepts \samp{MAKEINFO=texi2any} as
      another way to ensure \pkg{texinfo} 5.x is used when both 5.x and
      4.x are installed.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} now checks the packages used in
      \code{\\donttest} sections of the examples are specified in the
      \file{DESCRIPTION} file.
      (These are needed to run the examples interactively.)

      \item \command{R CMD check} checks for the undeclared use of GNU
      extensions in Makefiles, and for Makefiles with a missing final
      linefeed.

      \command{R CMD build} will correct line endings in all Makefiles,
      not just those in the \file{src} directory.

      \item \command{R CMD check} notes uses of \code{library()} and
      \code{require()} in package code: see the section
      \sQuote{Suggested packages} of \sQuote{Writing R Extensions} for
      good practice.
    }
  }
  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item The \command{configure} option
      \option{--with-valgrind-instrumentation=3} is deprecated and will
      be removed in \R 3.2.0.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item (Windows.) \command{Rscript.exe} was missing a
      manifest specifying the modern style for common controls (e.g.,
      the download progress bar).

      \item If a package had extra documentation files but no vignette,
      the HTML help system produced an empty index page.

      \item The parser now gives an error if a null character is included
      in a string using Unicode escapes. (\PR{16046})

      \item \code{qr.Q()} failed on complex arguments due to
      pre-3.0(!) typo. (\PR{16054})

      \item \code{abs()} failed with named arguments when the argument
      was complex.  (\PR{16047})

      \item \code{"noquote"} objects may now be used as columns in
      data frames.  (\PR{15997})

      \item Some values with extremely long names were printed
      incorrectly.  (\PR{15999})

      \item Extremely large exponents on zero expressed in scientific
      notation (e.g. \code{0.0e50000}) could give \code{NaN}.  (\PR{15976})

      \item \code{download.file()} reported downloaded sizes as 0KB if
      less than 1MB, only for \R 3.1.2 and only on big-endian platforms.

      \item \code{prompt()} did not escape percent signs in the
      automatically generated usage section of help files.

      \item \code{drop.terms()} dropped some of the attributes of the
      object it was working with.  (\PR{16029})

      \item (Windows.) The command completion in \command{Rgui.exe}
      messed up the console.  (\PR{15791})

      \item (Windows.) The \code{choose.files()} command returned a
      blank string when the user asked for a single file but cancelled
      the request.  (\PR{16074})

      \item \code{Math2} S4 group generics failed to correctly dispatch
      \code{"structure"}- and \code{"nonStructure"}-derived classes.

      \item \code{loadNamespace()} imposed undocumented restrictions
      on the \code{versionCheck} parameter.  (Reported by Geoff Lee.)

      \item Rare over-runs detected by AddressSanitizer in
      \code{substr()} and its replacement version have been avoided.

      \emph{Inter alia} that fix gives the documented behaviour for
      \code{substr(x, 1, 2) <- ""} (subsequently reported as
      \PR{16214}).

      \item Loading packages incorrectly defining an S4 generic followed
      by a function of the same name caused an erroneous cyclic
      namespace dependency error.

      \item Declared vignette encodings are now always passed to the
      vignette engine.

      \item Port Tomas Kalibera's fix from R-devel that restores the
      \code{loadMethod()} fast path, effectively doubling the speed of
      S4 dispatch.

      \item \code{power.t.test()} and \code{power.prop.test()} now make
      use of the \code{extendInt} option of \code{uniroot()} and hence
      work in more extreme cases.  (\PR{15792})

      \item If a package was updated and attached when its namespace was
      already loaded, it could end up with parts from one version and
      parts from the other.  (\PR{16120})

      \item \code{tools:::.Rdconv()} didn't accept \code{--encoding=} due
      to a typo.  (\PR{16121})

      \item Unix-alike builds without a suitable \command{makeinfo} were
      documented to link the missing HTML manuals to CRAN, but did not.

      \item \code{save(*, ascii=TRUE)} and \code{load()} now correctly
      deal with \code{NaN}'s.  (\PR{16137})

      \item \code{split.Date()} retains fractional representations while
      avoiding incomplete class propagation.

      \item \file{R_ext/Lapack.h} had not been updated for changes made
      by LAPACK to the argument lists of its (largely internal)
      functions \code{dlaed2} and \code{dlaed3}.  (\PR{16157})

      \item \code{RShowDoc("NEWS", "txt")} had not been updated for the
      layout changes of \R 3.1.0.

      \item The \code{xtfrm()} method for class \code{"Surv"} has been
      corrected and its description expanded.

      \item \code{mode(x) <- y} would incorrectly evaluate \code{x} before
      changing its mode. (\PR{16215})

      \item \code{besselJ(1, 2^64)} and \code{besselY(..)} now signal a
      warning, returning \code{NaN} instead of typically
      segfaulting. (Issue 3 of \PR{15554})

      \item HTML conversion of \samp{\href} markup in \file{.Rd} files
      did not remove the backslash from \samp{\\\%} and so gave an
      invalid URL.  In a related change, the \samp{\\} escape is now
      required in such URLs.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.1.2}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{embedFonts()} now defaults to
      \code{format = "ps2write"} for \file{.ps} and \file{.eps} files.
      This is available in Ghostscript 9.x (since 2010) whereas the
      previous default, \code{format = "pswrite"}, was removed in
      Ghostscript 9.10.

      \item For consistency with \code{[dpqr]norm()},
      \code{[dp]lnorm(sdlog = 0)} model a point mass at
      \code{exp(mulog)} rather than return \code{NaN} (for an error).

      \item \code{capabilities()} now reports if ICU is compiled in for
      use for collation (it is only actually used if a suitable locale
      is set for collation, and never for a \code{C} locale).

      \item (OS X only.) Package \pkg{tcltk} checks when loaded if it is
      linked against the CRAN X11-based Tcl/Tk and if so that the Tcl/Tk
      component and the X11 libraries are installed.  This allows more
      informative error messages to be given advising the installation
      of the missing component or of XQuartz.

      The \code{X11()} device and X11-based versions of the data editor
      and viewer (invoked by \code{edit()} and \code{View()} for data
      frames and matrices from command-line \R) check that the X11
      libraries are installed and if not advises installing XQuartz.

      \item \code{icuSetCollate()} allows \code{locale = "default"}, and
      \code{locale = "none"} to use OS services rather than ICU for
      collation.

      Environment variable \env{R_ICU_LOCALE} can be used to set the
      default ICU locale, in case the one derived from the OS locale is
      inappropriate (this is currently necessary on Windows).

      \item New function \code{icuGetCollate()} to report on the ICU
      collation locale in use (if any).

      \item \code{utils::URLencode()} was updated to use unreserved and
      reserved characters from RFC 3986
      (\url{http://tools.ietf.org/html/rfc3986}) instead of RFC 1738.

      \item \code{unique(warnings())} and \code{c(warnings())} are now
      supported.

      \item The Bioconductor \sQuote{version} used by
      \code{setRepositories()} now defaults to \code{3.0}. (It can be
      set at runtime \emph{via} environment variable
      \env{R_BIOC_VERSION}.)

      \item Omegahat is no longer listed as providing Windows binary
      packages, e.g. by \code{setRepositories()}.  It has no binary
      packages available for \R 3.1.x and those for earlier versions
      were 32-bit only.
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item The \command{configure} script reports on the more important
      capabilities/options which will not be compiled in.

      More types of external BLAS are recognized by name in that report.

      \item When building \R as a shared library, the
      \option{-L${R_HOME}/lib${R_ARCH}} flag is placed earlier in the
      link commands used during installation and when packages are
      installed: this helps ensure that the current build has priority
      if an \R shared library has already been installed by
      e.g.\sspace{}\command{install-libR} in a library mentioned in
      \env{LDFLAGS} (and not in \sQuote{your system's library directory}
      as documented). (Wish of \PR{15790}.)

      \item LaTeX package \pkg{upquote} is no longer required for \R's
      use of \pkg{inconsolata}.

      \item (Windows only) If both 32- and 64-bit versions of \R are
      installed, the \file{bin/R.exe} and \file{bin/Rscript.exe} executables
      now run 64-bit \R.  (To run 32-bit \R, overwrite these files
      with copies of \file{bin/i386/Rfe.exe}.)
     }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item Running \command{R CMD check} with
      \env{_R_CHECK_DEPENDS_ONLY_} true now makes the
      \samp{VignetteBuilder} packages available even if they are
      listed in \samp{Suggests}, since they are needed to recognise and
      process non-Sweave vignettes.

      \item \command{R CMD check} now reports empty \code{importFrom}
      declarations in a \file{NAMESPACE} file, as these are common
      errors (writing \code{importFrom(\var{Pkg})} where
      \code{import(\var{Pkg})} was intended).

      \item \command{R CMD check} now by default checks code usage
      directly on the package namespace without loading and attaching
      the package and its suggests and enhances.  For good practice with
      packages in the \samp{Suggests} field, see §1.1.3.1 of
      \sQuote{Writing R Extensions}.  For use of lazy-data objects in
      the package's own code, see \code{?data}.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{dmultinom()} did not handle non-finite probabilities
      correctly.

      \item \code{prettyNum(x, zero.print=*)} now also works when
      \code{x} contains \code{NA}s.

      \item A longstanding bug exhibited by \code{nlminb()} on Windows
      was traced to a compiler bug in gcc 4.6.3; a workaround has been
      put in place.  (\PR{15244} and \PR{15914}).

      \item Rendering of \code{\\command} in HTML versions of help pages
      has been improved: this is particularly evident on the help page
      for \code{INSTALL}.

      \item \code{as.hexmode(x)} and \code{as.octmode(x)} now behave
      correctly for some numeric \code{x}, e.g., \code{c(NA, 1)} or
      \code{c(1, pi)}.

      \item \code{drop1()} failed if the \code{scope} argument had
      no variables to drop.  (\PR{15935})

      \item \code{edit()} (and hence \code{fix()}) failed if
      an object had a non-character attribute named \code{"source"}
      (an attribute that had been used in \R prior to version 2.14.0).

      \item \code{callGeneric()} could fail if the generic had
      \code{\dots} as a formal argument. (\PR{15937}).

      \item Forking in package \pkg{parallel} called C entry point
      \code{exit} in the child.  This was unsafe (\code{_exit} should
      have been called), and could flush \code{stdin} of the main \R
      process (seen most often on Solaris).

      As good practice, \code{stdout} is now flushed before forking a child.

      \item \R objects such as \code{list(`a\\b` = 1)} now print correctly.

      \item \code{getAnywhere("C_pbinom")} now returns correctly a
      single object (rather than unlisting it).

      \item The \code{confint()} method for \code{nls()} fits failed it
      these has specified parameter limits despite using an algorithm
      other than \code{"port"}.  (\PR{15960})

      \item Subclassing an S4 class failed if the class required
      arguments to the generator, through its \code{initialize()} method.

      \item \code{removeSource()} did not properly handle expressions
      containing arguments that were supplied as missing, e.g.
      \code{x[i,]}. (\PR{15957})

      \item \code{as.environment(list())} now works, and
      \code{as.list()} of such an environment is now the same as
      \code{list()}. (\PR{15926})

      \item Several \pkg{tcltk} functions failed when run in unusual
      environments. (\PR{15970})

      \item \code{options(list())} now works (trivially). (\PR{15979})

      \item \code{merge(<dendrogram>, ..)} now works correctly for two
      `independent' dendrograms (\PR{15648}), and still compatibly
      \emph{via} \code{adjust = "auto"} e.g. for two branches of an
      existing dendrogram.

      \item The \code{plot} method for \code{"hclust"} objects gets an
      optional argument \code{check}; when that is true (the default) it
      checks more carefully for valid input.

      \item (Windows only) If a user chose to install 64 bit \R but not
      32 bit \R, the \file{bin/R} and \file{bin/Rscript} executables
      failed to run.  (\PR{15981})

      \item Various possible buffer overruns have been prevented,
      and missed memory protection added. (\PR{15990})

      \item \command{Rscript} no longer passes \code{--args} to
      \command{R} when there are no extra (\dQuote{user}) arguments.

      \item objects like \code{getClass("refClass")@prototype} now
      \code{print()} and \code{str()} without error.

      \item \code{identical()} now also looks at the S4 bit.

      \item \code{hist(x, breaks)} is more robust in adding a small fuzz
      to few breaks when some are very large. (\PR{15988})

      \item \code{sub()} and \code{gsub()} did not handle regular
      expressions like \code{"\\s{2,}"} properly if the text
      contained \code{NA} or non-ASCII elements in a UTF-8
      locale.  Part of this was due to a bug in the TRE library.
      (\PR{16009})

      \item \code{RShowDoc("NEWS")} now displays the PDF version.

      \item Matrices and arrays with last dimension zero did not print
      at all or incompletely.  (\PR{16012})

      \item \code{plot.histogram()} and hence \code{hist()} now respect
      the \code{xaxs}, \code{yaxs} and \code{lab} graphics parameters.
      (\PR{16021})

      \item \code{bw.SJ(x)} and other bw.*() no longer segfault when
      \code{x} contains non-finite values. (\PR{16024})

      \item \command{R CMD Rd2pdf} unintentionally ignored its
      \option{--os} option.

      \item The internal method of \code{download.file()} was not
      reporting file sizes and progress correctly on files larger than
      2GB (inherited from \code{libxml2}).  This is corrected for 64-bit
      builds (32-bit platforms may not support such files, but where
      possible will be supported in future versions of \R).

      \item Work around a bug in OS X Yosemite where key environment
      variables may be duplicated causing issues in subprocesses. The
      duplicates are now removed on \R startup (\emph{via}
      Rprofile). (\PR{16042})

      \item Adjust X11 auto-launch detection in DISPLAY on OS X to
      recognize latest XQuartz.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.1.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item When \code{attach()} reports conflicts, it does so
      compatibly with \code{library()} by using \code{message()}.

      \item \command{R CMD Sweave} no longer cleans any files by
      default, compatibly with versions of \R prior to 3.1.0.  There are
      new options \option{--clean}, \option{--clean=default} and
      \option{--clean=keepOuts}.

      \item \code{tools::buildVignette()} and \code{tools::buildVignettes()}
      with \code{clean = FALSE} no longer remove any created files.
      \code{buildvignette()} gains a \code{keep} argument for more
      cleaning customization.

      \item The Bioconductor \sQuote{version} used by
      \code{setRepositories()} can now be set by environment variable
      \env{R_BIOC_VERSION} at runtime, not just when \R is installed.
      (It has been stated that Bioconductor will switch from
      \sQuote{version} 2.14 to \sQuote{version} 3.0 during the lifetime
      of the \R 3.1 series.)

      \item Error messages from bugs in embedded \samp{Sexpr} code
      in Sweave documents now report the source location.

      \item \code{type.convert()}, \code{read.table()} and similar
      \code{read.*()} functions get a new \code{numerals} argument,
      specifying how numeric input is converted when its conversion to
      double precision loses accuracy.  The default value,
      \code{"allow.loss"} allows accuracy loss, as in \R versions before
      3.1.0.

      \item For some compilers, integer addition could overflow without
      a warning.  \R's internal code for both integer addition and
      subtraction is more robust now.  (\PR{15774})

      \item The function determining the default number of knots for
      \code{smooth.spline()} is now exported, as \code{.nknots.smspl()}.

      \item \code{dbeta(, a,b)}, \code{pbeta()}, \code{qbeta()} and
      \code{rbeta()} are now defined also for \eqn{a = 0}, \eqn{b = 0},
      or infinite \eqn{a} and \eqn{b} (where they typically returned
      \code{NaN} before).

      \item Many package authors report that the RStudio graphics device
      does not work correctly with their package's use of
      \code{dev.new()}.  The new option \code{dev.new(noRStudioGD =
      TRUE)} replaces the RStudio override by the default device as
      selected by \R itself, still respecting environment variables
      \env{R_INTERACTIVE_DEVICE} and \env{R_DEFAULT_DEVICE}.

      \item \code{readRDS()} now returns visibly.

      \item Modifying internal logical scalar constants now results in
      an error instead of a warning.

      \item \code{install.packages(repos = NULL)} now accepts
      \samp{http://} or \samp{ftp://} URLs of package archives as well
      as file paths, and will download as required.  In most cases
      \code{repos = NULL} can be deduced from the extension of the URL.

      \item The warning when using partial matching with the \code{$}
      operator on data frames is now only given when
      \code{options("warnPartialMatchDollar")} is \code{TRUE}.

      \item Package help requests like \code{package?foo} now
      try the package \code{foo} whether loaded or not.

      \item General help requests now default to trying all loaded
      packages, not just those on the search path.

      \item Added a new function \code{promptImport()}, to generate a
      help page for a function that was imported from another package
      (and presumably re-exported, or help would not be needed).
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item \command{configure} option \option{--with-internal-tzcode}
      can now be used with variable \code{rsharedir}.

      \item The included version of PCRE has been updated to 8.35.

      \item There is a new target \command{make uninstall-libR} to
      remove an installed shared/static \file{libR}.

      \command{make install-libR} now works if a sub-architecture is
      used, although the user will need to specify \code{libdir}
      differently for different sub-architectures.

      \item There is more extensive advice on which LaTeX packages are
      required to install \R or to make package manuals (as done by
      \command{R CMD check}) in the \sQuote{Writing R Extensions}
      manual.

      \item Compilers/linkers were handling the visibility control in
      \file{src/extra/xz} inconsistently (and apparently in some cases
      incorrectly), so it has been simplified.  (\PR{15327})

      \item (Windows)  There is updated support for the use of ICU for
      collation: see the \sQuote{R Installation and Administration Manual}.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{dbinom(x, n)}, \code{pbinom()}, \code{dpois()}, etc,
      are slightly less restrictive in checking if \code{n} is
      integer-valued.  (Wish of \PR{15734}.)

      \item \code{pchisq(x, df, ncp, log.p = TRUE)} is more accurate and
      no longer underflows for small \code{x} and \code{ncp < 80}, e.g,
      for \code{pchisq(1e-5, df = 100, ncp = 1, log = TRUE)}.
      (Based on \PR{15635} and a suggestion by Roby Joehanes.)

      \item The \code{s} (\dQuote{step into}) command in the debugger
      would cause \R to step into expressions evaluated there,
      not just into functions being debugged.  (\PR{15770})

      \item The C code used by \code{strptime()} rejected time-zone
      offsets of more than \code{+1200} (\code{+1245}, \code{+1300} and
      \code{+1400} can occur).  (\PR{15768})

      \item (Windows only.)
      \code{png(type = "cairo", antialias = "gray")}
      was not accepted.  (\PR{15760})

      \item Use of \code{save(..., envir=)} with named objects could
      fail.  (\PR{15758})

      \item \code{Sweave()} mis-parsed \samp{Sexpr} expressions that
      contained backslashes.  (\PR{15779})

      \item The return value from \code{options(foo = NULL)} was not
      the previous value of the option.  (\PR{15781})

      \item \code{enc2utf8()} and \code{enc2native()} did not always
      mark the encoding of the return values when it was known.

      \item \code{dnbinom(x, size = <large>, mu, log = TRUE)} no longer
      underflows to -Inf for large \code{mu}, thanks to a suggestion
      from Alessandro Mammana (MPI MolGen, Berlin).

      \item \code{pbeta(x, a, b, log = TRUE)} no longer behaves
      discontinuously (in a small x-region) because of denormalized
      numbers.  Also, \code{pbeta(1-1e-12, 1e30, 1.001, log=TRUE)} now
      terminates \dQuote{in real time}.

      \item The \code{"CRAN"} filter (see \code{available.packages()})
      no longer removes duplicates other than of packages on CRAN, and
      does not fail if there is no CRAN repository in
      \code{getOption("repos")}.

      \item The device listing from \code{dev2bitmap()} and
      \code{bitmap()} was truncated to 1000 characters: modern versions
      of GhostScript on most platforms have many more devices.

      \item (Windows.)  Commands such as \code{Sys.which()} and
      \code{pipe()} which needed to find the full path to a command
      could segfault if the \sQuote{long} path name was much longer than
      the \sQuote{short} path name (which \code{Sys.which()} returns),
      as the behaviour of the Windows API call had changed.

      \item \command{R CMD build} will fail with an error if one of the
      packages specified in the \samp{VignetteBuilder} field is not
      installed.  (Without loading those packages it cannot be
      ascertained which files are intended to be vignettes. This means
      that the \samp{VignetteBuilder} packages have to be installed for
      package checking too.)
      (Wish of \PR{15775}.)

      \item Misguided attempts to use \code{chull()} with non-finite
      points now give an error (related to \PR{15777}).

      \item For a formula with exactly 32 variables the 32nd variable
      was aliased to the intercept in some C-level computations of
      terms, so that for example attempting to remove it would remove
      the intercept instead (and leave a corrupt internal structure).
      (\PR{15735})

      \item \code{anyDuplicated()} silently returned wrong values when
      the first duplicate was at an index which was too large to be
      stored in an integer vector (although a lot of RAM and patience
      would have been needed to encounter this).

      \item \code{tools::Rd2ex(commentDontrun = FALSE)} failed if the
      block had only one line.

      \item Hexadecimal constants such as \code{0x110p-5L} which were
      incorrectly qualified by \code{L} were parsed incorrectly since \R
      3.0.0, with a slightly garbled warning. (\PR{15753})

      \item \code{system()} returned success on some platforms even if
      the system was unable to launch a process. (\PR{15796})

      \item (Windows \command{Rgui} console.)  Unbuffered output was
      sometimes not output immediately if the prompt was not on the last
      line of the console.

      \item The built-in help server did not declare the encoding for
      the \file{DESCRIPTION} or other text files to be the package
      encoding, so non-ASCII characters could be displayed incorrectly.

      \item \R{} is now trying harder to not cleanup child processes
      that were not spawned by \code{mcparallel()} on platforms that
      provide information about the source process of the \code{SIGCHLD}
      signal. This allows 3rd party libraries to manage the exit status
      of children that they spawn without \R{} interfering.

      \item \code{mcmapply()} was only parallelizing if the number of
      jobs was bigger than the number of cores. It now parallelizes if
      the number of jobs is more than one.

      \item Auto-printing would re-evaluate its argument when trying to
      dispatch to a print method.  This is now avoided when possible.

      \item Unserializing (including \code{load()} and \code{readRDS()})
      could silently return incorrect numeric values from ASCII saves if
      there was a read error.

      \item \code{getParseData()} could return incorrect values for
      the parents of some elements. (Reported by Andrew Redd.)

      \item Attempting to use data frames of 2^31 or more rows with
      \code{merge()} or to create a merged data frame of that size now
      gives a clearer error message.

      \item \code{parse()} did not check its \code{file} argument was a
      connection if it was not a character string, so
      e.g.\sspace{}\code{parse(FALSE)} attempted to read from \code{stdin}.

      Nor did \code{dump()} and \code{dput()}.

      \item The \code{"help.try.all.packages"} option was ignored when
      the shortcut syntax for help was used, e.g.\sspace{}\code{?foo}.

      \item A potential segfault in string allocation has been fixed.
      (Found by Radford Neal.)

      \item Potential memory protection errors in \code{sort()} and
      \code{D()} have been fixed. (Found by Radford Neal.)

      \item Fixed a lack of error checking in graphics event functions.
      (Found by Radford Neal; a different patch used here than the
      one in pqR.)

      \item \code{numericDeriv()} sometimes miscalculated the gradient.
      (\PR{15849}, reported originally by Radford Neal)
    }
  }
}

\section{\Rlogo CHANGES IN R 3.1.0}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{type.convert()} (and hence by default
      \code{read.table()}) returns a character vector or factor when
      representing a numeric input as a double would lose accuracy.
      Similarly for complex inputs.

      If a file contains numeric data with unrepresentable numbers of
      decimal places that are intended to be read as numeric, specify
      \code{colClasses} in \code{read.table()} to be \code{"numeric"}.

      \item \code{tools::Rdiff(useDiff = FALSE)} is closer to the POSIX
      definition of \command{diff -b} (as distinct from the description
      in the \command{man} pages of most systems).

      \item New function \code{anyNA()}, a version of
      \code{any(is.na(.))} which is fast for atomic vectors, based on a
      proposal by Tim Hesterberg. (Wish of \PR{15239}.)

      \item \code{arrayInd(*, useNames = TRUE)} and, analogously,
      \code{which(*, arr.ind = TRUE)} now make use of
      \code{names(.dimnames)} when available.

      \item \code{is.unsorted()} now also works for \code{raw} vectors.

      \item The \code{"table"} method for \code{as.data.frame()} (also
      useful as \code{as.data.frame.table()}) now passes \code{sep} and
      \code{base} arguments to \code{provideDimnames()}.

      \item \code{uniroot()} gets new optional arguments, notably
      \code{extendInt}, allowing to auto-extend the search interval when
      needed.  The return value has an extra component, \code{init.it}.

      % advertize at all?
      % \item New \code{.lm.fit()} for benchmark lovers but not Joe
      % Average.

      %% TODO: change in ../src/library/compiler/noweb/compiler.nw + ..../R/cmp.R
      \item \code{switch(f, ...)} now warns when \code{f} is a factor,
      as this typically happens accidentally where the useR meant to
      pass a character string, but \code{f} is treated as integer (as
      always documented).

      \item The parser has been modified to use less memory.

      \item The way the unary operators (\code{+ - !}) handle attributes
      is now more consistent.  If there is no coercion, all attributes
      (including class) are copied from the input to the result:
      otherwise only names, dims and dimnames are.

      \item \code{colorRamp()} and \code{colorRampPalette()} now allow
      non-opaque colours and a ramp in opacity \emph{via} the new argument
      \code{alpha = TRUE}.  (Suggested by Alberto Krone-Martins, but
      optionally as there are existing uses which expect only RGB values.)
      % https://stat.ethz.ch/pipermail/r-devel/2013-July/067046.html

      \item \code{grid.show.layout()} and \code{grid.show.viewport()}
      get an optional \code{vp.ex} argument.

      \item There is a new function \code{find_gs_cmd()} in the
      \pkg{tools} package to locate a GhostScript executable.  (This is
      an enhanced version of a previously internal function there.)

      \item \code{object.size()} gains a \code{format()} method.

      \item There is a new family, \code{"ArialMT"}, for the
      \code{pdf()} and \code{postscript()} devices.  This will only be
      rendered correctly on viewers which have access to Monotype
      TrueType fonts (which are sometimes requested by journals).

      \item The text and PDF news files, including \file{NEWS} and
      \file{NEWS.2}, have been moved to the \file{doc} directory.

      \item \code{combn(x, simplify = TRUE)} now gives a factor result
      for factor input \code{x} (previously user error).
      (Related to \PR{15442}.)

      \item Added \code{utils::fileSnapshot()} and
      \code{utils::changedFiles()} functions to allow snapshots and
      comparison of directories of files.

      \item \code{make.names(names, unique=TRUE)} now tries to preserve
      existing names. (Suggestion of \PR{15452}.)

      \item New functions \code{cospi(x)}, \code{sinpi(x)}, and
      \code{tanpi(x)}, for more accurate computation of
      \code{cos(pi*x)}, etc, both in \R{} and the C API.  Using these
      gains accuracy in some cases, e.g., inside \code{lgamma()} or
      \code{besselI()}.  (Suggested by Morten Welinder in \PR{15529}.)

      \item \code{print.table(x, zero.print = ".")} now also has an
      effect when \code{x} is not integer-valued.

      \item There is more support to explore the system's idea of
      time-zone names.  \code{Sys.timezone()} tries to give the current
      system setting by name (and succeeds at least on Linux, OS X,
      Solaris and Windows), and \code{OlsonNames()} lists the names in
      the system's Olson database. \code{Sys.timezone(location = FALSE)}
      gives the previous behaviour.

      \item Platforms with a 64-bit \code{time_t} type are allowed to
      handle conversions between the \code{"POSIXct"} and
      \code{"POSIXlt"} classes for date-times outside the 32-bit range
      (before 1902 or after 2037): the existing workarounds are used on
      other platforms.  (Note that time-zone information for post-2037
      is speculative at best, and the OS services are tested for known
      errors and so not used on OS X.)

      Currently \code{time_t} is usually \code{long} and hence 64-bit on
      Unix-alike 64-bit platforms: however in several cases the
      time-zone database is 32-bit.  For \R for Windows it is 64-bit
      (for both architectures as from this version).

      \item The \code{"save.defaults"} option can include a value for
      \code{compression_level}.  (Wish of \PR{15579}.)

      \item \code{colSums()} and friends now have support for arrays and
      data-frame columns with \eqn{2^{31}}{2^31} or more elements.

      \item \code{as.factor()} is faster when \code{f} is an unclassed
      integer vector (for example, when called from \code{tapply()}).

      \item \code{fft()} now works with longer inputs, from the 12
      million previously supported up to 2 billion.  (\PR{15593})

      \item Complex \code{svd()} now uses LAPACK subroutine
      \code{ZGESDD}, the complex analogue of the routine used for the
      real case.

      \item Sweave now outputs \file{.tex} files in UTF-8 if the
      input encoding is declared to be UTF-8, regardless of the
      local encoding.  The UTF-8 encoding may now be declared using
      a LaTeX comment containing the string \code{\%\\SweaveUTF8}
      on a line by itself.

      \item \code{file.copy()} gains a \code{copy.date} argument.

      \item Printing of date-times will make use of the time-zone
      abbreviation in use at the time, if known.  For example, for Paris
      pre-1940 this could be \samp{LMT}, \samp{PMT}, \samp{WET} or
      \samp{WEST}.  To enable this, the \code{"POSIXlt"} class has an
      optional component \code{"zone"} recording the abbreviation for
      each element.

      For platforms which support it, there is also a component
      \code{"gmtoff"} recording the offset from GMT where known.

      \item (On Windows, by default on OS X and optionally elsewhere.)
      The system C function \code{strftime} has been replaced by a more
      comprehensive version with closer conformance to the POSIX 2008
      standard.

      \item \code{dnorm(x, log = FALSE)} is more accurate (but somewhat
      slower) for |x| > 5; as suggested in \PR{15620}.

      \item Some versions of the \code{tiff()} device have further
      compression options.

      \item \code{read.table()}, \code{readLines()} and \code{scan()}
      have a new argument to influence the treatment of embedded nuls.

      \item Avoid duplicating the right hand side values in complex
      assignments when possible.  This reduces copying of replacement
      values in expressions such as \code{Z$a <- a0} and
      \code{ans[[i]] <- tmp}: some package code has relied on there
      being copies.

      Also, a number of other changes to reduce copying of objects; all
      contributed by or based on suggestions by Michael Lawrence.

      \item The \code{fast} argument of \code{KalmanLike()},
      \code{KalmanRun()} and \code{KalmanForecast()} has been replaced
      by \code{update}, which instead of updating \code{mod} in place,
      optionally returns the updated model in an attribute \code{"mod"}
      of the return value.

      \item \code{arima()} and \code{makeARIMA()} get a new optional
      argument \code{SSinit}, allowing the choice of a different
      \bold{s}tate \bold{s}pace initialization which has been observed
      to be more reliable close to non-stationarity: see \PR{14682}.

      \item \code{warning()} has a new argument \code{noBreaks.}, to
      simplify post-processing of output with \code{options(warn = 1)}.

      \item \code{pushBack()} gains an argument \code{encoding}, to
      support reading of UTF-8 characters using \code{scan()},
      \code{read.table()} and related functions in a non-UTF-8 locale.

      \item \code{all.equal.list()} gets a new argument \code{use.names}
      which by default labels differing components by names (if they
      match) rather than by integer index.  Saved \R output in packages may
      need to be updated.

      \item The methods for \code{all.equal()} and
      \code{attr.all.equal()} now have argument \code{check.attributes}
      after \code{\dots} so it cannot be partially nor positionally
      matched (as it has been, unintentionally).

      A side effect is that some previously undetected errors of passing
      empty arguments (no object between commas) to \code{all.equal()}
      are detected and reported.

      There are explicit checks that \code{check.attributes} is logical,
      \code{tolerance} is numeric and \code{scale} is \code{NULL} or
      numeric.  This catches some unintended positional matching.

      The message for \code{all.equal.numeric()} reports a
      \code{"scaled difference"} only for \code{scale != 1}.

      \item \code{all.equal()} now has a \code{"POSIXt"} method
      replacing the \code{"POSIXct"} method.

      \item The \code{"Date"} and \code{"POSIXt"} methods of
      \code{seq()} allows \code{by = "quarter"} for completeness
      (\code{by = "3 months"} always worked).

      \item \code{file.path()} removes any trailing separator on
      Windows, where they are invalid (although sometimes accepted).
      This is intended to enhance the portability of code written by
      those using POSIX file systems (where a trailing \code{/} can be
      used to confine path matching to directories).

      \item New function \code{agrepl()} which like \code{grepl()}
      returns a logical vector.

      \item \code{fifo()} is now supported on Windows. (\PR{15600})

      \item \code{sort.list(method = "radix")} now allows negative
      integers (wish of \PR{15644}).

      \item Some functionality of \code{print.ts()} is now available in
      \code{.preformat.ts()} for more modularity.% and format.ts() might follow

      \item \code{mcparallel()} gains an option \code{detach = TRUE}
      which allows execution of code independently of the current
      session.  It is based on a new \code{estranged = TRUE} argument to
      \code{mcfork()} which forks child processes such that they become
      independent of the parent process.

      \item The \code{pdf()} device omits circles and text at extremely
      small sizes, since some viewers were failing on such files.

      \item The rightmost break for the \code{"months"},
      \code{"quarters"} and \code{"years"} cases of
      \code{hist.POSIXlt()} has been increased by a day.  (Inter alia,
      fixes \PR{15717}.)

      \item The handling of \code{DF[i,] <- a} where \code{i} is of
      length 0 is improved.  (Inter alia, fixes \PR{15718}.)

      \item \code{hclust()} gains a new method \code{"ward.D2"} which
      implements Ward's method correctly.  The previous \code{"ward"}
      method is \code{"ward.D"} now, with the old name still working.
      Thanks to research and proposals by Pierre Legendre.

      \item The \code{sunspot.month} dataset has been amended and
      updated from the official source, whereas the \code{sunspots} and
      \code{sunspot.year} datasets will remain immutable. The
      documentation and source links have been updated correspondingly.

      \item The \code{summary()} method for \code{"lm"} fits warns if
      the fit is essentially perfect, as most of the summary may be
      computed inaccurately (and with platform-dependent values).

      Programmers who use \code{summary()} in order to extract just
      a component which will be reliable (e.g., \code{$cov.unscaled})
      should wrap their calls in \code{suppressWarnings()}.
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item The included version of LAPACK has been updated to 3.5.0.

      \item There is some support for parallel testing of an
      installation, by setting \env{TEST_MC_CORES} to an integer
      greater than one to indicate the maximum number of cores to be
      used in parallel. (It is worth specifying at least 8 cores if
      available.)  Most of these require a \command{make} program (such
      as GNU \command{make} and \command{dmake}) which supports the
      \command{${MAKE} -j nproc} syntax.

      Except on Windows: the tests of standard package examples in
      \command{make check} are done in parallel.  This also applies to
      running \code{tools::testInstalledPackages()}.

      The more time-consuming regression tests are done in parallel.

      The package checks in \command{make check-devel} and \command{make
	check-recommended} are done in parallel.

      \item More of \command{make check} will work if recommended packages
      are not installed: but recommended packages remain needed for
      thorough checking of an \R build.

      \item The version of \samp{tzcode} included in
      \file{src/extra/tzone} has been updated.  (Formerly used only on
      Windows.)

      \item The included (64-bit) time-zone conversion code and Olson
      time-zone database can be used instead of the system version: use
      \command{configure} option \option{--with-internal-tzcode}.  This
      is the default on Windows and OS X.  (Note that this does not
      currently work if a non-default \code{rsharedir}
      \command{configure} variable is used.)

      (It might be necessary to set environment variable \env{TZ} on
      OSes where this is not already set, although the system timezone is
      deduced correctly on at least Linux, OS X and Windows.)

      This option also switches to the version of \code{strftime}
      included in directory \file{src/extra/tzone}.

      \item \command{configure} now tests for a C++11-compliant compiler
      by testing some basic features.  This by default tries flags for
      the compiler specified by \samp{CXX}, but an alternative compiler,
      options and standard can be specified by variables \samp{CXX1X},
      \samp{CXX1XFLAGS} and \samp{CXX1XSTD} (e.g., \samp{-std=gnu++11}).

      \item \R{} can now optionally be compiled to use reference
      counting instead of the \code{NAMED} mechanism by defining
      \code{SWITCH_TO_REFCNT} in \file{Rinternals.h}. This may become
      the default in the future.

      \item There is a new option \option{--use-system-tre} to use a
      suitable system \pkg{tre} library: at present this means a version
      from their \command{git} repository, after corrections.
      (Wish of \PR{15660}.)
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item The \code{CRANextra} repository is no longer a default
      repository on Windows: all the binary versions of packages from
      CRAN are now on CRAN, although \code{CRANextra} contains packages
      from Omegahat and elsewhere used by CRAN packages.

      \item Only vignettes sources in directory \file{vignettes} are
      considered to be vignettes and hence indexed as such.

      \item In the \file{DESCRIPTION} file, \preformatted{    License: X11}
      is no longer recognized as valid.  Use \samp{MIT} or
      \samp{BSD_2_clause} instead, both of which need \samp{+ file LICENSE}.

      \item For consistency, entries in \file{.Rinstignore} are now matched
      case-insensitively on all platforms.

      \item Help for S4 methods with very long signatures now tries
      harder to split the description in the \samp{Usage} field to no
      more than 80 characters per line (some packages had over 120
      characters).

      \item \command{R CMD INSTALL --build} (not Windows) now defaults to
      the internal \code{tar()} unless \env{R_INSTALL_TAR} is set.

      \item There is support for compiling C++11 code in packages on
      suitable platforms: see \sQuote{Writing R Extensions}.

      \item Fake installs now install the contents of directory
      \file{inst}: some packages use this to install e.g.\sspace{}C++ headers
      for use by other packages that are independent of the package
      itself.  Option \option{--no-inst} can be used to get the previous
      behaviour.
    }
  }

  \subsection{DEBUGGING}{
    \itemize{
      \item The behaviour of the code browser has been made more
      consistent, in part following the suggestions in \PR{14985}.

      \item Calls to \code{browser()} are now consistent with calls
      to the browser triggered by \code{debug()}, in that \kbd{Enter}
      will default to \code{n} rather than \code{c}.

      \item A new browser command \code{s} has been added, to
      \dQuote{step into} function calls.

      \item A new browser command \code{f} has been added, to
      \dQuote{finish} the current loop or function.

      \item Within the browser, the command \code{help} will
      display a short list of available commands.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item Only vignettes sources in directory \file{vignettes} are
      considered to be vignettes by \command{R CMD check}.  That has
      been the preferred location since \R 2.14.0 and is now obligatory.

      \item For consistency, \command{R CMD build} now matches entries
      in \file{.Rbuildignore}  and \file{vignettes/.install_extras}
      case-insensitively on all platforms (not just on Windows).

      \item \code{checkFF()} (called by \command{R CMD check} by
      default) can optionally check foreign function calls for
      consistency with the registered type and argument count.  This is
      the default for \command{R CMD check --as-cran} or can be enabled
      by setting environment variable \env{_R_CHECK_FF_CALLS_} to
      \samp{registration} (but is in any case suppressed by
      \option{--install=no}).   Because this checks calls in which
      \code{.NAME} is an \R object and not just a literal character
      string, some other problems are detected for such calls.

      Functions \code{suppressForeignCheck()} and \code{dontCheck()}
      have been added to allow package authors to suppress false
      positive reports.

      \item \command{R CMD check --as-cran} warns about a false value of
      the \file{DESCRIPTION} field \samp{BuildVignettes} for Open Source
      packages, and ignores it.  (An Open Source package needs to have
      complete sources for its vignettes which should be usable on a
      suitably well-equipped system).

      \item \command{R CMD check --no-rebuild-vignettes} is defunct:\cr
      \command{R CMD check --no-build-vignettes} has been preferred since
      \R 3.0.0.

      \item \command{R CMD build --no-vignettes} is defunct:\cr
      \command{R CMD build --no-build-vignettes} has been preferred since
      \R 3.0.0.

      \item \command{R CMD Sweave} and \command{R CMD Stangle} now
      process both Sweave and non-Sweave vignettes.  The
      \code{tools::buildVignette()} function has been added to do the
      same tasks from within \R.

      \item The flags returned by \command{R CMD config --ldflags} and
      (where installed) \command{pkg-config --libs libR} are now those
      needed to link a front-end against the (shared or static) \R
      library.

      \item \file{Sweave.sty} has a new option \samp{[inconsolata]}.

      \item \command{R CMD check} customizations such as
      \env{_R_CHECK_DEPENDS_ONLY_} make available packages only in
      \samp{LinkingTo} only for installation, and not for
      loading/runtime tests.

      \item \command{tools::checkFF()} reports on \code{.C} and
      \code{.Fortran} calls with \code{DUP = FALSE} if argument
      \code{check_DUP} is true.  This is selected by
      \command{R CMD check} by default.

      \item \command{R CMD check --use-gct} can be tuned to
      garbage-collect less frequently using \code{gctorture2()}
      \emph{via} the setting of environment variable
      \env{_R_CHECK_GCT_N_}.

      \item Where supported, \code{tools::texi2dvi()} limits the number
      of passes tried to 20.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item (Windows only) A function \code{R_WaitEvent()} has been
      added (with declaration in header\file{R.h}) to block execution
      until the next event is received by \R.

      \item Remapping in the \file{Rmath.h} header can be suppressed by
      defining \samp{R_NO_REMAP_RMATH}.

      \item The remapping of \code{rround()} in header \file{Rmath.h}
      has been removed: use \code{fround()} instead.

      \item \code{ftrunc()} in header \file{Rmath.h} is now a wrapper
      for the C99 function \code{trunc()}, which might as well be used
      in C code: \code{ftrunc()} is still needed for portable C++ code.

      \item The never-documented remapping of \code{prec()} to
      \code{fprec()} in header \file{Rmath.h} has been removed.

      \item The included LAPACK subset now contains \code{ZGESDD} and
      \code{ZGELSD}.

      \item The function \code{LENGTH()} now checks that it is only
      applied to vector arguments.  However, in packages \code{length()}
      should be used. (In \R{} itself \code{LENGTH()} is a macro without
      the function overhead of \code{length()}.)

      \item Calls to \code{SET_VECTOR_ELT()} and \code{SET_STRING_ELT()}
      are now checked for indices which are in-range: several packages
      were writing one element beyond the allocated length.

      \item \code{allocVector3} has been added which allows custom
      allocators to be used for individual vector allocations.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item \code{chol(pivot = TRUE, LINPACK = TRUE)} is defunct.

      Arguments \code{EISPACK} for \code{eigen()} and \code{LINPACK} for
      \code{chol()}, \code{chol2inv()}, \code{solve()} and \code{svd()}
      are ignored: LAPACK is always used.

      \item \code{.find.package()} and \code{.path.package()} are
      defunct: only the versions without the initial dot introduced in
      \R 2.13.0 have ever been in the API.

      \item Partial matching when using the \code{$} operator \emph{on
	data frames} now throws a warning and may become defunct in the
      future. If partial matching is intended, replace \code{foo$bar}
      by \code{foo[["bar", exact = FALSE]]}.

      \item The long-deprecated use of \code{\\synopsis} in the
      \samp{Usage} section of \file{.Rd} files has been removed: such
      sections are now ignored (with a warning).

      \item \code{package.skeleton()}'s deprecated argument
      \code{namespace} has been removed.

      \item Many methods are no longer exported by package \pkg{stats}.
      They are all registered on their generic, which should be called
      rather than calling a method directly.

      \item Functions \code{readNEWS()} and \code{checkNEWS()} in
      package \pkg{tools} are defunct.

      \item \code{download.file(method = "lynx")} is deprecated.

      \item \code{.C(DUP = FALSE)} and \code{.Fortran(DUP = FALSE)} are
      now deprecated, and may be disabled in future versions of \R.  As
      their help has long said, \code{.Call()} is much preferred.

      \command{R CMD check} notes such usages (by default).

      \item The workaround of setting \env{R_OSX_VALGRIND} has been
      removed: it is not needed in current valgrind.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item Calling \code{lm.wfit()} with no non-zero weights gave an
      array-overrun in the Fortran code and a not very sensible answer.
      It is now special-cased with a simpler answer (no \code{qr}
      component).

      \item Error messages involving non-syntactic names (e.g., as produced
      by \code{`\\r`} when that object does not exist) now encode
      the control characters.  (Reported by Hadley Wickham.)

      \item \code{getGraphicsEvent()} caused 100\% usage of one CPU in
      Windows. (\PR{15500})

      \item \code{nls()} with no \code{start} argument may now work
      inside another function (scoping issue).

      \item \code{pbeta()} and similar work better for very large
      (billions) \code{ncp}.

      \item Where time zones have changed abbreviations over the years,
      the software tries to more consistently use the abbreviation
      appropriate to the time or if that is unknown, the current
      abbreviation.  On some platforms where the C function
      \code{localtime} changed the \code{tzname} variables the reported
      abbreviation could have been that of the last time converted.

      \item \code{all.equal(list(1), identity)} now works.

      \item Bug fix for pushing viewports in \pkg{grid} (reported by
      JJ Allaire and Kevin Ushey).

      NOTE for anyone poking around within the graphics engine display
      list (despite the warnings not to) that this changes what
      is recorded by \pkg{grid} on the graphics engine display list.

      \item Extra checks have been added for unit resolution and
      conversion in \pkg{grid}, to catch instances of division-by-zero.
      This may introduce error messages in existing code and/or produce
      a different result in existing code (but only where a non-finite
      location or dimension may now become zero).

      \item Some bugs in TRE have been corrected by updating from the
      \command{git} repository.  This allows \R to be installed on some
      platforms for which this was a blocker (\PR{15087} suggests Linux
      on ARM and HP-UX).

      \item \code{?} applied to a call to an S4 generic failed in
      several cases. (\PR{15680})

      \item The implicit S4 generics for primitives with \code{\dots} in
      their argument list were incorrect. (\PR{15690})

      \item Bug fixes to \code{methods::callGeneric()}. (\PR{15691})

      \item The bug fix to \code{aggregrate()} in \PR{15004} introduced
      a new bug in the case of no grouping variables. (\PR{15699})

      \item In rare cases printing deeply nested lists overran a buffer
      by one byte and on a few platforms segfaulted. (\PR{15679})

      \item The dendrogram method of \code{as.dendrogram()} was hidden
      accidentally, (\PR{15703}), and \code{order.dendrogram(d)} gave
      too much for a leaf \code{d}. (\PR{15702})

      \item \R would try to kill processes on exit that have pids ever
      used by a child process spawned by \code{mcparallel} even though
      the current process with that pid was not actually its child.

      \item \code{cophenetic()} applied to a \code{"dendrogram"} object
      sometimes incorrectly returned a \code{"Labels"} attribute with
      dimensions.  (\PR{15706})

      \item \code{printCoefmat()} called from quite a few \code{print()}
      methods now obeys small \code{getOption("width")} settings,
      line wrapping the \samp{"signif. codes"} legend appropriately.
      (\PR{15708})

      \item \code{model.matrix()} assumed that the stored dimnames for a
      matrix was \code{NULL} or length 2, but length 1 occurred.

      \item The clipping region for a device was sometimes used in base
      graphics before it was set.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.0.3}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item On Windows there is support for making \file{.texi} manuals
      using \command{texinfo} 5.0 or later: the setting is in file
      \file{src/gnuwin32/MkRules.dist}.

      A packaging of the Perl script and modules for \command{texinfo}
      5.2 has been made available at
      \url{http://www.stats.ox.ac.uk/pub/Rtools/}.

      \item \code{write.table()} now handles matrices of
      \eqn{2^{31}}{2^31} or more elements, for those with large amounts
      of patience and disc space.

      \item There is a new function, \code{La_version()}, to report the
      version of LAPACK in use.

      \item The HTML version of \sQuote{An Introduction to R} now has
      links to PNG versions of the figures.

      \item There is some support to produce manuals in ebook
      formats. (See \file{doc/manual/Makefile}.  Suggested by Mauro
      Cavalcanti.)

      \item On a Unix-alike \code{Sys.timezone()} returns \code{NA} if
      the environment variable \env{TZ} is unset, to distinguish it from
      an empty string which on some OSes means the \samp{UTC} time zone.

      \item The backtick may now be escaped in strings, to allow names
      containing them to be constructed, e.g.\sspace{}\code{`\\``}.  (\PR{15621})

      \item \code{read.table()}, \code{readLines()} and \code{scan()}
      now warn when an embedded nul is found in the input.  (Related to
      \PR{15625} which was puzzled by the behaviour in this unsupported
      case.)

      \item (Windows only.)  \code{file.symlink()} works around the
      undocumented restriction of the Windows system call to
      backslashes.  (Wish of \PR{15631}.)

      \item \code{KalmanForecast(fast = FALSE)} is now the default, and
      the help contains an example of how \code{fast = TRUE} can be used
      in this version.  (The usage will change in 3.1.0.)

      \item \code{strptime()} now checks the locale only when
      locale-specific formats are used and caches the locale in use:
      this can halve the time taken on OSes with slow system
      functions (e.g., OS X).

      \item \code{strptime()} and the \code{format()} methods for
      classes \code{"POSIXct"}, \code{"POSIXlt"} and \code{"Date"}
      recognize strings with marked encodings: this allows, for example,
      UTF-8 French month names to be read on (French) Windows.

      \item \code{iconv(to = "utf8")} is now accepted on all platforms
      (some implementations did already, but GNU \pkg{libiconv} did not:
      however converted strings were not marked as being in UTF-8).  The
      official name, \code{"UTF-8"} is still preferred.

      \item \code{available.packages()} is better protected against
      corrupt metadata files.  (A recurring problem with Debian package
      \pkg{shogun-r}: \PR{14713}.)

      \item Finalizers are marked to be run at garbage collection, but
      run only at a somewhat safer later time (when interrupts are
      checked).  This circumvents some problems with finalizers running
      arbitrary code during garbage collection (the known instances being
      running \code{options()} and (C-level) \code{path.expand()}
      re-entrantly).
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item The included version of PCRE has been updated to 8.34.  This
      fixes bugs and makes the behaviour closer to Perl 5.18.  In
      particular, the concept of \sQuote{space} includes \samp{VT} and
      hence agrees with POSIX's.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item The new field \samp{SysDataCompression} in the
      \file{DESCRIPTION} file allows user control over the compression
      used for \file{sysdata.rda} objects in the lazy-load database.

      \item \code{install.packages(dependencies = value)} for \code{value =
	NA} (the default) or \code{value = TRUE} omits packages only in
      \code{LinkingTo} for binary package installs.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item The long undocumented remapping of \code{rround()} to
      \code{Rf_fround()} in header \file{Rmath.h} is now formally
      deprecated: use \code{fround()} directly.

      \item Remapping of \code{prec()} and \code{trunc()} in the
      \file{Rmath.h} header has been disabled in C++ code (it has caused
      breakage with \code{libc++} headers).
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{getParseData()} truncated the imaginary part of
      complex number constants.  (Reported by Yihui Xie.)

      \item \code{dbeta(x, a, b)} with \code{a} or \code{b} within a
      factor of 2 of the largest representable number could
      infinite-loop.  (Reported by Ioannis Kosmidis.)

      \item \code{provideDimnames()} failed for arrays with a 0
      dimension. (\PR{15465})

      \item \code{rbind()} and \code{cbind()} did not handle
      list objects correctly. (\PR{15468})

      \item \code{replayPlot()} now checks if it is replaying a plot
      from the same session.

      \item \code{rasterImage()} and \code{grid.raster()} now give
      error on an empty (zero-length) raster.  (Reported by Ben North.)

      \item \code{plot.lm()} would sometimes scramble the labels
      in plot type 5.  (\PR{15458} and \PR{14837})

      \item \code{min()} did not handle \code{NA_character_} values
      properly.  (Reported by Magnus Thor Torfason.)

      \item (Windows only.)  \code{readRegistry()} would duplicate
      default values for keys.  (\PR{15455})

      \item \code{str(..., strict.width = "cut")} did not handle
      it properly when more than one line needed to be cut.  (Reported
      by Gerrit Eichner.)

      \item Removing subclass back-references when S4 classes were
      removed or their namespace unloaded had several bugs (e.g., \PR{15481}).

      \item \code{aggregate()} could fail when there were too many
      levels present in the \code{by} argument.  (\PR{15004})

      \item \code{namespaceImportFrom()} needed to detect primitive
      functions when checking for duplicated imports (reported by
      Karl Forner).

      \item \code{getGraphicsEvent()} did not exit when a user closed
      the graphics window.  (\PR{15208})

      \item Errors in vignettes were not always captured and displayed
      properly.  (\PR{15495})

      \item \code{contour()} could fail when dealing with extremely
      small z values.  (\PR{15454})

      \item Several functions did not handle zero-length vectors properly,
      including \code{browseEnv()}, \code{format()}, \code{gl()},
      \code{relist()} and \code{summary.data.frame()}.  (E.g., \PR{15499})

      \item \code{Sweave()} did not restore the \R{} output to the
      console if it was interrupted by a user in the middle of evaluating
      a code chunk.  (Reported by Michael Sumner.)

      \item Fake installs of packages with vignettes work again.

      \item Illegal characters in the input caused \code{parse()}
      (and thus \code{source()}) to segfault.  (\PR{15518})

      \item The nonsensical use of \code{nmax = 1} in
      \code{duplicated()} or \code{unique()} is now silently ignored.

      \item \code{qcauchy(p, *)} is now fully accurate even when p is
      very close to 1. (\PR{15521})

      \item The \code{validmu()} and \code{valideta()} functions in the
      standard \code{glm()} families now also report non-finite values,
      rather than failing.

      \item Saved vignette results (in a \file{.Rout.save} file) were
      not being compared to the new ones during \command{R CMD check}.

      \item Double-clicking outside of the list box (e.g., on the scrollbar)
      of a Tk listbox widget generated by \code{tk_select.list()} no
      longer causes the window to close. (\PR{15407})

      \item Improved handling of edge cases in
      \code{parallel::splitindices()}. (\PR{15552})

      \item HTML display of results from \code{help.search()} and
      \code{??} sometimes contained badly constructed links.

      \item \code{c()} and related functions such as \code{unlist()}
      converted raw vectors to invalid logical vectors. (\PR{15535})

      \item (Windows only) When a call to \code{system2()} specified
      one of \code{stdin}, \code{stdout} or \code{stderr} to be a file,
      but the command was not found (e.g., it contained its arguments,
      or the program was not on the \env{PATH}), it left the file open
      and unusable until \R terminated.  (Reported by Mathew McLean.)

      \item The \code{bmp()} device was not recording \code{res = NA}
      correctly: it is now recorded as 72 ppi.

      \item Several potential problems with compiler-specific behaviour
      have been identified using the \sQuote{Undefined Behaviour
	Sanitizer} in conjunction with the \command{clang} compiler.

      \item \code{hcl()} now honours \code{NA} inputs (previously they
      were mapped to black).

      \item Some translations in base packages were being looked up in
      the main catalog rather than that for the package.

      \item As a result of the 3.0.2 change about \sQuote{the last
	second before the epoch}, most conversions which should have given
      \code{NA} returned that time.  (The platforms affected include
      Linux and OS X, but not Windows nor Solaris.)

      \item \code{rowsum()} has more support for matrices and data frames
      with \eqn{2^{31}}{2^31} or more elements. (\PR{15587})

      \item \code{predict(<lm object>, interval = "confidence", scale =
	<something>)} now works.  (\PR{15564})

      \item The bug fix in 3.0.2 for \PR{15411} was too aggressive,
      and sometimes removed spaces that should not have been removed.
      (\PR{15583})

      \item Running \R code in a \pkg{tcltk} callback failed to set the
      busy flag, which will be needed to tell OS X not to \sQuote{App Nap}.

      \item The code for date-times before 1902 assumed that the offset
      from GMT in 1902 was a whole number of minutes: that was not true
      of Paris (as recorded on some platforms).

      \item Using \code{Sys.setlocale} to set \code{LC_NUMERIC} to
      \code{"C"} (to restore the sane behavior) no longer gives a
      warning.

      \item \code{deparse()} now deparses complex vectors in a way that
      re-parses to the original values.  (\PR{15534}, patch based on code
      submitted by Alex Bertram.)

      \item In some extreme cases (more than \eqn{10^{15}}{10^15})
      integer inputs to \code{dpqrxxx()} functions might have been
      rounded up by one (with a warning about being non-integer).
      (\PR{15624})

      \item Plotting symbol \code{pch = 14} had the triangle upside down
      on some devices (typically screen devices). The triangle is
      supposed to be point up.  (Reported by Bill Venables.)

      \item \code{getSrcref()} did not work on method definitions if
      \code{rematchDefinition()} had been used.

      \item \code{KalmanForecast(fast = FALSE)} reported a (harmless)
      stack imbalance.

      \item The count of observations used by \code{KalmanRun()} did not
      take missing values into account.

      \item In locales where the abbreviated name of one month is a
      partial match for the full name of a later one, the \code{\%B}
      format in \code{strptime()} could fail.  An example was French on
      OS X, where \samp{juin} is abbreviated to \samp{jui} and partially
      matches \code{juillet}.  Similarly for weekday names.

      \item \code{pbeta(x, a, b, log.p = TRUE)} sometimes underflowed to
      zero for very small and very differently sized \code{a}, \code{b}.
      (\PR{15641})

      \item \code{approx()} and \code{approxfun()} now handle infinite
      values with the \code{"constant"} method. (\PR{15655})

      \item \code{stripchart()} again respects reversed limits in
      \code{xlim} and \code{ylim}.  (\PR{15664})
    }
  }
}

\section{\Rlogo CHANGES IN R 3.0.2}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item The \file{NEWS} files have been re-organized.

      This file contains news for \R >= 3.0.0: news for the 0.x.y, 1.x.y
      and 2.x.y releases is in files \file{NEWS.0}, \file{NEWS.1} and
      \file{NEWS.2}.  The latter files are now installed when \R is
      installed.  An HTML version of news from 2.10.0 to 2.15.3 is
      available as \file{doc/html/NEWS.2.html}.

      \item \code{sum()} for integer arguments now uses an integer
      accumulator of at least 64 bits and so will be more accurate in
      the very rare case that a cumulative sum exceeds
      \eqn{2^{53}}{2^53} (necessarily summing more than 4 million
      elements).

      \item The \code{example()} and \code{tools::Rd2ex()} functions now
      have parameters to allow them to ignore \code{\\dontrun} markup in
      examples.  (Suggested by Peter Solymos.)

      \item \code{str(x)} is considerably faster for very large lists,
      or factors with 100,000 levels, the latter as in \PR{15337}.

      \item \code{col2rgb()} now converts factors to character strings
      not integer codes (suggested by Bryan Hanson).

      \item \code{tail(warnings())} now works, \emph{via} the new
      \code{`[`} method.

      \item There is now support for the LaTeX style file \file{zi4.sty}
      which has in some distributions replaced \file{inconsolata.sty}.

      \item \code{unlist(x)} now typically returns all non-list
      \code{x}s unchanged, not just the \dQuote{vector} ones.
      Consequently, \code{format(lst)} now also works when the list
      \code{lst} has non-vector elements.

      \item The \code{tools::getVignetteInfo()} function has been added
      to give information about installed vignettes.

      \item New \code{assertCondition()}, etc. utilities in \pkg{tools}, useful
      for testing.

      \item Profiling now records non-inlined calls from byte-compiled
      code to \code{BUILTIN} functions.

      \item Various functions in \pkg{stats} and elsewhere that use
      non-standard evaluation are now more careful to follow the
      namespace scoping rules.  E.g., \code{stats::lm()} can now find
      \code{stats::model.frame()} even if \pkg{stats} is not on the
      search path or if some package defines a function of that name.

      \item If an invalid/corrupt \code{.Random.seed} object is
      encountered in the workspace it is ignored with a warning rather
      than giving an error.  (This allows \R itself to rely on a working
      RNG, e.g.\sspace{}to choose a random port.)

      \item \code{seq()} and \code{seq.int()} give more explicit error
      messages if called with invalid (e.g., \code{NaN}) inputs.

      \item When \code{parse()} finds a syntax error, it now makes
      partial parse information available up to the location of the
      error.  (Request of Reijo Sund.)

      \item Methods invoked by \code{NextMethod()} had a different
      dynamic parent to the generic. This was causing trouble where S3
      methods invoked \emph{via} lazy evaluation could lose track of
      their generic.  (\PR{15267})

      \item Code for the negative binomial distribution now treats the case
      \code{size == 0} as a one-point distribution at zero.

      \item \code{abbreviate()} handles without warning non-ASCII input
      strings which require no abbreviation.

      \item \code{read.dcf()} no longer has a limit of 8191 bytes per
      line. (Wish of \PR{15250}.)

      \item \code{formatC(x)} no longer copies the class of \code{x} to
      the result, to avoid misuse creating invalid objects as in
      \PR{15303}.  A warning is given if a class is discarded.

      \item Dataset \code{npk} has been copied from \CRANpkg{MASS} to
      allow more tests to be run without recommended packages being
      installed.

      \item The initialization of the regression coefficients for
      non-degenerate differenced models in \code{arima()} has been
      changed and in some examples avoids a local maximum.  (\PR{15396})

      \item \code{termplot()} now has an argument \code{transform.x}
      to control the display of individual terms in the plot.
      (\PR{15329})

      \item \code{format()} now supports \code{digits = 0}, to
      display \code{nsmall} decimal places.

      \item There is a new read-only \code{par()} parameter called
      \code{"page"}, which returns a logical value indicating whether
      the next \code{plot.new()} call will start a new page.

      \item Processing Sweave and Rd documents to PDF now renders
      backticks and single quotes better in several instances, including
      in \samp{\\code} and \samp{\\samp} expressions.

      \item \code{utils::modifyList()} gets a new argument \code{keep.null}
      allowing \code{NULL} components in the replacement to be retained,
      instead of causing corresponding components to be deleted.

      \item \code{tools::pkgVignettes()} gains argument \code{check};
      if set to \code{TRUE}, it will warn when it appears a vignette requests
      a non-existent vignette engine.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check --as-cran} checks the line widths in
      usage and examples sections of the package Rd files.

      \item \command{R CMD check --as-cran} now implies \option{--timings}.

      \item \command{R CMD check} looks for command \command{gfile} if a
      suitable \command{file} is not found.  (Although \command{file} is
      not from GNU, OpenCSW on Solaris installs it as \command{gfile}.)

      \item \command{R CMD build} (with the internal \code{tar}) checks
      the permissions of \file{configure} and \file{cleanup} files and
      adds execute permission to the recorded permissions for these
      files if needed, with a warning.  This is useful on OSes and file
      systems which do not support execute permissions (notably, on
      Windows).

      \item \command{R CMD build} now weaves and tangles all vignettes,
      so suggested packages are not required during package installation
      if the source tarball was prepared with current
      \command{R CMD build}.

      \item \code{checkFF()} (used by \command{R CMD check}) does a
      better job of detecting calls from other packages, including not
      reporting those where a function has been copied from another
      namespace (e.g., as a default method).  It now reports calls where
      \code{.NAME} is a symbol registered in another package.

      \item On Unix-alike systems, \command{R CMD INSTALL} now installs packages
      group writably whenever the library (\code{lib.loc}) is group
      writable.  Hence, \code{update.packages()} works for other group
      members (suggested originally and from a patch by Dirk Eddelbuettel).

      \item \command{R CMD javareconf} now supports the use of symbolic
      links for \env{JAVA_HOME} on platforms which have
      \command{realpath}.  So it is now possible to
      use \preformatted{R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-1.7.0}
      on a Linux system and record that value rather than the
      frequently-changing full path such as
      \file{/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25.x86_64}.

      \item (Windows only.) \command{Rscript -e} requires a non-empty
      argument for consistency with Unix versions of \R.  (Also
      \command{Rterm -e} and \command{R -e}.)

      \item \command{R CMD check} does more thorough checking of
      declared packages and namespaces.  It reports
      \itemize{
	\item packages declared in more than one of the
	\samp{Depends}, \samp{Imports}, \samp{Suggests} and
	\samp{Enhances} fields of the \file{DESCRIPTION} file.

	\item namespaces declared in \samp{Imports} but not
	imported from, neither in the \file{NAMESPACE} file nor using
	the \code{::} nor \code{:::} operators.

	\item packages which are used in \code{library()} or
	\code{requires()} calls in the \R code but were already put on
	the search path \emph{via} \samp{Depends}.

	\item packages declared in \samp{Depends} not imported
	\emph{via} the \file{NAMESPACE} file (except the standard
	packages).  Objects used from \samp{Depends} packages should be
	imported to avoid conflicts and to allow correct operation when
	the namespace is loaded but not attached.

	\item objects imported \emph{via} \code{:::} calls where
	\code{::} would do.

	\item objects imported by \code{::} which are not exported.

	\item objects imported by \code{:::} calls which do not exist.
      }
      See \sQuote{Writing R Extensions} for good practice.

      \item \command{R CMD check} optionally checks for non-standard
      top-level files and directories (which are often mistakes): this
      is enabled for \option{--as-cran}.

      \item LaTeX style file \code{upquote.sty} is no longer included
      (the version was several years old): it is no longer used in \R.
      A much later version is commonly included in LaTeX distributions
      but does not play well with the \code{ae} fonts which are the
      default for Sweave vignettes.

      \item \command{R CMD build} makes more use of the \file{build}
      sub-directory of package sources, for example to record
      information about the vignettes.

      \item \command{R CMD check} analyses \code{:::} calls.
    }
  }

  \subsection{INSTALLATION and INCLUDED SOFTWARE}{
    \itemize{
      \item The macros used for the texinfo manuals have been changed to
      work better with the incompatible changes made in \command{texinfo
      5.x}.

      \item The minimum version for a system \code{xz} library is now
      5.0.3 (was 4.999).  This is in part to avoid 5.0.2, which can
      compress in ways other versions cannot decompress.

      \item The included version of PCRE has been updated to 8.33.

      \item The included version of \code{zlib} has been updated to
      1.2.8, a bug-fix release.

      \item The included version of xz utils's \code{liblzma} has been
      updated to 5.0.5.

      \item Since \command{javareconf} (see above) is used when \R is
      installed, a stable link for \env{JAVA_HOME} can be supplied then.

      \item Configuring with \option{--disable-byte-compilation} will
      override the \file{DESCRIPTION} files of recommended packages,
      which typically require byte-compilation.

      \item More of the installation and checking process will work even
      when \env{TMPDIR} is set to a path containing spaces, but this is
      not recommended and external software (such as
      \command{texi2dvi}) may fail.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item Installation is aborted immediately if a \code{LinkingTo}
      package is not installed.

      \item \command{R CMD INSTALL} has a new option
      \code{--no-byte-compile} which will override a \samp{ByteCompile}
      field in the package's \file{DESCRIPTION} file.

      \item License \samp{BSD} is deprecated: use \samp{BSD_3_clause}
      or \samp{BSD_2_clause} instead.

      License \samp{X11} is deprecated: use \samp{MIT} or
      \samp{BSD_2_clause} instead.

      \item Version requirements for \code{LinkingTo} packages are now
      recognized: they are checked at installation.  (Fields with
      version requirements were previously silently ignored.)

      \item The limit of 500 \code{S3method} entries in a
      \code{NAMESPACE} file has been removed.

      \item The default \sQuote{version} of Bioconductor for its
      packages has been changed to the upcoming \samp{2.13}, but this
      can be set by the environment variable \env{R_BIOC_VERSION} when
      \R is installed.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item \file{Rdefines.h} has been tweaked so it can be included in
      C++ code after \file{R_ext/Boolean.h} (which is included by
      \file{R.h}).

      Note that \file{Rdefines.h} is not kept up-to-date, and
      \file{Rinternals.h} is preferred for new code.

      \item \code{eval} and \code{applyClosure} are now protected
      against package code supplying an invalid \code{rho}.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item The unused \code{namespace} argument to
      \code{package.skeleton()} is now formally deprecated and will be
      removed in \R 3.1.0.

      \item \code{plclust()} is deprecated: use the \code{plot()} method
      for class \code{"hclust"} instead.

      \item Functions \code{readNEWS()} and \code{checkNEWS()} in
      package \pkg{tools} are deprecated (and they have not worked with
      current \file{NEWS} files for a long time).
    }
  }

  \subsection{DOCUMENTATION}{
    \itemize{
      \item \sQuote{An Introduction to R} has a new chapter on using \R
      as a scripting language including interacting with the OS.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{help.request()} could not determine the current version
      of \R on CRAN.  (\PR{15241})

      \item On Windows, \code{file.info()} failed on root directories unless
      the path was terminated with an explicit \code{"."}.  (\PR{15302})

      \item The \code{regmatches<-()} replacement function mishandled
      results coming from \code{regexpr()}.  (\PR{15311})

      \item The help for \code{setClass()} and
      \code{representation()} still suggested the deprecated argument
      \code{representation=}. (\PR{15312})

      \item \command{R CMD config} failed in an installed build of \R
      3.0.1 (only) when a sub-architecture was used.  (Reported by
      Berwin Turlach.)

      \item On Windows, the installer modified the \file{etc/Rconsole}
      and \file{etc/Rprofile.site} files even when default options were
      chosen, so the MD5 sums did not refer to the installed versions.
      (Reported by Tal Galili.)

      \item \code{plot(hclust(), cex =)} respects \code{cex} again
      (and possibly others similarly).  (Reported by Peter Langfelder.)

      \item If multiple packages were checked by \command{R CMD check},
      and one was written for a different OS, it would set
      \command{--no-install} for all following packages as well as
      itself.

      \item \code{qr.coef()} and related functions did not properly coerce
      real vectors to complex when necessary.  (\PR{15332})

      \item \code{ftable(a)} now fixes up empty \code{dimnames} such
      that the result is printable.

      \item \code{package.skeleton()} was not starting its search for
      function objects in the correct place if \code{environment} was
      supplied.  (Reported by Karl Forner.)

      \item Parsing code was changing the length field of vectors and
      confusing the memory manager.  (\PR{15345})

      \item The Fortran routine \code{ZHER2K} in the reference BLAS
      had a comment-out bug in two places.
      This caused trouble with \code{eigen()} for Hermitian matrices.
      (\PR{15345} and report from Robin Hankin)

      \item \code{vignette()} and \code{browseVignettes()} did not
      display non-Sweave vignettes properly.

      \item Two warning/error messages have been corrected:
      the (optional) warning produced by a partial name match
      with a pairlist, the error message from a zero-length argument to
      the \code{:} operator.  (Found by Radford Neal; \PR{15358},
      \PR{15356})

      \item \code{svd()} returned \code{NULL} rather than omitting
      components as documented.  (Found by Radford Neal; \PR{15360})

      \item \code{mclapply()} and \code{mcparallel()} with
      \code{silent = TRUE} could break a process that uses
      \code{stdout} output
      unguarded against broken pipes (e.g., \code{zip} will fail
      silently). To work around such issues, they now replace
      \code{stdout} with a descriptor pointed to \file{/dev/null}
      instead. For this purpose, internal \code{closeStdout} and
      \code{closeStderr} functions have gained the \code{to.null} flag.

      \item \code{log()}, \code{signif()} and \code{round()} now raise an
      error if a single named argument is not named \code{x}.  (\PR{15361})

      \item \code{deparse()} now deparses raw vectors in a form that
      is syntactically correct. (\PR{15369})

      \item The \code{jpeg} driver in Sweave created a JPEG file, but gave
      it a \file{.png} extension. (\PR{15370})

      \item Deparsing of infix operators with named arguments is
      improved. (\PR{15350})

      \item \code{mget()}, \code{seq.int()} and \code{numericDeriv()}
      did not duplicate arguments properly. (\PR{15352}, \PR{15353},
      \PR{15354})

      \item \code{kmeans(algorithm = "Hartigan-Wong")} now always stops
      iterating in the QTran stage. (\PR{15364}).

      \item \code{read.dcf()} re-allocated incorrectly and so could
      segfault when called on a file with lines of more than 100 bytes.

      \item On systems where \code{mktime()} does not set \code{errno},
      the last second before the epoch could not be converted from
      \code{POSIXlt} to \code{POSIXct}. (Reported by Bill Dunlap.)

      \item \code{add1.glm()} miscalculated F-statistics when df > 1. (Bill
      Dunlap, \PR{15386}).

      \item \code{stem()} now discards infinite inputs rather than
      hanging.  (\PR{15376})

      \item The parser now enforces C99 syntax for floating point
      hexadecimal constants (e.g., \code{0x1.1p0}), rather than returning
      unintended values for malformed constants. (\PR{15234})

      \item \code{model.matrix()} now works with very long LHS
      names (more than 500 bytes).  (\PR{15377})

      \item \code{integrate()} reverts to the pre-2.12.0 behaviour: from
      2.12.0 to 3.0.1 it sometimes failed to achieve the requested
      tolerance and reported error estimates that were exceeded.
      (\PR{15219})

      \item \code{strptime()} now handles \samp{\%W} fields with value
      0. (\PR{15915})

      \item \R is now better protected against people trying to interact
      with the console in startup code.  (\PR{15325})

      \item Subsetting 1D arrays often lost dimnames (\PR{15301}).

      \item Unary \code{+} on a logical vector did not coerce to
      integer, although unary \code{-} did.

      \item \code{na.omit()} and \code{na.exclude()} added a row
      to a zero-row data frame.  (\PR{15399})

      \item All the (where necessary cut-down) vignettes are installed
      if \R was configured with \option{--without-recommended-packages}.

      \item \code{source()} did not display filenames when reporting
      syntax errors.

      \item Syntax error reports misplaced the caret pointing out the bad
      token.

      \item (Windows only) Starting \R with \command{R} (instead of
      \command{Rterm} or \command{Rgui}) would lose any
      zero-length strings from the command line arguments. (\PR{15406})

      \item Errors in the encoding specified on the command line
      \emph{via} \command{--encoding=foo} were not handled properly.
      (\PR{15405})

      \item If \code{x} is a symbol, \code{is.vector(x, "name")} now
      returns \code{TRUE}, since \code{"name"} and \code{"symbol"}
      should be synonyms.  (Reported by Hervé Pagès.)

      \item \command{R CMD rtags} works on platforms (such as OS X)
      with a XSI-conformant shell command \command{echo}. (\PR{15231})

      \item \code{is.unsorted(NA)} returns false as documented (rather than
      \code{NA}).

      \item \command{R CMD LINK} did not know about sub-architectures.

      \item \code{system()} and \code{system2()} are better protected
      against users who misguidedly have spaces in the temporary
      directory path.

      \item \code{file.show()} and \code{edit()} are now more likely to
      work on file paths containing spaces.  (Where external utilities
      are used, not the norm on Windows nor in \command{R.app} which
      should previously have worked.)

      \item Packages using the \pkg{methods} package are more likely to
      work when they import it but it is not attached.  (Several parts
      of its C code were looking for its \R functions on the search path
      rather than in its namespace.)

      \item \code{lgamma(-x)} is no longer \code{NaN} for very small x.

      \item (Windows) \code{system2()} now respects specifying
      \code{stdout} and \code{stderr} as files if called from
      \command{Rgui}. (\PR{15393})

      \item Closing an \code{x11()} device whilst \code{locator()} or
      \code{identify()} is in progress no longer hangs \R.  (\PR{15253})

      \item \code{list.dirs(full.names = FALSE)} was not implemented.
      (\PR{15170})

      \item \code{format()} sometimes added unnecessary spaces.
      (\PR{15411})

      \item \code{all.equal(check.names = FALSE)} would ignore the request
      to ignore the names and would check them as attributes.

      \item The symbol set by \code{tools::Rd2txt_options(itemBullet=)}
      was not respected in some locales. (\PR{15435})

      \item \code{mcMap()} was not exported by package
      \pkg{parallel}. (\PR{15439})

      \item \code{plot()} for \code{TukeyHSD} objects did not balance
      \code{dev.hold()} and \code{dev.flush()} calls on multi-page plots.
      (\PR{15449})
    }
  }
}

\section{\Rlogo CHANGES IN R 3.0.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{chooseCRANmirror()} and \code{chooseBioCmirror()} gain
      an \code{ind} argument (like \code{setRepositories()}).

      \item \code{mcparallel} has a new argument \code{mc.interactive}
      which can modify the interactive flag in the child process. The
      new default is \code{FALSE} which makes child processes
      non-interactive by default (this prevents lock-ups due to children
      waiting for interactive input).

      \item \code{scan()} now warns when end-of-file occurs within
      a quoted string.

      \item \code{count.fields()} is now consistent with \code{scan()}
      in its handling of newlines in quoted strings.  Instead of
      triggering an error, this results in the current line receiving
      \code{NA} as the field count, with the next line getting the total
      count of the two lines.

      \item The default method of \code{image()} will plot axes of the
      class of \code{xlim} and \code{ylim} (and hence of \code{x} and
      \code{y} if there is a suitable \code{range()} method).  Based on
      a suggestion of Michael Sumner.

      \item \code{load()} now has a \code{verbose} argument for
      debugging support, to print the names of objects just before
      loading them.

      \item When loading a serialized object encounters a reference to a
      namespace which cannot be loaded, this is replaced by a reference
      to the global environment, with a warning.

      \item \code{pairs()} gains a \code{line.main} option for title placement.

      \item The remaining instances in which serialization to a raw
      vector was limited to 2GB have been unlimited on a 64-bit
      platform, and in most cases serialization to a vector of more than
      1GB will be substantially faster.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD config} now make use of personal
      \file{Makevars} files under \file{~/.R} and a site file
      \file{Makevars.site}, in the same way as \command{R CMD SHLIB} and
      \command{R CMD INSTALL}.  This makes the utility more useful in
      package \command{configure} scripts.

      On Windows finding the personal files may require the environment
      variable \env{HOME} set.

      The old behaviour can be obtained with the new options
      \option{--no-user-files} and \option{--no-site-files}.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item Alternatives to the site and user customization files
      \file{Makevars.site} and \file{~/.R/Makevars} can be specified
      \emph{via} the environment variables \env{R_MAKEVARS_SITE} and
      \env{R_MAKEVARS_USER} respectively.  These can be used to suppress
      the use of the default files by setting an empty value (where
      possible) or a non-existent path.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{sys.source()} did not report error locations when
      \code{keep.source = TRUE}.

      \item \code{as.POSIXct.numeric} was coercing \code{origin} using
      the \code{tz} argument and not \code{"GMT"} as documented
      (\PR{14973}).

      \item The active binding to assign fields in reference classes
      has been cleaned up to reduce dependence on the class' package
      environment, also fixing bug in initializing read-only fields
      (inspired by a report from Hadley Wickham).

      \item \code{str(d)} no longer gives an error when \code{names(d)}
      contain illegal multibyte strings (\PR{15247}).

      \item Profiling of built-in functions with \code{line.profiling=
      TRUE} did not record the line from which they were called.

      \item \code{citation(pkg)} dropped the header and footer specified
      in the \file{CITATION} file (\PR{15257}).

      \item Quotes were handled differently when reading the first line
      and reading the rest, so \code{read.table()} misread some files
      that contained quote characters (\PR{15245}).

      \item \code{cat()} with \code{sep} a character vector of length
      greater than one and more than one argument was using separators
      inconsistently (\PR{15261}).

      \item On Windows in \R 3.0.0, \code{savePlot()} failed because of
      an incorrect check on the argument count.

      \item \code{unzip(list = TRUE)} returned \code{Names} as a factor
      and not a character vector (as documented) for the internal method.
      (Noticed by Sean O'Riordain.)

      \item \code{contourLines()} now checks more comprehensively for
      conformance of its \code{x}, \code{y} and \code{z} arguments (it
      was used incorrectly in package \CRANpkg{R2G2}).

      \item Saved graphics display lists are \R version-specific.
      Attempting to load workspaces containing them (or some other
      version-specific objects) aborted the load in \R 3.0.0 and
      earlier; now it does a partial load and generates a warning
      instead.

      \item In \R 3.0.0, \code{identify()} and \code{locator()} did
      not record information correctly, so replaying a graph (e.g., by
      copying it to another device) would fail. (\PR{15271})

      \item Calling \code{file.copy()} or \code{dirname()} with the
      invalid input \code{""} (which was being used in packages, despite
      not being a file path) could have caused a segfault.

      \code{dirname("")} is now \code{""} rather than \code{"."} (unless
      it segfaulted).

      \item \code{supsmu()} could read/write outside its input vectors
      for very short inputs (seen in package \CRANpkg{rms} for \code{n = 4}).

      \item \code{as.dendrogram()}'s \code{hclust} method uses less
      memory and hence gets considerably faster for large (n ~ 1000)
      clusterings, thanks to Daniel Müllner. (\PR{15174})

      \item The return value when all workers failed from
      \code{parallel::mclapply(mc.preschedule = TRUE)} was a list of
      strings and not of error objects.  (Spotted by Karl Forner and
      Bernd Bischl.)

      \item In \R 3.0.0, when \code{help()} found multiple pages with
      the same alias, the HTML display of all the selections was not
      produced.  (\PR{15282})

      \item \code{splinefun(method="monoH.FC")} now produces a
      function with first argument named \code{x} and allows
      \code{deriv=3}, as documented. (\PR{15273})

      \item \code{summaryRprof()} would only read the first
      \code{chunksize} lines of an \code{Rprof} file produced with
      \code{line.profiling=TRUE}. By default, this is the first 100
      seconds.  (\PR{15288})

      \item \code{lsfit()} produced an incorrect error message when
      argument \code{x} had more columns than rows or \code{x} had a
      different number of rows than \code{y}. (Spotted by Renaud Gaujoux.)

      \item Binary operations on equal length vectors copied the
      class name from the second operand when the first had no
      class name, but did not set the object bit. (\PR{15299})

      \item The \code{trace()} method for reference generator objects
      failed after those objects became function definitions.

      \item \code{write.table()} did not check that factors were
      constructed correctly, and so caused a segment fault when
      writing bad ones. (\PR{15300})

      \item The internal HTTP server no longer chokes on POST requests
      without body. It will also pass-through other request types for
      custom handlers (with the method stored in Request-Method header)
      instead of failing.
    }
  }
}

\section{\Rlogo CHANGES IN R 3.0.0}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item Packages need to be (re-)installed under this version
      (3.0.0) of \R.

      \item There is a subtle change in behaviour for numeric index
      values \eqn{2^{31}}{2^31} and larger.  These never used to be
      legitimate and so were treated as \code{NA}, sometimes with a
      warning.  They are now legal for long vectors so there is no
      longer a warning, and \code{x[2^31] <- y} will now extend the
      vector on a 64-bit platform and give an error on a 32-bit one.

      \item It is now possible for 64-bit builds to allocate amounts of
      memory limited only by the OS.  It may be wise to use OS
      facilities (e.g., \command{ulimit} in a \command{bash} shell,
      \command{limit} in \command{csh}), to set limits on overall memory
      consumption of an \R process, particularly in a multi-user
      environment.  A number of packages need a limit of at least 4GB of
      virtual memory to load.

      64-bit Windows builds of \R are by default limited in memory usage
      to the amount of RAM installed: this limit can be changed by
      command-line option \option{--max-mem-size} or setting environment
      variable \env{R_MAX_MEM_SIZE}.

      \item Negative numbers for colours are consistently an error:
      previously they were sometimes taken as transparent, sometimes
      mapped into the current palette and sometimes an error.
    }
  }

  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{identical()} has a new argument,
      \code{ignore.environment}, used when comparing functions (with
      default \code{FALSE} as before).

      \item There is a new option, \code{options(CBoundsCheck=)}, which
      controls how \code{.C()} and \code{.Fortran()} pass arguments to
      compiled code.  If true (which can be enabled by setting the
      environment variable \env{R_C_BOUNDS_CHECK} to \samp{yes}), raw,
      integer, double and complex arguments are always copied, and
      checked for writing off either end of the array on return from the
      compiled code (when a second copy is made).  This also checks
      individual elements of character vectors passed to \code{.C()}.

      This is not intended for routine use, but can be very helpful in
      finding segfaults in package code.

      \item In \code{layout()}, the limits on the grid size have been
      raised (again).

      \item New simple \code{provideDimnames()} utility function.

      \item Where methods for \code{length()} return a double value
      which is representable as an integer (as often happens for package
      \CRANpkg{Matrix}), this is converted to an integer.

      \item Matrix indexing of data frames by two-column numeric indices
      is now supported for replacement as well as extraction.

      \item \code{setNames()} now has a default for its \code{object}
      argument, useful for a character result.

      \item \code{StructTS()} has a revised additive constant in the
      \code{loglik} component of the result: the previous definition is
      returned as the \code{loglik0} component.  However, the help page has
      always warned of a lack of comparability of log-likelihoods for
      non-stationary models.  (Suggested by Jouni Helske.)

      \item The logic in \code{aggregate.formula()} has been revised.
      It is now possible to use a formula stored in a variable;
      previously, it had to be given explicitly in the function call.

      \item \code{install.packages()} has a new argument \code{quiet} to
      reduce the amount of output shown.

      \item Setting an element of the graphics argument \code{lwd} to a
      negative or infinite value is now an error.  Lines corresponding
      to elements with values \code{NA} or \code{NaN} are silently
      omitted.

      Previously the behaviour was device-dependent.

      \item Setting graphical parameters \code{cex}, \code{col},
      \code{lty}, \code{lwd} and \code{pch} in \code{par()} now requires a
      length-one argument.   Previously some silently took the first
      element of a longer vector, but not always when documented to do so.

      \item \code{Sys.which()} when used with inputs which would be
      unsafe in a shell (e.g., absolute paths containing spaces) now uses
      appropriate quoting.

      \item \code{as.tclObj()} has been extended to handle raw vectors.
      Previously, it only worked in the other direction.
      (Contributed by Charlie Friedemann, \PR{14939}.)

      \item New functions \code{cite()} and \code{citeNatbib()} have
      been added, to allow generation of in-text citations from
      \code{"bibentry"} objects.  A \code{cite()} function may be added
      to \code{bibstyle()} environments.

      \item A \code{sort()} method has been added for \code{"bibentry"}
      objects.

      \item The \code{bibstyle()} function now defaults to setting the
      default bibliography style. The \code{getBibstyle()} function
      has been added to report the name of the current default style.

      \item \code{scatter.smooth()} now has an argument \code{lpars} to
      pass arguments to \code{lines()}.

      \item \code{pairs()} has a new \code{log} argument, to allow some
      or all variables to be plotted on logarithmic scale.
      (In part, wish of \PR{14919}.)

      \item \code{split()} gains a \code{sep} argument.

      \item \code{termplot()} does a better job when given a model with
      interactions (and no longer attempts to plot interaction terms).

      \item The parser now incorporates code from Romain Francois'
      \CRANpkg{parser} package, to support more detailed computation on
      the code, such as syntax highlighting, comment-based
      documentation, etc.  Functions \code{getParseData()} and
      \code{getParseText()} access the data.

      \item There is a new function \code{rep_len()} analogous to
      \code{rep.int()} for when speed is required (and names are not).

      \item The undocumented use \code{rep(NULL, length.out = n)} for
      \code{n > 0} (which returns \code{NULL}) now gives a warning.

      \item \code{demo()} gains an \code{encoding} argument for those
      packages with non-ASCII demos: it defaults to the package encoding
      where there is one.

      \item \code{strwrap()} converts inputs with a marked encoding to
      the current locale: previously it made some attempt to pass
      through as bytes inputs invalid in the current locale.

      \item Specifying both \code{rate} and \code{scale} to
      \code{[dpqr]gamma} is a warning (if they are essentially the same
      value) or an error.

      \item \code{merge()} works in more cases where the data frames
      include matrices.  (Wish of \PR{14974}.)

      \item \code{optimize()} and \code{uniroot()} no longer use a
      shared parameter object across calls.  (\code{nlm()},
      \code{nlminb()} and \code{optim()} with numerical derivatives
      still do, as documented.)

      \item The \code{all.equal()} method for date-times is now
      documented: times are regarded as equal (by default) if they
      differ by up to 1 msec.

      \item \code{duplicated()} and \code{unique()} gain a \code{nmax}
      argument which can be used to make them much more efficient when
      it is known that there are only a small number of unique entries.
      This is done automatically for factors.

      \item Functions \code{rbinom()}, \code{rgeom()}, \code{rhyper()},
      \code{rpois()}, \code{rnbinom(),} \code{rsignrank()} and
      \code{rwilcox()} now return integer (not double) vectors.  This
      halves the storage requirements for large simulations.

      \item \code{sort()}, \code{sort.int()} and \code{sort.list()} now
      use radix sorting for factors of less than 100,000 levels when
      \code{method} is not supplied.  So does \code{order()} if called
      with a single factor, unless \code{na.last = NA}.

      \item \code{diag()} as used to generate a diagonal matrix has been
      re-written in C for speed and less memory usage.  It now forces
      the result to be numeric in the case \code{diag(x)} since it is
      said to have \sQuote{zero off-diagonal entries}.

      \item \code{backsolve()} (and \code{forwardsolve()}) are now
      internal functions, for speed and support for large matrices.

      \item More matrix algebra functions (e.g., \code{chol()} and
      \code{solve()}) accept logical matrices (and coerce to numeric).

      \item \code{sample.int()} has some support for  \eqn{n \ge
	2^{31}}{n >= 2^31}: see its help for the limitations.

      A different algorithm is used for \code{(n, size, replace = FALSE,
	prob = NULL)} for \code{n > 1e7} and \code{size <= n/2}.  This
      is much faster and uses less memory, but does give different results.

      \item \code{approxfun()} and \code{splinefun()} now return a
      wrapper to an internal function in the \pkg{stats} namespace
      rather than a \code{.C()} or \code{.Call()} call.  This is more
      likely to work if the function is saved and used in a different
      session.

      \item The functions \code{.C()}, \code{.Call()},
      \code{.External()} and \code{.Fortran()} now give an error (rather
      than a warning) if called with a named first argument.

      \item \code{Sweave()} by default now reports the locations in
      the source file(s) of each chunk.

      \item \code{clearPushBack()} is now a documented interface to a
      long-existing internal call.

      \item \code{aspell()} gains filters for \R code, Debian Control
      Format and message catalog files, and support for \R level
      dictionaries.  In addition, package \pkg{utils} now provides
      functions \code{aspell_package_R_files()} and
      \code{aspell_package_C_files()} for spell checking \R and C level
      message strings in packages.

      \item \code{bibentry()} gains some support for \dQuote{incomplete}
      entries with a \samp{crossref} field.

      \item \code{gray()} and \code{gray.colors()} finally allow
      \code{alpha} to be specified.

      \item \code{monthplot()} gains parameters to control the look of
      the reference lines.  (Suggestion of Ian McLeod.)

      \item Added support for new \code{\%~\%} relation
      (\dQuote{is distributed as}) in plotmath.

      \item \code{domain = NA} is accepted by \code{gettext()} and
      \code{ngettext()}, analogously to \code{stop()} etc.

      \item \code{termplot()} gains a new argument \code{plot = FALSE}
      which returns information to allow the plots to be modified for
      use as part of other plots, but does not plot them.
      (Contributed by Terry Therneau, \PR{15076}.)

      \item \code{quartz.save()}, formerly an undocumented part of
      \command{R.app}, is now available to copy a device to a
      \code{quartz()} device.  \code{dev.copy2pdf()} optionally does
      this for PDF output: \code{quartz.save()} defaults to PNG.

      \item The default method of \code{pairs()} now allows
      \code{text.panel = NULL} and the use of \code{<foo>.panel = NULL}
      is now documented.

      \item \code{setRefClass()} and \code{getRefClass()} now return
      class generator functions, similar to \code{setClass()}, but
      still with the reference fields and methods as before
      (suggestion of Romain Francois).

      \item New functions \code{bitwNot()}, \code{bitwAnd()},
      \code{bitwOr()} and \code{bitwXor()}, using the internal
      interfaces previously used for classes \code{"octmode"} and
      \code{"hexmode"}.

      Also \code{bitwShiftL()} and \code{bitwShiftR()} for shifting bits
      in elements of integer vectors.

      \item New option \code{"deparse.cutoff"} to control the deparsing
      of language objects such as calls and formulae when printing.
      (Suggested by a comment of Sarah Goslee.)

      \item \code{colors()} gains an argument \code{distinct}.

      \item New \code{demo(colors)} and \code{demo(hclColors)}, with
      utility functions.

      \item \code{list.files()} (aka \code{dir()}) gains a new optional
      argument \code{no..} which allows to exclude \code{"."} and
      \code{".."} from listings.

      \item Multiple time series are also of class \code{"matrix"};
      consequently, \code{head()}, e.g., is more useful.

      \item \code{encodeString()} preserves UTF-8 marked encodings.
      Thus if factor levels are marked as UTF-8 an attempt is made to
      print them in UTF-8 in \command{RGui} on Windows.

      \item \code{readLines()} and \code{scan()} (and hence
      \code{read.table()}) in a UTF-8 locale now discard a UTF-8
      byte-order-mark (BOM).  Such BOMs are allowed but not recommended
      by the Unicode Standard: however Microsoft applications can
      produce them and so they are sometimes found on websites.

      The encoding name \code{"UTF-8-BOM"} for a connection will
      ensure that a UTF-8 BOM is discarded.

      \item \code{mapply(FUN, a1, ..)} now also works when \code{a1} (or
      a further such argument) needs a \code{length()} method (which the
      documented arguments never do).  (Requested by Hervé Pagès; with a
      patch.)

      \item \code{.onDetach()} is supported as an alternative to
      \code{.Last.lib}.  Unlike \code{.Last.lib}, this does not need to
      be exported from the package's namespace.

      \item The \code{srcfile} argument to \code{parse()} may now be a
      character string, to be used in error messages.

      \item The \code{format()} method for \code{ftable} objects gains
      a \code{method} argument, propagated to \code{write.ftable()} and
      \code{print()}, allowing more compact output, notably for LaTeX
      formatting, thanks to Marius Hofert.

      \item The \code{utils::process.events()} function has been added
      to trigger immediate event handling.

      \item \code{Sys.which()} now returns \code{NA} (not \code{""}) for
      \code{NA} inputs (related to \PR{15147}).

      \item The \code{print()} method for class \code{"htest"} gives
      fewer trailing spaces (wish of \PR{15124}).

      Also print output from \code{HoltWinters()}, \code{nls()} and others.

      \item \code{loadNamespace()} allows a version specification to be
      given, and this is used to check version specifications given in
      the \samp{Imports} field when a namespace is loaded.

      \item \code{setClass()} has a new argument, \code{slots}, clearer
      and less ambiguous than \code{representation}.  It is recommended
      for future code, but should be back-compatible.  At the same time,
      the allowed slot specification is slightly more general.  See the
      documentation for details.

      \item \code{mget()} now has a default for \code{envir} (the frame
      from which it is called), for consistency with \code{get()} and
      \code{assign()}.

      \item \code{close()} now returns an integer status where available,
      invisibly. (Wish of \PR{15088}.)

      \item The internal method of \code{tar()} can now store paths too
      long for the \samp{ustar} format, using the (widely supported) GNU
      extension.  It can also store long link names, but these are much
      less widely supported.  There is support for larger files, up to
      the \samp{ustar} limit of 8GB.

      \item Local reference classes have been added to package
      \pkg{methods}.  These are a technique for avoiding unneeded
      copying of large components of objects while retaining standard \R
      functional behavior.  See \code{?LocalReferenceClasses}.

      \item \code{untar()} has a new argument \code{restore_times} which
      if false (not the default) discards the times in the tarball.
      This is useful if they are incorrect (some tarballs submitted to
      \acronym{CRAN} have times in a local time zone or many years in the
      past even though the standard required them to be in UTC).

      \item \code{replayplot()} cannot (and will not attempt to) replay
      plots recorded under \R < 3.0.0.  It may crash the \R session if
      an attempt is made to replay plots created in a different build of
      \R >= 3.0.0.

      \item Palette changes get recorded on the display list, so
      replaying plots (including when resizing screen devices and using
      \code{dev.copy()}) will work better when the palette is changed
      during a plot.

      \item \code{chol(pivot = TRUE)} now defaults to LAPACK, not LINPACK.

      \item The \code{parse()} function has a new parameter
      \code{keep.source}, which defaults to \code{options("keep.source")}.

      \item Profiling \emph{via} \code{Rprof()} now optionally records
      information at the statement level, not just the function level.

      \item The \code{Rprof()} function now quotes function names in
      in its output file on Windows, to be consistent with the quoting
      in Unix.

      \item Profiling \emph{via} \code{Rprof()} now optionally records
      information about time spent in GC.

      \item The HTML help page for a package now displays non-vignette
      documentation files in a more accessible format.

      \item To support \code{options(stringsAsFactors = FALSE)},
      \code{model.frame()}, \code{model.matrix()} and
      \code{replications()} now automatically convert character
      vectors to factors without a warning.

      \item The \code{print} method for objects of class \code{"table"}
      now detects tables with 0-extents and prints the results as, e.g.,
      \samp{< table of extent 0 x 1 x 2 >}. (Wish of \PR{15198}.)

      \item Deparsing involving calls to anonymous functions has been
      made closer to reversible by the addition of extra parentheses.

      \item The function \code{utils::packageName()} has been added as
      a lightweight version of \code{methods::getPackageName()}.

      \item \code{find.package(lib.loc = NULL)} now treats loaded
      namespaces preferentially in the same way as attached packages
      have been for a long time.

      \item In Windows, the Change Directory dialog now defaults to
      the current working directory, rather than to the last directory
      chosen in that dialog.

      \item \code{available.packages()} gains a
      \code{"license/restricts_use"} filter which retains only packages
      for which installation can proceed solely based on packages which
      are guaranteed not to restrict use.

      \item New \code{check_packages_in_dir()} function in package
      \pkg{tools} for conveniently checking source packages along with
      their reverse dependencies.

      \item R's completion mechanism has been improved to handle help
      requests (starting with a question mark).  In particular, help
      prefixes are now supported, as well as quoted help topics.  To
      support this, completion inside quotes are now handled by R by
      default on all platforms.

      \item The memory manager now allows the strategy used to balance
      garbage collection and memory growth to be controlled by setting
      the environment variable \env{R_GC_MEM_GROW}. See \code{?Memory}
      for more details.

      \item (\sQuote{For experts only}, as the introductory manual
      says.)  The use of environment variables \env{R_NSIZE} and
      \env{R_VSIZE} to control the initial (= minimum) garbage
      collection trigger for number of cons cels and size of heap has
      been restored: they can be overridden by the command-line options
      \code{--min-nsize} and \code{--min-vsize}; see \code{?Memory}.

      \item On Windows, the device name for bitmap devices as reported
      by \code{.Device} and \code{.Devices} no longer includes the file
      name.   This is for consistency with other platforms and was
      requested by the \CRANpkg{lattice} maintainer.

      \code{win.metafile()} still uses the file name: the exact form is
      used by package \CRANpkg{tkrplot}.

      \item \code{set.seed(NULL)} re-initializes \code{.Random.seed} as
      done at the beginning of the session if not already set.
      (Suggestion of Bill Dunlap.)

      \item The \code{breaks} argument in \code{hist.default()} can now be
      a function that returns the breakpoints to be used (previously it
      could only return the suggested number of breakpoints).

      \item File \file{share/licenses/licenses.db} has some
      clarifications, especially as to which variants of \sQuote{BSD}
      and \sQuote{MIT} is intended and how to apply them to packages.
      The problematic licence \sQuote{Artistic-1.0} has been removed.
    }
  }

  \subsection{LONG VECTORS}{
    This section applies only to 64-bit platforms.
    \itemize{
      \item There is support for vectors longer than \eqn{2^{31}-1}{2^31
      - 1} elements.  This applies to raw, logical, integer, double,
      complex and character vectors, as well as lists.  (Elements of
      character vectors remain limited to \eqn{2^{31}-1}{2^31 - 1}
      bytes.)

      \item Most operations which can sensibly be done with long vectors
      work: others may return the error \sQuote{long vectors not
      supported yet}.  Most of these are because they explicitly work
      with integer indices (e.g., \code{anyDuplicated()} and
      \code{match()}) or because other limits (e.g., of character strings
      or matrix dimensions) would be exceeded or the operations would be
      extremely slow.

      \item \code{length()} returns a double for long vectors, and
      lengths can be set to \eqn{2^{31}}{2^31} or more by the
      replacement function with a double value.

      \item Most aspects of indexing are available.  Generally
      double-valued indices can be used to access elements beyond
      \eqn{2^{31}-1}{2^31 - 1}.

      \item There is some support for matrices and arrays with each
      dimension less than \eqn{2^{31}}{2^31} but total number of
      elements more than that.  Only some aspects of matrix algebra work
      for such matrices, often taking a very long time.  In other cases
      the underlying Fortran code has an unstated restriction (as was
      found for complex \code{svd()}).

      \item \code{dist()} can produce dissimilarity objects for more
      than 65536 rows (but for example \code{hclust()} cannot process
      such objects).

      \item \code{serialize()} to a raw vector is unlimited in size
      (except by resources).

      \item The C-level function \code{R_alloc} can now allocate
      \eqn{2^{35}}{2^35} or more bytes.

      \item \code{agrep()} and \code{grep()} will return double vectors
      of indices for long vector inputs.

      \item Many calls to \code{.C()} have been replaced by
      \code{.Call()} to allow long vectors to be supported (now or in
      the future).  Regrettably several packages had copied the non-API
      \code{.C()} calls and so failed.

      \item \code{.C()} and \code{.Fortran()} do not accept long vector
      inputs.  This is a precaution as it is very unlikely that existing
      code will have been written to handle long vectors (and the \R
      wrappers often assume that \code{length(x)} is an integer).

      \item Most of the methods for \code{sort()} work for long vectors.

      \code{rank()}, \code{sort.list()} and \code{order()} support
      long vectors (slowly except for radix sorting).

      \item \code{sample()} can do uniform sampling from a long vector.
    }
  }

  \subsection{PERFORMANCE IMPROVEMENTS}{
    \itemize{
      \item More use has been made of \R objects representing registered
      entry points, which is more efficient as the address is provided
      by the loader once only when the package is loaded.

      This has been done for packages \code{base}, \code{methods},
      \code{splines} and \code{tcltk}: it was already in place for the
      other standard packages.

      Since these entry points are always accessed by the \R entry
      points they do not need to be in the load table which can be
      substantially smaller and hence searched faster.  This does mean
      that \code{.C} / \code{.Fortran} / \code{.Call} calls copied from
      earlier versions of \R may no longer work -- but they were never
      part of the API.

      \item Many \code{.Call()} calls in package \pkg{base} have been
      migrated to \code{.Internal()} calls.

      \item \code{solve()} makes fewer copies, especially when \code{b}
      is a vector rather than a matrix.

      \item \code{eigen()} makes fewer copies if the input has dimnames.

      \item Most of the linear algebra functions make fewer copies when
      the input(s) are not double (e.g., integer or logical).

      \item A foreign function call (\code{.C()} etc) in a package
      without a \code{PACKAGE} argument will only look in the first DLL
      specified in the \file{NAMESPACE} file of the package rather than
      searching all loaded DLLs.  A few packages needed \code{PACKAGE}
      arguments added.

      \item The \code{@<-} operator is now implemented as a primitive,
      which should reduce some copying of objects when used.  Note that
      the operator object must now be in package \pkg{base}: do not try
      to import it explicitly from package \pkg{methods}.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item The transitional support for installing packages without
      namespaces (required since \R 2.14.0) has been removed.
      \command{R CMD build} will still add a namespace, but a
      \code{.First.lib()} function will need to be converted.

      \command{R CMD INSTALL} no longer adds a namespace (so
      installation will fail), and a \code{.First.lib()} function in a
      package will be ignored (with an installation warning for now).

      As an exception, packages without a \file{R} directory and no
      \file{NAMESPACE} file can still be installed.

      \item Packages can specify in their \file{DESCRIPTION file} a line
      like \preformatted{     Biarch: yes
}
      to be installed on Windows with \option{--force-biarch}.

      \item Package vignettes can now be processed by other engines
      besides \code{Sweave}; see \sQuote{Writing R Extensions} and the
      \code{tools::vignetteEngine} help topic for details.

      \item The \file{*.R} tangled source code for vignettes is now
      included in tarballs when \command{R CMD build} is used to produce
      them.  In \R 3.0.0, \file{*.R} files not in the sources will be
      produced at install time, but eventually this will be dropped.

      \item The package type \code{"mac.binary"} now looks in a path in
      the repository without any Mac subtype (which used to be
      \samp{universal} or \samp{leopard}): it looks in
      \file{bin/macosx/contrib/3.0} rather than
      \file{bin/macosx/leopard/contrib/2.15}).  This is the type used
      for the \acronym{CRAN} binary distribution for OS X as from \R
      3.0.0.

      \item File \file{etc/Makeconf} makes more use of the macros
      \code{$(CC)}, \code{$(CXX)}, \code{$(F77)} and \code{$(FC)}, so
      the compiler in use can be changed by setting just these (and if
      necessary the corresponding flags and \code{FLIBS}) in file
      \file{~/.R/Makevars}.

      This is convenient for those working with binary distributions of
      \R, e.g.\sspace{}on OS X.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} now gives a warning rather than a
      note if it finds calls to \code{abort}, \code{assert} or
      \code{exit} in compiled code, and has been able to find the
      \file{.o} file in which the calls occur.

      Such calls can terminate the \R process which loads the package.

      \item The location of the build and check environment files can
      now be specified by the environment variables
      \env{R_BUILD_ENVIRON} and \env{R_CHECK_ENVIRON}, respectively.

      \item \command{R CMD Sweave} gains a \option{--compact} option
      to control possibly reducing the size of the PDF file it creates
      when \option{--pdf} is given.

      \item \command{R CMD build} now omits Eclipse's \file{.metadata}
      directories, and \command{R CMD check} warns if it finds them.

      \item \command{R CMD check} now does some checks on functions
      defined within reference classes, including of \code{.Call()} etc
      calls.

      \item \command{R CMD check --as-cran} notes assignments to the
      global environment, calls to \code{data()} which load into the
      global environment, and calls to \code{attach()}.

      \item \command{R CMD build} by default uses the internal method of
      \code{tar()} to prepare the tarball.  This is more likely to
      produce a tarball compatible with \command{R CMD INSTALL} and
      \command{R CMD check}: an external \command{tar} program,
      including options, can be specified \emph{via} the environment
      variable \env{R_BUILD_TAR}.

      \item \code{tools::massageExamples()} is better protected against
      packages which re-define base functions such as \code{cat()} and
      \code{get()} and so can cause \command{R CMD check} to fail when
      checking examples.

      \item \command{R CMD javareconf} has been enhanced to be more
      similar to the code used by \command{configure}.

      There is now a test that a JNI program can be compiled (like
      \command{configure} did) and only working settings are used.

      It makes use of custom settings from configuration recorded in
      \file{etc/javaconf}.

      \item The \option{--no-vignettes} argument of \command{R CMD
	build} has been renamed to the more accurate
      \option{--no-build-vignettes}: its action has always been to
      (re)build vignettes and never omitted them.

      \command{R CMD check} accepts \option{--no-build-vignettes} as a
      preferred synonym for \option{--no-rebuild-vignettes}.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
    \itemize{
      \item The \code{ENCODING} argument to \code{.C()} is defunct.
      Use \code{iconv()} instead.

      \item The \code{.Internal(eval.with.vis)} non-API function has
      been removed.

      \item Support for the converters for use with \code{.C()} has been
      removed, including the oft misused non-API header
      \file{R_ext/RConverters.h}.

      \item The previously deprecated uses of \code{array()} with a
      0-length \code{dim} argument and \code{tapply()} with a 0-length
      \code{INDEX} list are now errors.

      \item \samp{Translation} packages are defunct.

      \item Calling \code{rep()} or \code{rep.int()} on a pairlist or
      other non-vector object is now an error.

      \item Several non-API entry points have been transferred to
      packages (e.g., \code{R_zeroin2}) or replaced by different non-API
      entry points (e.g., \code{R_tabulate}).

      \item The \sQuote{internal} graphics device invoked by
      \code{.Call("R_GD_nullDevice", package = "grDevices")} has
      been removed: use \code{pdf(file = NULL)} instead.

      \item The \code{.Fortran()} entry point \code{"dqrls"} which has
      not been used by \R since version 2.15.1 is no longer available.

      \item Functions \code{traceOn()} and \code{traceOff()} in package
      \pkg{methods} are now defunct.

      \item Function \code{CRAN.packages()} is finally defunct.

      \item Use of \code{col2rgb(0)} is defunct: use \code{par("bg")} or
      \code{NA} instead.

      \item The long-defunct functions \code{Rd_parse()},
      \code{anovalist.lm()}, \code{categpry()}, \code{clearNames()},
      \code{gammaCody()}, \code{glm.fit.null()}, \code{lm.fit.null()},
      \code{lm.wfit.null()}, \code{manglePackageNames()},
      \code{mauchley.test()}, \code{package.contents()},
      \code{print.coefmat()}, \code{reshapeLong()},
      \code{reshapeWide()}, \code{tkclose()}, \code{tkcmd()},
      \code{tkfile.dir()}, \code{tkfile.tail()}, \code{tkopen()},
      \code{tkputs()}, \code{tkread()}, \code{trySilent()} and
      \code{zip.file.extract()} have been removed entirely (but are
      still documented in the help system).

      \item The unused \code{dataPath} argument to
      \code{attachNamespace()} has been removed.

      \item \code{grid.prompt()} has been removed: use
      \code{devAskNewPage()} instead.

      \item The long-deprecated \code{intensities} component is no
      longer returned by \code{hist()}.

      \item \code{mean()} for data frames and \code{sd()} for data
      frames and matrices are defunct.

      \item \code{chol(pivot = FALSE, LINPACK = TRUE)},
      \code{ch2inv(LINPACK = TRUE)}, \code{eigen(EISPACK = TRUE)},
      \code{solve(LINPACK = TRUE)} and \code{svd(LINPACK = TRUE)} are
      defunct: LAPACK will be used, with a warning.

      \item The \code{keep.source} argument to \code{library()} and
      \code{require()} is defunct.  This option needs to be set
      at install time.

      \item Documentation for \code{real()}, \code{as.real()} and
      \code{is.real()} has been moved to \sQuote{defunct} and the
      functions removed.

      \item The \code{maxRasters} argument of \code{pdf()} (unused since
      \R 2.14.0) has been removed.

      \item The unused \code{fontsmooth} argument has been removed from
      the \code{quartz()} device.

      \item All the (non-API) EISPACK entry points in \R have been removed.

      \item \code{chol(pivot = TRUE, LINPACK = TRUE)} is deprecated.

      \item The long-deprecated use of \code{\\synopsis} in the
      \samp{Usage} section of \file{.Rd} files will be removed in \R
      3.1.0.

      \item \code{.find.package()} and \code{.path.package()} are
      deprecated: only the public versions without the dot have ever
      been in the API.

      \item In a package's \file{DESCRIPTION} file, \preformatted{    License: X11}
      is deprecated, since it includes
      \sQuote{Copyright (C) 1996 X Consortium} which cannot be
      appropriate for a current \R package.  Use \sQuote{MIT} or
      \sQuote{BSD_2_clause} instead.
    }
  }

  \subsection{CODE MIGRATION}{
    \itemize{
      \item The C code underlying base graphics has been migrated to the
      \pkg{graphics} package (and hence no longer uses
      \code{.Internal()} calls).

      \item Most of the \code{.Internal()} calls used in the \pkg{stats}
      package have been migrated to C code in that package.

      This means that a number of \code{.Internal()} calls which have
      been used by packages no longer exist, including
      \code{.Internal(cor)} \code{.Internal(cov)},
      \code{.Internal(optimhess)} and \code{.Internal(update.formula)}.

      \item Some \code{.External()} calls to the \code{base} package
      (really to the \R executable or shared library) have been moved to
      more appropriate packages.  Packages should not have been using
      such calls, but some did (mainly those used by \code{integrate()}).
    }
  }

  \subsection{PACKAGE parallel}{
    \itemize{
      \item There is a new function \code{mcaffinity()} which allows
      getting or setting the CPU affinity mask for the current \R process on
      systems that supports this (currently only Linux has been tested
      successfully).  It has no effect on systems which do not support
      process affinity.  Users are not expected to use this function
      directly (with the exception of fixing libraries that break
      affinity settings like OpenBLAS) -- the function is rather
      intended to support affinity control in high-level parallel
      functions.  In the future, \R may supplement lack of affinity
      control in the OS by its own bookkeeping \emph{via} \code{mcaffinity()}
      related to processes and threads it spawns.

      \item \code{mcparallel()} has a new argument \code{mc.affinity}
      which attempts to set the affinity of the child process according
      to the specification contained therein.

      \item The port used by socket clusters is chosen randomly: this
      should help to avoid clashes observed when two users of a
      multi-user machine try to create a cluster at the same time.  To
      reproduce the previous behaviour set environment variable
      \env{R_PARALLEL_PORT} to \code{10187}.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item There has been some minor re-organization of the non-API
      header files.  In particular, \file{Rinternals.h} no longer
      includes the non-API header \file{R_exts/PrtUtil.h}, and that no
      longer includes \file{R_exts/Print.h}.

      \item Passing \code{NULL} to \code{.C()} is now an error.

      \item \code{.C()} and \code{.Fortran()} now warn if
      \code{"single"} arguments are used with \code{DUP = FALSE}, as
      changes to such arguments are not returned to the caller.

      \item C entry points \code{R_qsort} and \code{R_qsort_I} now have
      \code{start} and \code{end} as \code{size_t} to allow them to work
      with longer vectors on 64-bit platforms.  Code using them should
      be recompiled.

      \item A few recently added C entry points were missing the
      remapping to \code{Rf_}, notably \code{[dpq]nbinom_mu}.

      \item Some of the interface pointers formerly available only to
      \command{R.app} are now available to front-ends on all
      Unix-alikes: one has been added for the interface to
      \code{View()}.

      \item \code{PACKAGE = ""} is now an error in \code{.C()} etc calls:
      it was always contrary to the documentation.

      \item Entry point \code{rcont2} has been migrated to package
      \pkg{stats} and so is no longer available.

      \item \code{R_SVN_REVISION} in \file{Rversion.h} is now an integer
      (rather than a string) and hence usable as e.g.
      \code{#if R_SVN_REVISION < 70000}.

      \item The entry points \code{rgb2hsv} and \code{hsv2rgb} have been
      migrated to package \pkg{grDevices} and so are no longer available.

      \item \code{R_GE_version} has been increased to \code{10} and
      \code{name2col} removed (use \code{R_GE_str2col} instead).  \R
      internal colour codes are now defined using the typedef
      \code{rcolor}.

      \item The \code{REPROTECT} macro now checks that the protect index
      is valid.

      \item Several non-API entry points no longer used by \R have been
      removed, including the Fortran entry points \code{chol},
      \code{chol2inv}, \code{cg}, \code{ch} and \code{rg}, and the C
      entry points \code{Brent_fmin}, \code{fft_factor} and \code{fft_work}.

      \item If a \code{.External} call is registered with a number of
      arguments (other than \code{-1}), the number of arguments passed
      is checked for each call (as for other foreign function calls).

      \item It is now possible to write custom connection
      implementations outside core R using \file{R_ext/Connections.h}.
      Please note that the implementation of connections is still
      considered internal and may change in the future (see the above
      file for details).
    }
  }

  \subsection{INTERNATIONALIZATION}{
    \itemize{
      \item The management of translations has been converted to \R
      code: see \code{?tools::update_pkg_po}.

      \item The translations for the \R interpreter and
      \command{RGui.exe} are now part of the \pkg{base} package (rather than
      having sources in directory \file{po} and being installed to
      \file{share/locale}).  Thus the \pkg{base} package supports three
      translation domains, \code{R-base}, \code{R} and \code{RGui}.

      \item The compiled translations which ship with \R are all
      installed to the new package \pkg{translations} for easier
      updating.  The first package of that name found on
      \code{.libPaths()} at the start of the \R session will be used.
      (It is possible messages will be used before \code{.libPaths()} is
      set up in which case the default translations will be used: set
      environment variable \env{R_TRANSLATIONS} to point to the location
      of the intended \pkg{translations} package to use this right from
      the start.)

      \item The translations form a separate group in the Windows
      installer, so can be omitted if desired.

      \item The markup for many messages has been changed to make them
      easier to translate, incorporating suggestions from Łukasz Daniel.
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item There is again support for building without using the C
      \sQuote{long double} type.  This is required by C99, but system
      implementations can be slow or flawed.  Use \command{configure}
      option \option{--disable-long-double}.

      \item \command{make pdf} and \command{make install-pdf} now make
      and install the full reference index (including all base and
      recommended packages).

      \item The 'reference manual' on the Windows GUI menu and included
      in the installer is now the full reference index, including all
      base and recommended packages.

      \item \R help pages and manuals have no ISBNs because ISBN
      rules no longer allow constantly changing content to be assigned
      an ISBN.

      \item The Windows installer no longer installs a Start Menu
      link to the static help pages; as most pages are generated
      dynamically, this led to a lot of broken links.

      \item Any custom settings for Java configuration are recorded in
      file \file{etc/javaconf} for subsequent use by \command{R CMD
	javareconf}.

      \item There is now support for \command{makeinfo} version 5.0
      (which requires a slightly different \file{.texi} syntax).

      \item The minimum versions for \option{--use-system-zlib} and
      \code{--use-system-pcre} are now tested as 1.2.5 and 8.10
      respectively.

      \item On Windows, the stack size is reduced to 16MB on 32-bit
      systems: misguided users were launching many threads without
      controlling the stack size.

      \item \command{configure} no longer looks for file
      \file{~/.Rconfig}: \file{~/.R/config} has long been preferred.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item When \command{R CMD build} is run in an encoding other than
      the one specified in the package's \file{DESCRIPTION} file it
      tries harder to expand the \code{authors@R} field in the specified
      encoding.  (\PR{14958})

      \item If \command{R CMD INSTALL} is required to expand the
      \code{authors@R} field of the \file{DESCRIPTION} file, it tries
      harder to do so in the encoding specified for the package (rather
      than using ASCII escapes).

      \item Fix in package \pkg{grid} for pushing a viewport into a
      layout cell, where the layout is within a viewport that has zero
      physical width OR where the layout has zero total relative width
      (likewise for height).  The layout column widths (or row heights)
      in this case were being calculated with non-finite values.
      (Reported by Winston Chang.)

      \item \code{solve(A, b)} for a vector \code{b} gave the answer
      names from \code{colnames(A)} for \code{LINPACK = TRUE} but not in
      the default case.

      \item \code{La.svd()} accepts logical matrices (as documented, and
      as \code{svd()} did).

      \item \code{legend()} now accepts negative \code{pch} values, in
      the same way \code{points()} long has.

      \item Parse errors when installing files now correctly display
      the name of the file containing the bad code.

      \item In Windows, tcltk windows were not always properly constructed.
      (\PR{15150})

      \item The internal functions implementing \code{parse()},
      \code{tools::parseLatex()} and \code{tools::parse_Rd()} were not
      reentrant, leading to errors in rare circumstances such as a
      garbage collection triggering a recursive call.

      \item Field assignments in reference class objects \emph{via}
      \code{$<-} were not being checked
      because the magic incantation to turn methods on for that
      primitive operator had been inadvertently omitted. %$

      \item \code{setHook(hookname, value, action="replace")} set the
      hook to be the value, rather than a list containing the value as
      documented. (\PR{15167})

      \item  If a package used a \file{NEWS.Rd} file, the main HTML
      package index page did not link to it.  (Reported by Dirk
      Eddelbuettel.)

      \item The primitive implementation of \code{@<-} was not
      checking the class of the replacement.  It now does a check,
      quicker but less general than \code{slot<-}. See the help.

      \item \code{split(x, f)} now recycles classed objects \code{x} in
      the same way as vectors.  (Reported by Martin Morgan.)

      \item \code{pbeta(.28, 1/2, 2200, lower.tail=FALSE, log.p=TRUE)}
      is no longer \code{-Inf}; ditto for corresponding \code{pt()} and
      \code{pf()} calls, such as \code{pt(45, df=5000, lower.tail=FALSE,
	log.p=TRUE)}. (\PR{15162})

      \item The Windows graphics device would crash \R{} if a user
      attempted to load the graphics history from a variable that was
      not a saved history. (\PR{15230})

      \item The workspace size for the \code{predict()}
      method for \code{loess()} could exceed the maximum integer size.
      (Reported by Hiroyuki Kawakatsu.)

      \item \code{ftable(x, row.vars, col.vars)} now also works when the
      \code{*.vars} arguments are (integer or character vectors) of
      length zero.

      \item Calling \code{cat()} on a malformed UTF-8 string could cause
      the Windows GUI to lock up. (\PR{15227})

      \item \code{removeClass(cc)} gave "node stack overflow" for some
      class definitions containing \code{"array"} or \code{"matrix"}.
    }
  }
}

\section{CHANGES in previous versions}{
  \itemize{
    \item Older news can be found in text format in files
    \ifelse{html}{\href{../NEWS.0}{NEWS.0}, \href{../NEWS.1}{NEWS.1}
      and \href{../NEWS.2}{NEWS.2}}{\file{NEWS.0}, \file{NEWS.1} and
      \file{NEWS.2}}
    in the \file{doc} directory.  News in HTML format for
    \R versions from 2.10.0 to 2.15.3 is in
    \ifelse{html}{\url{NEWS.2.html}}{\file{doc/html/NEWS.2.html}}.
  }
}
