% -*- 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{\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{16640})

      \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}}.
  }
}
