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

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

\section{LATER NEWS}{
  \itemize{
    \item News for \R 3.0.0 and later can be found in file
    \file{NEWS.Rd} in the \R sources and files \file{NEWS} and
    \file{doc/html/NEWS.html} in an \R build.
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.15.3}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{lgamma(x)} for very small \code{x} (in the
      denormalized range) is no longer \code{Inf} with a warning.

      \item \code{image()} now sorts an unsorted \code{breaks} vector,
      with a warning.

      \item The internal methods for \code{tar()} and \code{untar()} do
      a slightly more general job for \sQuote{ustar}-style handling of
      paths of more than 100 bytes.

      \item Packages \pkg{compiler} and \pkg{parallel} have been added
      to the reference index (\file{refman.pdf}).

      \item \code{untar(tar = "internal")} has some support for
      \code{pax} headers as produced by e.g.\sspace{}\command{gnutar --posix}
      (which seems prevalent on OpenSUSE 12.2) or
      \command{bsdtar --format pax}, including long path and link names.

      \item \code{sQuote()} and \code{dQuote()} now handle 0-length
      inputs.  (Suggestion of Ben Bolker.)

      \item \code{summaryRprof()} returns zero-row data frames rather
      than throw an error if no events are recorded, for consistency.

      \item The included version of PCRE has been updated to 8.32.

      \item The \pkg{tcltk} namespace can now be re-loaded after
      unloading.

      The Tcl/Tk event loop is inhibited in a forked child from package
      \pkg{parallel} (as in e.g.\sspace{}\code{mclapply()}).

      \item \code{parallel::makeCluster()} recognizes the value
      \samp{random} for the environment variable \env{R_PARALLEL_PORT}:
      this chooses a random value for the port and reduces the chance of
      conflicts when multiple users start a cluster at the same time.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item The default for \env{TAR} on Windows for \command{R CMD
	build} has been changed to be \samp{internal} if no
      \command{tar} command is on the path.

      This enables most packages to be built \sQuote{out of the box}
      without \command{Rtools}: the main exceptions are those which need
      to be installed to re-build vignettes and need \command{Rtools}
      for installation (usually because they contain compiled code).
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item On a 64-bit Windows platform with enough RAM, \code{R_alloc}
      can now allocate up to just under 32GB like other 64-bit
      platforms.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
   \itemize{
      \item Use of \code{col2rgb(0)} is deprecated (see the help page
      for its limitations).

      \item The deprecated \code{intensities} component returned by
      \code{hist()} is no longer recognized by the \code{plot()} method
      and will be removed in \R 3.0.0.

      \item \code{real()}, \code{as.real()} and \code{is.real()} are now
      formally deprecated and give a warning.

      \item This is formal notice that the non-API EISPACK entry points
      in \R will be removed shortly.
    }
  }

  \subsection{INSTALLATION}{
   \itemize{
      \item The \command{configure} tests for Objective C and Objective
      C++ now work on Mac OS 10.8 with Xcode 4.5.2 (\PR{15107}).

      \item The cairo-based versions of \code{X11()} now work with
      current versions of cairographics (e.g., 1.12.10).  (\PR{15168})

      A workaround for earlier versions of \R is to use
      \code{X11.options(type = "nbcairo")}.

      \item Configuration and \command{R CMD javareconf} now come up
      with a smaller set of library paths for Java on Oracle-format JDK
      (including OpenJDK).  This helps avoid conflicts between libraries
      (such as \code{libjpeg}) supplied in the JDK and system
      libraries.  This can always be overridden if needed: see the
      \sQuote{R Installation and Administration} manual.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{beta(a, b)} could overflow to infinity in its
      calculations when one of \code{a} and \code{b} was less than one.
      (\PR{15075})

      \item \code{lbeta(a, b)} no longer gives \code{NaN} if \code{a} or
      \code{b} is very small (in the denormalized range).

      \item \code{bquote()} is now able to substitute default arguments in
      single-argument functions.  (\PR{15077})

      \item \code{browseEnv(html = FALSE)} would segfault if called from
      \R (not \command{R.app}) on a CRAN-style Mac OS X build of \R.

      \item \samp{[[<-} for lists (generic vectors) needed to increment
      \code{NAMED} count when RHS is used more than once. (\PR{15098})

      \item On Windows, warnings about opening a file or pipe with a
      non-ASCII description were sometimes output in UTF-8 rather than
      in the current locale's character set.

      \item The \code{call()} function did not duplicate its arguments.
      (\PR{15115})

      \item \code{TukeyHSD()} could give \code{NA} results with some
      \samp{na.action} methods such as \code{na.exclude()}.
      (Hinted at on R-help by John Fox.)

      \item The deprecated \code{svd(X, LINPACK = TRUE)} could alter
      \code{X} in \R 2.15.[12].  (Reported by Bill Dunlap.)

      \item Under Windows, \code{file.link()} and \code{file.symlink()}
      used the link name twice, so would always fail. (Reported
      by Rui Barradas/Oliver Soong).

      \item \code{summaryRprof(memory = "both")} mixed up the units of
      Vcells and Ncells: it now works in bytes.  (\PR{15138})

      \item \code{tools::Rd2HTML()} would sometimes delete text. (\PR{15134})

      \item \code{plot()} failed for \code{"table"} objects containing
      just one entry.  (\PR{15118})

      \item \code{embedFonts()} needed to quote some filepaths.
      (\PR{15149})

      \item \code{parallel::mccollect()} handled \code{NULL} returns
      incorrectly (removing the element rather than setting it to
      \code{NULL}).

      \item The full reference index (\file{fullrefman.pdf}) was missing
      packages \pkg{compiler} and \pkg{parallel}.

      \item The report for
      \code{optim(method = "L-BFGS-B", control = list(trace = 1))}
      reported the last completed and not the current iteration, unlike
      other methods and trace levels.  (\PR{15103})

      \item \code{qt(1e-12, 1.2)} no longer gives \code{NaN}.

      \item \code{dt(1e160, 1.2, log=TRUE)} no longer gives \code{-Inf}.

      \item On Windows the \code{untar()} function now quotes the
      directory name when using an external \command{tar} utility, so
      \code{R CMD check} will handle pathnames containing spaces.

      \item The version for Windows 8 and Windows Server 2012 is now
      displayed by \code{win.version()}.  (Reported by Gabor
      Grothendieck.)

      \item The custom Windows installer target \code{myR} in the
      installer \file{Makefile} did not work in 2.15.2.  (Reported
      by Erich Neuwirth.)

      \item \code{aperm(matrix(1:6, 2, dimnames=list(A={}, B={})), "A")}
      no longer segfaults.

      \item Expressions involving user defined operators were not
      always deparsed faithfully. (\PR{15179})

      \item The \code{enc2utf8()} function converted \code{NA_character_}
      to \code{"NA"} in non-UTF-8 locales. (\PR{15201})

      \item The \code{exclude} argument to \code{xtabs()} was ignored
      for \code{"factor"} arguments.

      \item On Windows, work around an event-timing problem when
      the RGui console was closed from the \sQuote{X} control and the closure
      cancelled. (This would on some 64-bit systems crash \R, typically
      those with a slow GPU relative to the CPU.)

      \item On unix \code{Rscript} will pass the \code{r_arch} setting
      it was compiled with on to the R process so that the architecture
      of \code{Rscript} and that of \R will match unless overridden.

      \item On Windows, \code{basename()}, \code{dirname()} and
      \code{file.choose()} have more support for long non-ASCII file
      names with 260 or more bytes when expressed in UTF-8.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.15.2}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item The \code{X11()} window gains an icon: the
      latter may be especially useful on Ubuntu's \sQuote{Unity}
      interface.

      The \code{WM_CLASS} should be set in circumstances where the
      Window Manager failed to make use of X11 resource settings.

      (Contributed by Philip Johnson.)

      \item The \code{"Date"} and \code{"POSIXt"} methods for
      \code{cut()} will accept an unsorted \code{breaks} argument (as
      the default method does, although this was undocumented).
      (Wish of \PR{14961}.)

      \item Reference class methods (in the \pkg{methods} package) that
      use other methods in an indirect way (e.g., by \code{sapply()})
      must tell the code analysis to include that method.  They can now
      do so by invoking \code{$usingMethods()}. %$

      \item More Polish translations are available: for the
      \command{RGui} menus and for several recommended packages.

      \item Multistratum MANOVA works. In fact, it seems to have done so
      for years in spite of the help page claiming it did not.

      \item \code{qqline()} has new optional arguments
      \code{distribution}, \code{probs} and \code{qtype}, following the
      example of \CRANpkg{lattice}'s \code{panel.qqmathline()}.

      \item The handling of single quotes in the \code{en@quot}
      pseudo-language has been slightly improved.  Double quotes are no
      longer converted.

      \item New functions \code{checkPoFiles()} and \code{checkPoFile()}
      have been added to the \pkg{tools} package to check for
      consistency of format strings in translation files.

      \item \code{model.matrix(~1, ...)} now also contains the same
      rownames that less trivial formulae produce.  (Wish of \PR{14992},
      changes the output of several packages.)

      \item Misuse of \code{rep()} on undocumented types of objects
      (e.g., calls) is now reported as an error.

      \item The included LAPACK has been updated to 3.4.1, with some
      patches from the current SVN sources.  (\emph{Inter alia}, this
      resolves \PR{14692}.)

      \item \code{file.copy(recursive = TRUE)} has some additional
      checks on user error leading to attempted infinite recursion (and on
      some platforms to crashing \R).

      \item PCRE has been updated to version 8.31, a bug-fix release.

      \item The included version of \code{liblzma} has been updated to
      version 5.0.4, a minor bug-fix release.

      \item New function \code{.bincode()}, a \sQuote{bare-bones}
      version of \code{cut.default(labels = FALSE)} for use in packages
      with \code{image()} methods.

      \item The HTML manuals now use directional single quotes.

      \item \code{maintainer()} now converts embedded new lines to
      spaces.  It no longer gives a non-obvious error for non-installed
      packages.

      \item The \code{X11()} device has some protection against
      being used with forked processes \emph{via} package \pkg{parallel}.

      \item Setting the environment variable \env{R_OSX_VALGRIND} (to
      any value) allows \R to be run under \command{valgrind} on Mac OS
      10.6 and 10.7 (\command{valgrind} currently has very limited
      support for 10.8), provided \code{system()} is not used (directly
      or indirectly).  This should not be needed for \command{valgrind}
      >= 3.8.1.

      \item The \code{model.frame()} method for \code{"lm"} uses
      \code{xlevels}: this is safer if \code{data} was supplied or
      \code{model = FALSE} was used and the levels of factors used in
      the fit had been re-ordered since fitting.

      Similarly, \code{model.frame(fm, data=<data>)} copies across
      the variables used for safe prediction from the fit.

      \item Functions such as \code{parLapply()} in package
      \pkg{parallel} can make use of a default cluster if one is set.
      (Reported by Martin Morgan.)

      \item \code{chol(pivot = TRUE, LINPACK = FALSE)} is now available
      using LAPACK 3.2 subroutine \code{DPSTRF}.

      \item The functions \code{.C()}, \code{.Call()},
      \code{.External()} and \code{.Fortran()} now check that they are
      called with an unnamed first argument: the formal arguments were
      changed from \code{name=} to \code{.NAME=} in \R 2.13.0, but some
      packages were still using the old name.  This is currently a
      warning, but will be an error in future.

      \item \code{step()} no longer tries to improve a model with
      AIC of \code{-Inf} (a perfect fit).

      \item \code{spline()} and \code{splinefun()} gain a new method
      \code{"hyman"}, an implementation of Hyman's method of
      constructing monotonic interpolation splines.  (Based on
      contributions of Simon Wood and Rob Hyndman.)

      \item On Windows, the C stack size has been increased to 64MB (it
      has been 10MB since the days of 32MB RAM systems).
    }
  }

  \subsection{PERFORMANCE IMPROVEMENTS}{
    \itemize{
      \item \code{array()} is now implemented in C code (for speed) when
      \code{data} is atomic or an unclassed list (so it is known that
      \code{as.vector(data)} will have no class to be used by \code{rep()}).

      \item \code{rep()} is faster and uses less memory,
      substantially so in some common cases (e.g., if \code{times} is of
      length one or \code{length.out} is given, and \code{each = 1}).

      \item \code{findInterval()}, \code{tabulate()}, \code{cut()},
      \code{hist()} and \code{image.default()} all use \code{.Call()}
      and are more efficient.

      \item \code{duplicated()}, \code{unique()} and similar now
      support vectors of lengths above \eqn{2^{29}}{2^29} on 64-bit
      platforms.

      \item Omitting \code{PACKAGE} in \code{.C()} etc calls was
      supposed to make use of the DLL from the namespace within which
      the enclosing function was defined.  It was less successful in
      doing so than it might be, and gave no indication it had failed.

      A new search strategy is very successful and gives a warning
      when it fails.  In most cases this is because the entry point is
      not actually provided by that package (and so \code{PACKAGE}
      should be used to indicate which package is intended) but in some
      the namespace does not have a DLL specified by a
      \code{useDynLib()} directive so \code{PACKAGE} is required.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} now checks if a package can be loaded
      by \code{library(pkgname, lib.loc = "somewhere")} without being on
      the library search path (unless it is already installed in
      \code{.Library}, when it always will be).

      \item \command{R CMD check --as-cran} notes \sQuote{hidden} files
      and directories (with names starting with a dot) that are not
      needed for the operation of \command{R CMD INSTALL} or \code{R CMD
	build}: such files should be excluded from the published tarball.

      \item \command{R CMD check} (if checking subdirectories) checks
      that the \R code in any demos is ASCII and can be parsed, and
      warns if not.

      \item When \code{R CMD Rd2pdf} is used with \file{inputenx.sty},
      it allows further characters (mainly for Eastern European
      languages) by including \file{ix-utf8enc.dfu} (if available).
      (Wish of \PR{14989}.)

      \item \command{R CMD build} now omits several types of hidden
      files/directories, including \file{inst/doc/.Rinstignore},
      \file{vignettes/.Rinstignore}, (\file{.Rinstignore} should be at
      top level), \file{.deps} under \file{src}, \file{.Renviron},
      \file{.Rprofile}, \file{.Rproj.user}, \file{.backups},
      \file{.cvsignore}, \file{.cproject}, \file{.directory},
      \file{.dropbox}, \file{.exrc}, \file{.gdb.history},
      \file{.gitattributes}, \file{.gitignore}, \file{.gitmodules},
      \file{.hgignore}, \file{.hgtags}, \file{.htaccess},
      \file{.latex2html-init}, \file{.project}, \file{.seed},
      \file{.settings}, \file{.tm_properties} and various leftovers.

      \item \command{R CMD check} now checks for \code{.C()},
      \code{.Call()}, \code{.External()} and \code{.Fortran()} calls in
      other packages, and gives a warning on those found from \R itself
      (which are not part of the API and change without notice: many
      will be changed for \R 3.0.0).
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item The limit for \code{R_alloc} on 64-bit platforms has been
      raised to just under 32GB (from just under 16GB).

      \item The misuse of \code{.C("name", ..., PACKAGE = foo)} where
      \code{foo} is an arbitrary \R object is now an error.

      The misuse \code{.C("name",..., PACKAGE = "")} is now warned about
      in \command{R CMD check}, and will be an error in future.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
   \itemize{
      \item Use of \code{array()} with a 0-length \code{dim} argument is
      deprecated with a warning (and was contrary to the documentation).

      \item Use of \code{tapply()} with a 0-length \code{INDEX} list is
      deprecated with a warning.

      \item \samp{Translation} packages are deprecated.

      \item Calling \code{rep()} or \code{rep.int()} on a pairlist is
      deprecated and will give a warning.  In any case, \code{rep()}
      converted a pairlist to a list so you may as well do that
      explicitly.

      \item Entry point \code{rcont2} is no longer part of the API, and
      will move to package \pkg{stats} in \R 3.0.0.

      \item The \sQuote{internal} graphics device invoked by
      \code{.Call("R_GD_nullDevice", package = "grDevices")} is about to
      be removed: use \code{pdf(file = NULL)} instead.

      \item \code{eigen(EISPACK = TRUE)},
      \code{chol(pivot = FALSE, LINPACK = TRUE)},
      \code{chol2inv(LINPACK = TRUE)}, \code{solve(LINPACK = TRUE)} and
      \code{svd(LINPACK = TRUE)} are deprecated and give a warning.

      They were provided for compatibility with \R 1.7.0 (Mar 2003)!

      \item The \sQuote{internal function} \code{kappa.tri()} has been
      renamed to \code{.kappa_tri()} so it is not inadvertently called
      as a method for class \code{"tri"}.

      \item Functions \code{sessionData()} and \code{browseAll()} in
      package \pkg{methods} are on a help page describing them as
      \sQuote{deprecated} and are now formally deprecated.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item For a Windows or Mac OS X binary package install,
      \code{install.packages()} will check if a source package is
      available on the same repositories, and report if it is a later
      version or there is a source package but no binary package
      available.

      This check can be suppressed: see the help page.

      \item \code{install.packages(type = "both")} has been enhanced.
      In interactive use it will ask whether to choose the source
      version of a package if the binary version is older and contains
      compiled code, and also asks if source packages with no binary
      version should be installed.
    }
  }

  \subsection{INSTALLATION}{
     \itemize{
      \item There is a new \command{configure} option
      \option{--with-libtiff} (mainly in case the system installation
      needs to be avoided).

      \item LAPACK 3.4.1 does use some Fortran 90 features, so
      \command{g77} no longer suffices.

      \item If an external LAPACK is used, it must be version 3.2 or later.
    }
 }

  \subsection{BUG FIXES}{
    \itemize{
      \item On Windows, starting \command{Rterm} via \command{R.exe}
      caused Ctrl-C to misbehave.  (\PR{14948})

      \item The \code{tools::latexToUtf8()} function missed conversions that
      were contained within braces.

      \item Long timezone specifications (such as a file name preceded
      by \code{:}) could crash \code{as.POSIXlt}.  (\PR{14945})

      \item \code{R CMD build --resave-data} could fail if there was no
      \file{data} directory but there was an \file{R/sysdata.rda} file.
      (\PR{14947})

      \item \code{is.na()} misbehaved on a 0-column data frame.
      (\PR{14959})

      \item \code{anova.lmlist()} failed if \code{test} was
      supplied.  (\PR{14960})

      It was unable to compute Cp tests for object of class \code{"lm"}
      (it assumed class \code{"glm"}).

      \item The \code{formula} method for \code{sunflowerplot()} now
      allows \code{xlab} and \code{ylab} to be set.  (Reported by Gerrit
      Eichner.)

      \item The \code{"POSIXt"} and \code{"Date"} methods for \code{hist()}
      could fail on Windows where adjustments to the right-hand boundary
      crossed a DST transition time.

      \item On Windows, the code in \code{as.POSIXct()} to handle
      incorrectly specified \code{isdst} fields might have resulted in
      \code{NA} being returned.

      \item \code{aov()} and \code{manova()} gave spurious warning about
      singular error model in the multiresponse case.

      \item In \code{ns()} and \code{bs()}, specifying \code{knots = NULL}
      is now equivalent to omitting it, also when \code{df} is
      specified.  (\PR{14970})

      \item \code{sprintf()} did not accept numbered arguments ending
      in zero.  (\PR{14975})

      \item \code{rWishart()} could overflow the C stack and maybe crash
      the \R process for dimensions of several hundreds or more.
      (Reported by Michael Braun on R-sig-mac.)

      \item Base package vignettes (e.g., \code{vignette("Sweave")}) were
      not fully installed in builds of \R from the tarball.

      \item \code{lchoose()} and \code{choose()} could overflow the C
      stack and crash \R.

      \item When given a 0-byte file and asked to keep source
      references, \code{parse()} read input from \code{stdin()}
      instead.

      \item \code{pdf(compress = TRUE)} did not delete temporary files
      it created until the end of the \R session.  (\PR{14991})

      \item \code{logLik()} did not detect the error of applying it
      to a multiple-response linear model.  (\PR{15000})

      \item \code{file.copy(recursive = TRUE)} did not always report
      \code{FALSE} for a failure two or more directories deep.

      \item \code{qgeom()} could return \code{-1} for extremely small
      \code{q}. (\PR{14967})

      \item \code{smooth.spline()} used \code{DUP = FALSE} which allowed
      its compiled C code to change the function: this was masked by the
      default byte-compilation. (\PR{14965})

      \item In Windows, the GUI preferences for foreground color were
      not always respected.  (Reported by Benjamin Wells.)

      \item On OS X, the Quartz versions of the bitmap devices did not
      respect \code{antialias = "none"}.  (\PR{15006})

      \item \code{unique()} and similar would infinite-loop if called on
      a vector of length > \eqn{2^{29}}{2^29} (but reported that the
      vector was too long for \eqn{2^{30}}{2^30} or more).

      \item \code{parallel::stopCluster()} now works with MPI
      clusters without \CRANpkg{snow} being on the search path.

      \item \code{terms.formula()} could exhaust the stack, and the
      stack check did not always catch this before the segfault.
      (\PR{15013})

      \item \code{sort.list(method = "radix")} could give incorrect
      results on certain compilers (seen with \command{clang} on Mac OS
      10.7 and \command{Xcode 4.4.1}).

      \item \code{backsolve(T, b)} gave incorrect results when
      \code{nrows(b) > ncols(T)} and \code{b} had more than one column.

      It could segfault or give nonsense if \code{k} was specified as
      more than \code{ncols(T)}.

      \item \code{smooth.spline()} did not check that a specified
      numeric \code{spar} was of length 1, and gave corrupt results if
      it was of length 0.

      \item Protection added to \code{do_system}. (\PR{15025})

      \item Printing of vectors with names > 1000 characters now works
      correctly rather than truncating. (\PR{15028})

      \item \code{qr()} for a complex matrix did not pivot the column names.

      \item \code{--with-blas='-framework vecLib'} now also works on OS X 10.8.

      \item \command{R CMD check} no longer fails with an error if
      a \file{DESCRIPTION} file incorrectly contains a blank line.
      (Reported by Bill Dunlap.)

      \item \code{install.packages(type = "both")} could call
      \code{chooseCRANmirror()} twice.

      \item \code{lm.wfit()} could segfault in \R 2.15.1 if all the
      weights were zero. (\PR{15044})

      \item A malformed package name could cause \command{R CMD INSTALL}
      to write outside the target library.

      \item Some of the quality control functions
      (e.g., \code{tools::checkFF()}) were wrongly identifying the source
      of S4 methods in a package and so not checking them.

      \item The default type of display by \code{browseEnv()} when using
      \command{R.app} on Mac OS X has been incorrect for a long time.

      \item The implementation of \code{importMethodsFrom} in a
      \code{NAMESPACE} file could be confused and fail to find generics
      when importing from multiple packages (reported and fixed by
      Michael Lawrence).

      \item The detection of the C stack direction is better protected
      against compiler optimization. (\PR{15011})

      \item Long custom line types would sometimes segfault on the
      cairographics-based devices. (\PR{15055})

      \item \code{tools::checkPoFile()} unprotected too early in its C
      code and so segfaulted from time to time.

      \item The Fortran code underlying \code{nlminb()} could
      infinite-loop if any of the input functions returned \code{NA} or
      \code{NaN}.  This is now an error for the gradient or Hessian, and
      a warning for the function (with the value replaced by
      \code{Inf}).  (In part, \PR{15052}.)

      \item The code for creating \code{coerce()} methods could
      generate false notes about ambiguous selection; the notes have
      been suppressed for this function.

      \item \code{arima.sim()} could give too long an output in some
      corner cases (in part, \PR{15068}).

      \item \code{anova.glm()} with \code{test = "Rao"} didn't work when
      models included an offset. (Reported by Søren Feodor Nielsen.)

      \item \code{as.data.frame.matrix()} could return invalid data
      frame with no \code{row.names} attribute for 0-row matrix. (Reported
      by Hervé Pagès.)

      \item Compilation with the \code{vecLib} or \code{Accelerate}
      frameworks on OS X without using that also for LAPACK is more
      likely to be successful.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.15.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{source()} now uses \code{withVisible()} rather than
      \code{.Internal(eval.with.vis)}.  This sometimes alters tracebacks
      slightly.

      \item \code{install.packages("pkg_version.tgz")} on Mac OS X now
      has sanity checks that this is actually a binary package (as
      people have tried it with incorrectly named source packages).

      \item \code{splineDesign()} and \code{spline.des()} in package
      \pkg{splines} have a new option \code{sparse} which can be used
      for efficient construction of a sparse B-spline design matrix
      (\emph{via} \CRANpkg{Matrix}).

      \item \code{norm()} now allows \code{type = "2"} (the
      \sQuote{spectral} or 2-norm) as well, mainly for didactical
      completeness.

      \item \code{pmin()} and \code{pmax()} now also work when one of
      the inputs is of length zero and others are not, returning a
      zero-length vector, analogously to, say, \code{+}.

      \item \code{colorRamp()} (and hence \code{colorRampPalette()}) now
      also works for the boundary case of just one color when the ramp is
      flat.

      \item \code{.C()} gains some protection against the misuse of
      character vector arguments.  (An all too common error is to pass
      \code{character(N)}, which initializes the elements to \code{""},
      and then attempt to edit the strings in-place, sometimes forgetting
      to terminate them.)

      \item Calls to the new function \code{globalVariables()} in
      package \pkg{utils} declare that functions and other objects in a
      package should be treated as globally defined, so that \code{CMD
      check} will not note them.

      \item \code{print(packageDescription(*))} trims the \code{Collate}
      field by default.

      \item The included copy of \code{zlib} has been updated to version
      1.2.7.

      \item A new option \code{"show.error.locations"} has been added.
      When set to \code{TRUE}, error messages will contain the
      location of the most recent call containing source reference
      information. (Other values are supported as well; see
      \code{?options}.)

      \item The NA warning messages from e.g.\sspace{}\code{pchisq()} now report
      the call to the closure and not that of the \code{.Internal}.

      \item Added Polish translations by Łukasz Daniel.
    }
  }

  \subsection{PERFORMANCE IMPROVEMENTS}{
    \itemize{
      \item In package \pkg{parallel}, \code{makeForkCluster()} and the
      multicore-based functions use native byte-order for serialization
      (deferred from 2.15.0).

      \item \code{lm.fit()}, \code{lm.wfit()}, \code{glm.fit()} and
      \code{lsfit()} do less copying of objects, mainly by using
      \code{.Call()} rather than \code{.Fortran()}.

      \item \code{.C()} and \code{.Fortran()} do less copying: arguments
      which are raw, logical, integer, real or complex vectors and are
      unnamed are not copied before the call, and (named or not) are not
      copied after the call.  Lists are no longer copied (they are
      supposed to be used read-only in the C code).

      \item \code{tabulate()} makes use of \code{.C(DUP = FALSE)} and
      hence does not copy \code{bin}.  (Suggested by Tim Hesterberg.)
      It also avoids making a copy of a factor argument \code{bin}.

      \item Other functions (often or always) doing less copying include
      \code{cut()}, \code{dist()}, the complex case of \code{eigen()},
      \code{hclust()}, \code{image()}, \code{kmeans()}, \code{loess()},
      \code{stl()} and \code{svd(LINPACK = TRUE)}.

      \item There is less copying when using primitive replacement
      functions such as \code{names()}, \code{attr()} and
      \code{attributes()}.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
   \itemize{
      \item The converters for use with \code{.C()} (see
      \code{?getCConverterDescriptions}) are deprecated: use the
      \code{.Call()} interface instead.  There are no known examples
      (they were never fully documented).
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item For \command{R CMD check}, a few people have reported
      problems with junctions on Windows (although they were tested on
      Windows 7, XP and Server 2008 machines and it is unknown under
      what circumstances the problems occur).  Setting the environment
      variable \env{R_WIN_NO_JUNCTIONS} to a non-empty value (e.g., in
      \file{~/.R/check.Renviron}) will force copies to be used instead.
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item \command{R CMD INSTALL} with \env{_R_CHECK_INSTALL_DEPENDS_}
        set to a true value (as done by \command{R CMD check --as-cran})
        now restricts the packages available when lazy-loading as well
	as when test-loading (since packages such as \CRANpkg{ETLUtils}
	and \CRANpkg{agsemisc} had top-level calls to \code{library()}
	for undeclared packages).

	This check is now also available on Windows.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item C entry points \code{mkChar} and \code{mkCharCE} now check
      that the length of the string they are passed does not exceed
      \eqn{2^{31}-1}{2^31-1} bytes: they used to overflow with
      unpredictable consequences.

      \item C entry points \code{R_GetCurrentSrcref} and
      \code{R_GetSrcFilename} have been added to the API to allow
      debuggers access to the source references on the stack.
    }
  }

  \subsection{WINDOWS-SPECIFIC CHANGES}{
    \itemize{
      \item Windows-specific changes will now be announced in this file
      (\file{NEWS}).  Changes up and including \R 2.15.0 remain in the
      \file{CHANGES} file.

      \item There are two new environment variables which
      control the defaults for command-line options.

      If \env{R_WIN_INTERNET2} is set to a non-empty value, it is as if
      \option{--internet2} was used.

      If \env{R_MAX_MEM_SIZE} is set, it gives the default memory limit
      if \option{--max-mem-size} is not specified: invalid values being
      ignored.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{lsfit()} lost the names from the residuals.

      \item More cases in which \code{merge()} could create a data frame
      with duplicate column names now give warnings.  Cases where
      names specified in \code{by} match multiple columns are errors.

      \item Nonsense uses such as \code{seq(1:50, by = 5)} (from package
      \CRANpkg{plotrix}) and \code{seq.int(1:50, by = 5)} are now errors.

      \item The residuals in the 5-number summary printed by
      \code{summary()} on an \code{"lm"} object are now explicitly
      labelled as weighted residuals when non-constant weights are
      present.  (Wish of \PR{14840}.)

      \item \code{tracemem()} reported that all objects were copied
      by \code{.C()} or \code{.Fortran()} whereas only some object types
      were ever copied.

      It also reported and marked as copies \emph{some} transformations
      such as \code{rexp(n, x)}: it no longer does so.

      \item The \code{plot()} method for class \code{"stepfun"} only
      used the optional \code{xval} argument to compute \code{xlim} and
      not the points at which to plot (as documented).  (\PR{14864})

      \item Names containing characters which need to be escaped were
      not deparsed properly.  (\PR{14846})

      \item Trying to update (recommended) packages in
      \file{R_HOME/library} without write access is now dealt with more
      gracefully.  Further, such package updates may be skipped (with a
      warning), when a newer installed version is already going to be
      used from \code{.libPaths()}.  (\PR{14866})

      \item \code{hclust()} is now fast again (as up to end of 2003),
      with a different fix for the "median"/"centroid" problem.  (\PR{4195}).

      \item \code{get_all_vars()} failed when the data came entirely
      from vectors in the global environment. (\PR{14847})

      \item \command{R CMD check} with \env{_R_CHECK_NO_RECOMMENDED_}
      set to a true value (as done by the \command{--as-cran} option)
      could issue false errors if there was an indirect dependency
      on a recommended package.

      \item \code{formatC()} uses the C entry point \code{str_signif}
      which could write beyond the length allocated for the output string.

      \item Missing default argument added to implicit S4 generic for
      \code{backsolve()}. (\PR{14883})

      \item Some bugs have been fixed in handling load actions that
      could fail to export assigned items or generate spurious warnings
      in \code{CMD check} on loading.

      \item For \code{tiff(type = "windows")}, the numbering of per-page
      files except the last was off by one.

      \item On Windows, loading package \pkg{stats} (which is done for
      a default session) would switch line endings on \file{stdout}
      and \file{stderr} from CRLF to LF.  This affected
      \command{Rterm} and \command{R CMD BATCH}.

      \item On Windows, the compatibility function \code{x11()} had
      not kept up with changes to \code{windows()}, and issued
      warnings about bad parameters. (\PR{14880})

      \item On Windows, the \code{Sys.glob()} function did not handle
      UNC paths as it was designed to try to do. (\PR{14884})

      \item In package \pkg{parallel}, \code{clusterApply()} and similar
      failed to handle a (pretty pointless) length-1 argument. (\PR{14898})

      \item Quartz Cocoa display reacted asynchronously to
      \code{dev.flush()} which means that the redraw could be performed
      after the plot has been already modified by subsequent code. The
      redraw is now done synchronously in \code{dev.flush()} to allow
      animations without sleep cycles.

      \item Source locations reported in \code{traceback()} were
      incorrect when byte-compiled code was on the stack.

      \item \code{plogis(x, lower = FALSE, log.p = TRUE)} no longer
      underflows early for large x (e.g., 800).

      \item \code{?Arithmetic}'s \dQuote{\code{1 ^ y} and \code{y ^ 0}
	are \code{1}, \emph{always}} now also applies for \code{integer}
      vectors \code{y}.

      \item X11-based pixmap devices like \code{png(type = "Xlib")} were
      trying to set the cursor style, which triggered some warnings and
      hangs.

      \item Code executed by the built-in HTTP server no longer allows
      other HTTP clients to re-enter \R until the current worker
      evaluation finishes, to prevent cascades.

      \item The \code{plot()} and \code{Axis()} methods for class
      \code{"table"} now respect graphical parameters such as
      \code{cex.axis}.  (Reported by Martin Becker.)

      \item Under some circumstances \code{package.skeleton()} would
      give out progress reports that could not be translated and so were
      displayed by question marks.  Now they are always in English.
      (This was seen for CJK locales on Windows, but may have occurred
      elsewhere.)

      \item The evaluator now keeps track of source references outside
      of functions, e.g.\sspace{}when \code{source()} executes a script.

      \item The replacement method for \code{window()} now works
      correctly for multiple time series of class \code{"mts"}.
      (\PR{14925})

      \item \code{is.unsorted()} gave incorrect results on non-atomic
      objects such as data frames.  (Reported by Matthew Dowle.)

      \item The value returned by \code{tools::psnice()} for invalid
      \code{pid} values was not always \code{NA} as documented.

      \item Closing an \code{X11()} window while \code{locator()} was
      active could abort the \R process.

      \item \code{getMethod(f, sig)} produced an incorrect error message
      in some cases when \code{f} was not a string.

      \item Using a string as a \dQuote{call} in an error condition
      with \code{options(showErrorCalls=TRUE)} could cause a segfault.
      (\PR{14931})

      \item The string \code{"infinity"} allowed by C99 was not accepted
      as a numerical string value by e.g.\sspace{}\code{scan()} and
      \code{as.numeric()}.  (\PR{14933})

      \item In \code{legend()}, setting some entries of \code{lwd} to
      \code{NA} was inconsistent (depending on the graphics device) in
      whether it would suppress those lines; now it consistently does
      so.  (\PR{14926})

      \item \code{by()} failed for a zero-row data frame.  (Reported by
      Weiqiang Qian.)

      \item The Yates' correction in \code{chisq.test()} could be bigger
      than the terms it corrected, previously leading to an infinite
      test statistic in some corner cases which are now reported as
      \code{NaN}.

      \item \code{xgettext()} and related functions sometimes returned
      items that were not strings for translation. (\PR{14935})

      \item \code{plot(<lm>, which=5)} now correctly labels the factor
      level combinations for the special case where all
      \eqn{h_ii}{h[i,i]} are the same. (\PR{14837})

      \item \code{Sys.glob()} caused a segfault if the first element of
      \code{path} was \code{NA_character}. (\PR{14990})
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.15.0}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item The behaviour of \code{unlink(recursive = TRUE)} for a
      symbolic link to a directory has changed: it now removes the link
      rather than the directory contents (just as \command{rm -r} does).

      On Windows it no longer follows reparse points (including
      junctions and symbolic links).
    }
  }

  \subsection{NEW FEATURES}{
    \itemize{
      \item Environment variable \env{RD2DVI_INPUTENC} has been renamed
      to \env{RD2PDF_INPUTENC}.

      \item \code{.Deprecated()} becomes a bit more flexible, getting an
      \code{old} argument.

      \item Even data-only packages without \R code need a namespace and
      so may need to be installed under \R 2.14.0 or later.

      \item \code{assignInNamespace()} has further restrictions on use
      apart from at top-level, as its help page has warned.
      Expect it to be disabled from programmatic use in the future.

      \item \code{system()} and \code{system2()} when capturing output
      report a non-zero status in the new \code{"status"} attribute.

      \item \code{kronecker()} now has an S4 generic in package
      \pkg{methods} on which packages can set methods.  It will be
      invoked by \code{X \%x\% Y} if either \code{X} or \code{Y} is an S4
      object.

      \item \code{pdf()} accepts forms like \code{file = "|lpr"} in the
      same way as \code{postscript()}.

      \item \code{pdf()} accepts \code{file = NULL}.
      This means that the device does NOT create a PDF file
      (but it can still be queried, e.g., for font metric info).

      \item \code{format()} (and hence \code{print()}) on
      \code{"bibentry"} objects now uses \code{options("width")} to
      set the output width.

      \item \code{legend()} gains a \code{text.font} argument. (Suggested
      by Tim Paine, \PR{14719}.)

      \item \code{nchar()} and \code{nzchar()} no longer accept factors
      (as integer vectors).  (Wish of \PR{6899}.)

      \item \code{summary()} behaves slightly differently (or more
      precisely, its \code{print()} method does).  For numeric inputs, the
      number of NAs is printed as an integer and not a real.  For dates
      and datetimes, the number of NAs is included in the printed output
      (the latter being the wish of \PR{14720}).

      The \code{"data.frame"} method is more consistent with the default
      method: in particular it now applies \code{zapsmall()} to
      numeric/complex summaries.

      \item The number of items retained with \code{options(warn = 0)}
      can be set by \code{options(nwarnings=)}.

      \item There is a new function \code{assignInMyNamespace()} which
      uses the namespace of the function it is called from.

      \item \code{attach()} allows the default name for an attached file
      to be overridden.

      \item \code{bxp()}, the work horse of \code{boxplot()}, now uses a
      more sensible default \code{xlim} in the case where \code{at} is
      specified differently from \code{1:n}, see the discussion on R-devel,
      \url{https://stat.ethz.ch/pipermail/r-devel/2011-November/062586.html}.

      \item New function \code{paste0()}, an efficient version of
      \code{paste(*, sep="")}, to be used in many places for more
      concise (and slightly more efficient) code.

      \item Function \code{setClass()} in package \pkg{methods} now
      returns, invisibly, a generator function for the new class,
      slightly preferred to calling \code{new()}, as explained on the
      \code{setClass} help page.

      \item The \code{"dendrogram"} method of \code{str()} now takes
      its default for \code{last.str} from option \code{str.dendrogram.last}.

      \item New simple \code{fitted()} method for \code{"kmeans"} objects.

      \item The \code{traceback()} function can now be called with
      an integer argument, to display a current stack trace. (Wish of
      \PR{14770}.)

      \item \code{setGeneric()} calls can be simplified when creating
      a new generic function by supplying the default method as the
      \code{def} argument.  See \code{?setGeneric}.

      \item \code{serialize()} has a new option \code{xdr = FALSE} which
      will use the native byte-order for binary serializations.  In
      scenarios where only little-endian machines are involved (these
      days, close to universal) and (un)serialization takes an
      appreciable amount of time this may speed up noticeably
      transferring data between systems.

      \item The internal (un)serialization code is faster for long
      vectors, particularly with XDR on some platforms.  (Based on a
      suggested patch by Michael Spiegel.)
      % https://stat.ethz.ch/pipermail/r-devel/2011-September/062113.html

      \item For consistency, circles with zero radius are omitted by
      \code{points()} and \code{grid.circle()}.  Previously this was
      device-dependent, but they were usually invisible.

      \item \code{NROW(x)} and \code{NCOL(x)} now work whenever
      \code{dim(x)} looks appropriate, e.g., also for more generalized
      matrices.

      \item PCRE has been updated to version 8.30.

      \item The internal \code{R_Srcref} variable is now updated
      before the browser stops on entering a function.  (Suggestion of
      \PR{14818}.)

      \item There are \sQuote{bare-bones} functions \code{.colSums()},
      \code{.rowSums()}, \code{.colMeans()} and \code{.rowMeans()} for
      use in programming where ultimate speed is required.

      \item The formerly internal function
      \code{.package_dependencies()} from package \pkg{tools} for
      calculating (recursive) (reverse) dependencies on package databases
      has been renamed to \code{package_dependencies()} and is now
      exported.

      \item There is a new function \code{optimHess()} to compute the
      (approximate) Hessian for an \code{optim()} solution if
      \code{hessian = TRUE} was forgotten.

      \item \code{.filled.contour()} is a \sQuote{bare-bones} function to
      add a filled-contour rectangular plot to an already prepared plot
      region.

      \item The stepping in debugging and single-step browsing modes has
      changed slightly: now left braces at the start of the body are
      stepped over for \code{if} statements as well as for \code{for} and
      \code{while} statements.  (Wish of \PR{14814}.)

      \item \code{library()} no longer warns about a conflict with a
      function from \code{package:base} if the function has the same
      code as the base one but with a different environment.  (An
      example is \code{Matrix::det()}.)

      \item When deparsing very large language objects,
      \code{as.character()} now inserts newlines after each line of
      approximately 500 bytes, rather than truncating to the first
      line.

      \item New function \code{rWishart()} generates Wishart-distributed
      random matrices.

      \item Packages may now specify actions to be taken when the
      package is loaded (\code{setLoadActions()}).

      \item \code{options(max.print = Inf)} and similar now give an
      error (instead of warnings later).

      \item The \code{"difftime"} replacement method of \code{units}
      tries harder to preserve other attributes of the argument.  (Wish
      of \PR{14839}.)

      \item \code{poly(raw = TRUE)} no longer requires more unique
      points than the degree.  (Requested by John Fox.)
    }
  }

  \subsection{PACKAGE parallel}{
    \itemize{
      \item There is a new function \code{mcmapply()}, a parallel version
      of \code{mapply()}, and a wrapper \code{mcMap()}, a parallel
      version of \code{Map()}.

      \item A default cluster can be registered by the new function
      \code{setDefaultCluster()}: this will be used by default in
      functions such as \code{parLapply()}.

      \item \code{clusterMap()} has a new argument \code{.scheduling} to
      allow the use of load-balancing.

      \item There are new load-balancing functions \code{parLapplyLB()}
      and \code{parSapplyLB()}.

      \item \code{makePSOCKCluster()} has a new option \code{useXDR =
	FALSE} which can be used to avoid byte-shuffling for
      serialization when all the nodes are known to be little-endian (or
      all big-endian).
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item Non-ASCII vignettes without a declared encoding are no
      longer accepted.

      \item C/C++ code in packages is now compiled with \code{-NDEBUG}
      to mitigate against the C/C++ function \code{assert} being called
      in production use.  Developers can turn this off during package
      development with \code{PKG_CPPFLAGS = -UNDEBUG}.

      \item \command{R CMD INSTALL} has a new option \option{--dsym}
      which on Mac OS X (Darwin) dumps the symbols alongside the
      \file{.so} file: this is helpful when debugging with
      \command{valgrind} (and especially when installing packages into
      \file{R.framework}).  [This can also be enabled by setting the
      undocumented environment variable \env{PKG_MAKE_DSYM}, since \R
      2.12.0.]

      \item \command{R CMD INSTALL} will test loading under all installed
      sub-architectures even for packages without compiled code, unless
      the flag \option{--no-multiarch} is used.  (Pure \R packages can
      do things which are architecture-dependent: in the case which
      prompted this, looking for an icon in a Windows \R executable.)

      \item There is a new option \code{install.packages(type = "both")}
      which tries source packages if binary packages are not available,
      on those platforms where the latter is the default.

      \item The meaning of \code{install.packages(dependencies = TRUE)}
      has changed: it now means to install the essential dependencies of
      the named packages plus the \samp{Suggests}, but only the
      essential dependencies of dependencies.  To get the previous
      behaviour, specify \code{dependencies} as a character vector.

      \item \command{R CMD INSTALL --merge-multiarch} is now supported
      on OS X and other Unix-alikes using multiple sub-architectures.

      \item \command{R CMD INSTALL --libs-only} now by default does a
      test load on Unix-alikes as well as on Windows: suppress with
      \option{--no-test-load}.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
       \item \command{R CMD check} now gives a warning rather than a
       note if it finds inefficiently compressed datasets.  With
       \command{bzip2} and \command{xz} compression having been
       available since \R 2.10.0, it only exceptionally makes sense to
       not use them.

       The environment variable \env{_R_CHECK_COMPACT_DATA2_} is
       no longer consulted: the check is always done if
       \env{_R_CHECK_COMPACT_DATA_} has a true value (its default).

       \item Where multiple sub-architectures are to be tested,
       \command{R CMD check} now runs the examples and tests for all the
       sub-architectures even if one fails.

       \item \command{R CMD check} can optionally report timings on
       various parts of the check: this is controlled by environment
       variable \env{_R_CHECK_TIMINGS_} documented in \sQuote{Writing R
	 Extensions}.  Timings (in the style of \command{R CMD BATCH}) are
       given at the foot of the output files from running each test and
       the \R code in each vignette.

       \item There are new options for more rigorous testing by
       \command{R CMD check} selected by environment variables -- see
       the \sQuote{Writing R Extensions} manual.

       \item \command{R CMD check} now warns (rather than notes) on
       undeclared use of other packages in examples and tests:
       increasingly people are using the metadata in the
       \file{DESCRIPTION} file to compute information about packages,
       for example reverse dependencies.

       \item The defaults for some of the options in \command{R CMD
	 check} (described in the \sQuote{R Internals} manual) have
       changed: checks for unsafe and \code{.Internal()} calls and
       for partial matching of arguments in \R function calls are now
       done by default.

       \item \command{R CMD check} has more comprehensive facilities for
       checking compiled code and so gives fewer reports on entry points
       linked into \file{.so}/\file{.dll} files from libraries
       (including C++ and Fortran runtimes).

       Checking compiled code is now done on FreeBSD (as well as the
       existing supported platforms of Linux, Mac OS X, Solaris and
       Windows).

       \item \command{R CMD build} has more options for
       \option{--compact-vignettes}: see \command{R CMD build --help}.

       \item \command{R CMD build} has a new option \option{--md5} to
       add an \file{MD5} file (as done by CRAN): this is used by \code{R
	 CMD INSTALL} to check the integrity of the distribution.

       If this option is not specified, any existing (and probably
       stale) \file{MD5} file is removed.
     }
   }

  \subsection{DEPRECATED AND DEFUNCT}{
   \itemize{
      \item \command{R CMD Rd2dvi} is now defunct: use \command{R CMD Rd2pdf}.

      \item Options such \option{--max-nsize}, \option{--max-vsize} and
      the function \code{mem.limits()} are now defunct.  (Options
      \option{--min-nsize} and \option{--min-vsize} remain available.)

      \item Use of \code{library.dynam()} without specifying all the
      first three arguments is now disallowed.

      Use of an argument \code{chname} in \code{library.dynam()}
      including the extension \file{.so} or \file{.dll} (which was never
      allowed according to the help page) is defunct.  This also applies
      to \code{library.dynam.unload()} and to \code{useDynLib}
      directives in \file{NAMESPACE} files.

      \item The internal functions \code{.readRDS()} and
      \code{.saveRDS()} are now defunct.

      \item The off-line \code{help()} types \samp{"postscript"} and
      \samp{"ps"} are defunct.

      \item \code{Sys.putenv()}, replaced and deprecated in \R 2.5.0, is
      finally removed.

      \item Some functions/objects which have been defunct for five or
      more years have been removed completely.  These include
      \code{.Alias()}, \code{La.chol()}, \code{La.chol2inv()},
      \code{La.eigen()}, \code{Machine()}, \code{Platform()},
      \code{Version}, \code{codes()}, \code{delay()},
      \code{format.char()}, \code{getenv()}, \code{httpclient()},
      \code{loadURL()}, \code{machine()}, \code{parse.dcf()},
      \code{printNoClass()}, \code{provide()}, \code{read.table.url()},
      \code{restart()}, \code{scan.url()}, \code{symbol.C()},
      \code{symbol.For()} and \code{unix()}.

      \item The \code{ENCODING} argument to \code{.C()} is deprecated.
      It was intended to smooth the transition to multi-byte character
      strings, but can be replaced by the use of \code{iconv()} in the
      rare cases where it is still needed.
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item Building with a positive value of
      \option{--with-valgrind-instrumentation} now also instruments logical,
      complex and raw vectors.
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item Passing \R objects other than atomic vectors, functions,
      lists and environments to \code{.C()} is now deprecated and will
      give a warning.  Most cases (especially \code{NULL}) are actually
      coding errors.  \code{NULL} will be disallowed in future.

      \code{.C()} now passes a pairlist as a \code{SEXP} to the compiled
      code.  This is as was documented, but pairlists were in reality
      handled differently as a legacy from the early days of \R.

      \item \code{call_R} and \code{call_S} are deprecated.  They still
      exist in the headers and as entry points, but are no longer
      documented and should not be used for new code.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{str(x, width)} now obeys its \code{width}
      argument also for function headers and other objects \code{x}
      where \code{deparse()} is applied.

      \item The convention for \code{x \%/\% 0L} for integer-mode \code{x}
      has been changed from \code{0L} to \code{NA_integer_}.
      (\PR{14754})

      \item The \code{exportMethods} directive in a \file{NAMESPACE}
      file now exports S4 generics as necessary, as the extensions
      manual said it does.  The manual has also been updated to be a
      little more informative on this point.

      It is now required that there is an S4 generic (imported or
      created in the package) when methods are to be exported.

      \item Reference methods cannot safely use non-exported entries
      in the namespace.  We now do not do so, and warn in the documentation.

      \item The namespace import code was warning when identical
      S4 generic functions were imported more than once, but should
      not (reported by Brian Ripley, then Martin Morgan).

      \item \code{merge()} is no longer allowed (in some ways) to create
      a data frame with duplicate column names (which confused
      \PR{14786}).

      \item Fixes for rendering raster images on X11 and Windows devices
      when the x-axis or y-axis scale is reversed.

      \item \code{getAnywhere()} found S3 methods as seen from the
      \pkg{utils} namespace and not from the environment from which it
      was called.

      \item \code{selectMethod(f, sig)} would not return inherited group
      methods when caching was off (as it is by default).

      \item \code{dev.copy2pdf(out.type = "cairo")} gave an error.
      (\PR{14827})

      \item Virtual classes (e.g., class unions) had a \code{NULL}
      prototype even if that was not a legal subclass.  See
      \code{?setClassUnion}.

      \item The C prototypes for \code{zdotc} and \code{zdotu} in
      \file{R_ext/BLAS.h} have been changed to the more modern style
      rather than that used by \command{f2c}.  (Patch by Berwin Turlach.)

      \item \code{isGeneric()} produced an error for primitives that
      can not have methods.

      \item \code{.C()} or \code{.Fortran()} had a lack-of-protection
      error if the registration information resulted in an argument
      being coerced to another type.

      \item \code{boxplot(x=x, at=at)} with non finite elements in \code{x}
      and non integer \code{at} could not generate a warning but failed.

      \item \code{heatmap(x, symm=TRUE, RowSideColors=*)} no longer
      draws the colors in reversed order.

      \item \code{predict(<ar>)} was incorrect in the multivariate case,
      for p >= 2.

      \item \code{print(x, max=m)} is now consistent when \code{x} is a
      \code{"Date"}; also the \dQuote{reached ... max.print ..} messages
      are now consistently using single brackets.

      \item Closed the \samp{<li>} tag in pages generated by \code{
      Rd2HTML()}. (\PR{14841})

      \item Axis tick marks could go out of range when a log scale was
      used.  (\PR{14833})

      \item Signature objects in methods were not allocated as S4
      objects (caused a problem with \code{trace()} reported by Martin Morgan).
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.14.2}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item The internal \code{untar()} (as used by default by
      \command{R CMD INSTALL}) now knows about some \command{pax}
      headers which \command{bsdtar} (e.g., the default \command{tar} for
      Mac OS >= 10.6) can incorrectly include in \command{tar} files,
      and will skip them with a warning.

      \item PCRE has been upgraded to version 8.21: as well as bug fixes
      and greater Perl compatibility, this adds a JIT pattern compiler,
      about which PCRE's news says
      \sQuote{large performance benefits can be had in many situations}.
      This is supported on most but not all \R platforms.

      \item Function \code{compactPDF()} in package \pkg{tools} now
      takes the default for argument \code{gs_quality} from environment
      variable \env{GS_QUALITY}: there is a new value \code{"none"}, the
      ultimate default, which prevents GhostScript being used in
      preference to \command{qpdf} just because environment variable
      \env{R_GSCMD} is set.  If \env{R_GSCMD} is unset or set to
      \code{""}, the function will try to find a suitable GhostScript
      executable.

      \item The included version of zlib has been updated to 1.2.6.

      \item For consistency with the \code{logLik()} method,
      \code{nobs()} for \code{"nls"} files now excludes observations
      with zero weight.  (Reported by Berwin Turlach.)
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} now reports by default on licenses not
      according to the description in \sQuote{Writing R Extensions}.

      \item \command{R CMD check} has a new option \option{--as-cran} to
      turn on most of the customizations that CRAN uses for its incoming
      checks.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item \command{R CMD INSTALL} will now no longer install certain
      file types from \file{inst/doc}: these are almost certainly
      mistakes and for some packages are wasting a lot of space.  These
      are \file{Makefile}, files generated by running LaTeX, and unless
      the package uses a \file{vignettes} directory, PostScript and
      image bitmap files.

      Note that only PDF vignettes have ever been supported: some of
      these files come from DVI/PS output from the Sweave defaults prior
      to \R 2.13.0.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item R configured with \option{--disable-openmp} would mistakenly
      set \code{HAVE_OPENMP} (internal) and \code{SUPPORT_OPENMP} (in
      \file{Rconfig.h}) even though no OpenMP flags were populated.

      \item The \code{getS3method()} implementation had an old
      computation to find an S4 default method.

      \item \code{readLines()} could overflow a buffer if the last line
      of the file was not terminated.  (\PR{14766})

      \item \command{R CMD check} could miss undocumented S4 objects in
      packages which used S4 classes but did not \samp{Depends: methods}
      in their \file{DESCRIPTION} file.

      \item The HTML Help Search page had malformed links.
      (\PR{14769})

      \item A couple of instances of lack of protection of \code{SEXP}s
      have been squashed. (\PR{14772}, \PR{14773})

      \item \code{image(x, useRaster=TRUE)} misbehaved on single-column
      \code{x}. (\PR{14774})

      \item Negative values for \code{options("max.print")} or the \code{max}
      argument to \code{print.default()} caused crashes.  Now the former
      are ignored and the latter trigger an error.  (\PR{14779})

      \item The text of a function body containing more than 4096
      bytes was not properly saved by the parser when entered
      at the console.

      \item Forgetting the \code{#endif} tag in an Rd file could cause
      the parser to go into a loop.  (Reported by Hans-Jorg Bibiko.)

      \item \code{str(*, ....., strict.width="cut")} now also obeys
      \code{list.len = n}.  (Reported by Sören Vogel.)

      \item Printing of arrays did not have enough protection (C level),
      e.g., in the context of \code{capture.output()}.  (Reported by
      Hervé Pagès and Martin Morgan.)

      \item \code{pdf(file = NULL)} would produce a spurious file named
      \file{NA}.  (\PR{14808})

      \item \code{list2env()} did not check the type of its \code{envir}
      argument. (\PR{14807})

      \item \code{svg()} could segfault if called with a non-existent
      file path.  (\PR{14790})

      \item \command{make install} can install to a path containing
      \samp{+} characters. (\PR{14798})

      \item The \code{edit()} function did not respect the
      \code{options("keep.source")} setting. (Reported by Cleridy
      Lennert.)

      \item \code{predict.lm(*, type="terms", terms=*, se.fit=TRUE)} did
      not work.  (\PR{14817})

      \item There is a partial workaround for errors in the TRE
      regular-expressions engine with named classes and repeat counts of
      at least 2 in a MBCS locale (\PR{14408}): these are avoided when
      TRE is in 8-bit mode (e.g., for \code{useBytes = TRUE} and when all
      the data are ASCII).

      \item The C function \code{R_ReplDLLdo1()} did not call top-level
      handlers.

      \item The Quartz device was unable to detect window sessions on
      Mac OS X 10.7 (Lion) and higher and thus it was not used as the
      default device on the console.  Since Lion any application can use
      window sessions, so Quartz will now be the default device if the
      user's window session is active and \R is not run via
      \command{ssh} which is at least close to the behavior in prior OS
      X versions.

      \item \code{mclapply()} would fail in code assembling the translated
      error message if some (but not all) cores encountered an error.

      \item \code{format.POSIXlt(x)} raised an arithmetic exception when
      \code{x} was an invalid object of class \code{"POSIXlt"} and parts
      were empty.

      \item \code{installed.packages()} has some more protection against
      package installs going on in parallel.

      \item \code{.Primitive()} could be mis-used to call
      \code{.Internal()} entry points.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.14.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{parallel::detectCores()} is now able to find the
      number of physical cores (rather than CPUs) on Sparc Solaris.

      It can also do so on most versions of Windows; however the default
      remains \code{detectCores(logical = TRUE)} on that platform.

      \item Reference classes now keep a record of which fields are
      locked.  \code{$lock()} with no arguments returns the names % $
      of the locked fields.

      \item \code{HoltWinters()} reports a warning rather than an error
      for some optimization failures (where the answer might be a
      reasonable one).

      \item \code{tools::dependsOnPkg()} now accepts the shorthand
      \code{dependencies = "all"}.

      \item \code{parallel::clusterExport()} now allows specification of
      an environment from which to export.

      \item The \code{quartz()} device now does tilde expansion on its
      \code{file} argument.

      \item \code{tempfile()} on a Unix-alike now takes the process ID
      into account.  This is needed with \CRANpkg{multicore} (and as part of
      \pkg{parallel}) because the parent and all the children share a
      session temporary directory, and they can share the C random
      number stream used to produce the unique part.  Further, two
      children can call \code{tempfile()} simultaneously.

      \item Option \code{print} in Sweave's \code{RweaveLatex()} driver
      now emulates auto-printing rather than printing (which can differ
      for an S4 object by calling \code{show()} rather than
      \code{print()}).

      \item \code{filled.contour()} now accepts infinite values:
      previously it might have generated invalid graphics files
      (e.g., containing NaN values).
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item On 64-bit Linux systems, \command{configure} now only sets
      \samp{LIBnn} to \code{lib64} if \file{/usr/lib64} exists.  This
      may obviate setting \samp{LIBnn} explicitly on Debian-derived
      systems.

      It is still necessary to set \samp{LIBnn = lib} (or
      \samp{lib32}) for 32-bit builds of \R on a 64-bit OS on those Linux
      distributions capable for supporting that concept.

      \item \command{configure} looks for \file{inconsolata.sty}, and if
      not found adjusts the default \env{R_RD4PDF} to not use it (with a
      warning, since it is needed for high-quality rendering of manuals).
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item \command{R CMD INSTALL} will now do a test load for all
      sub-architectures for which code was compiled (rather than just
      the primary sub-architecture).
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item When checking examples under more than one sub-architecture,
      \command{R CMD check} now uses a separate directory
      \file{examples_arch} for each sub-architecture, and leaves the
      output in file \file{pkgname-Ex_arch.Rout}.  Some packages
      expect their examples to be run in a clean directory \dots{}.
     }
   }

   \subsection{BUG FIXES}{
    \itemize{
      \item \code{stack()} now gives an error if no vector column is
      selected, rather than returning a 1-column data frame (contrary to
      its documentation).

      \item \code{summary.mlm()} did not handle objects where the
      formula had been specified by an expression.  (Reported by
      Helios de Rosario Martinez).

      \item \code{tools::deparseLatex(dropBraces=TRUE)} could drop
      text as well as braces.

      \item \code{colormodel = "grey"} (new in \R 2.14.0)
      did not always work in \code{postscript()} and \code{pdf()}.

      \item \code{file.append()} could return \code{TRUE} for failures.
      (\PR{14727})

      \item \code{gzcon()} connections are no longer subject to garbage
      collection: it was possible for this to happen when unintended
      (e.g., when calling \code{load()}).

      \item \code{nobs()} does not count zero-weight observations for
      \code{glm()} fits, for consistency with \code{lm()}.  This affects
      the \code{BIC()} values reported for such \code{glm()} fits.
      (Spotted by Bill Dunlap.)

      \item \code{options(warn = 0)} failed to end a (C-level) context
      with more than 50 accumulated warnings.  (Spotted by Jeffrey
      Horner.)

      \item The internal \code{plot.default()} code did not do sanity
      checks on a \code{cex} argument, so invalid input could cause
      problems.  (Reported by Ben Bolker.)

      \item \code{anyDuplicated(<array>, MARGIN=0)} no longer fails.
      (Reported by Hervé Pagès.)

      \item \code{read.dcf()} removes trailing blanks: unfortunately
      on some platforms this included \code{\\xa0} (non-breaking space)
      which is the trailing byte of a UTF-8 character.  It now only
      considers ASCII space and tab to be \sQuote{blank}.

      \item There was a sign error in part of the calculations for the
      variance returned by \code{KalmanSmooth()}.  (\PR{14738})

      \item \code{pbinom(10, 1e6, 0.01, log.p = TRUE)} was \code{NaN}
      thanks to the buggy fix to \PR{14320} in \R 2.11.0.  (\PR{14739})

      \item \code{RweaveLatex()} now emulates auto-printing rather than
      printing, by calling \code{methods::show()} when auto-printing
      would.

      \item \code{duplicated()} ignored \code{fromLast} for a
      one-column data frame.  (\PR{14742})

      \item \code{source()} and related functions did not put the correct
      timestamp on the source references; \code{srcfilecopy()} has gained
      a new argument \code{timestamp} to support this fix. (\PR{14750})

      \item \code{srcfilecopy()} has gained a new argument \code{isFile}
      and now records the working directory, to allow debuggers to find
      the original source file.  (\PR{14826})

      \item LaTeX conversion of Rd files did not correctly handle
      preformatted backslashes.  (\PR{14751})

      \item HTML conversion of Rd files did not handle markup within
      tabular cells properly.  (\PR{14708})

      \item \code{source()} on an empty file with \code{keep.source =
	TRUE} tried to read from \code{stdin()}, in \R 2.14.0 only.
      (\PR{14753})

      \item The code to check Rd files in packages would abort if
      duplicate description sections were present.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.14.0}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item All packages must have a namespace, and one is created on
      installation if not supplied in the sources.  This means that any
      package without a namespace must be re-installed under this
      version of \R (but previously-installed data-only packages without
      \R code can still be used).

      \item The \code{yLineBias} of the \code{X11()} and
      \code{windows()} families of devices has been changed from 0.1 to
      0.2: this changes slightly the vertical positioning of text in the
      margins (including axis annotations).  This is mainly for
      consistency with other devices such as \code{quartz()} and
      \code{pdf()}.  (Wish of \PR{14538}.)

      There is a new graphics parameter \code{"ylbias"} which
      allows the y-line bias of the graphics device to be tweaked,
      including to reproduce output from earlier versions of \R.

      \item Labeling of the p-values in various anova tables has been
      rationalized to be either \code{"Pr(>F)"} or \code{"Pr(>Chi)"}
      (i.e., the \code{"Pr(F)"}, \code{"Pr(Chi)"} and \code{"P(>|Chi|)"}
      variants have been eliminated).  Code which extracts the p value
      \emph{via} indexing by name may need adjustment.

      \item \code{::} can now be used for datasets made available for
      lazy-loading in packages with namespaces (which makes it consistent
      with its use for data-only packages without namespaces in earlier
      versions of \R).

      \item There is a new package \pkg{parallel}.

      It incorporates (slightly revised) copies of packages
      \CRANpkg{multicore} and \CRANpkg{snow} (excluding MPI, PVM and NWS
      clusters).  Code written to use the higher-level API functions in
      those packages should work unchanged (apart from changing any
      references to their namespaces to a reference to \pkg{parallel},
      and links explicitly to \CRANpkg{multicore} or \CRANpkg{snow} on help
      pages).

      It also contains support for multiple RNG streams following
      L'Ecuyer \emph{et al} (2002), with support for both
      \code{mclapply} and \CRANpkg{snow} clusters.  This replaces functions
      like \code{clusterSetupRNG()} from \CRANpkg{snow} (which are not in
      \pkg{parallel}).

      The version released for \R 2.14.0 contains base functionality:
      higher-level convenience functions are planned (and some are
      already available in the \sQuote{R-devel} version of \R).

      \item Building PDF manuals (for \R itself or packages,
      e.g.\sspace{}\emph{via} \command{R CMD check}) by default requires the
      LaTeX package \samp{inconsolata}: see the section on
      \sQuote{Making the manuals} in the \sQuote{R Installation and
	Administration Manual}.

      \item \code{axTicks(*, log=TRUE)} has changed in some cases to
      satisfy the documented behavior and be consistent.
    }
  }

  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{txtProgressBar()} can write to an open connection
      instead of the console.

      \item Non-portable package names ending in \file{.} are no longer
      allowed.  Nor are single-character package names (\pkg{R} was
      already disallowed).

      \item \code{regexpr()} and \code{gregexpr()} with \code{perl =
	TRUE} allows Python-style named captures.  (Wish and
      contribution of \PR{14518}.)

      \item The placement of \sQuote{plotmath} text in the margins of
      plots done by base graphics now makes the same vertical adjustment
      as ordinary text, so using ordinary and plotmath text on the same
      margin line will seem better aligned (but not exactly aligned,
      since ordinary text has descenders below the baseline and plotmath
      places them on the baseline).  (Related to \PR{14537}.)

      \item \code{sunflowerplot()} now has a formula interface.
      (Wish of \PR{14541}.)

      \item \code{iconv()} has a new argument \code{toRaw} to handle
      encodings such as \code{UTF-16} with embedded nuls (as was
      possible before the \code{CHARSXP} cache was introduced).

      It will also accept as input the type of list generated with
      \code{toRaw = TRUE}.

      \item Garbage-collecting an unused input text connection no longer
      gives a warning (since it \sQuote{connects} to nothing outside
      \R).

      \item \code{read.table()} and \code{scan()} have gained a
      \code{text} argument, to allow reading data from a (possibly
      literal) character string.

      \item \code{optim(*, method = .)} now allows \code{method = "Brent"}
      as an interface to \code{optimize()}, for use in cases such as
      \code{mle()} where \code{optim()} is used internally.

      \item \code{mosaicplot()} gains a \code{border} argument.
      (Wish of \PR{14550}.)

      \item \code{smooth.spline()} gains a \code{tol} argument which
      controls how different \code{x} values need to be to be treated as
      distinct.  The default has been changed to be more reliable for
      inputs whose range is small compared to their maximum absolute
      value.  (Wish of \PR{14452}.)

      \item \code{gl()} runs faster by avoiding calling \code{factor()}.

      \item The \code{print()} method for \code{object.size()} accepts
      \samp{B} as well as \samp{b} as an abbreviation for \sQuote{bytes}.

      \item \code{unlink()} gains a \code{force} argument to work like
      \command{rm -f} and if possible override restrictive permissions.

      \item \code{pbirthday()} and \code{qbirthday()} now use exact
      calculations for \code{coincident = 2}.

      \item \code{unzip()} and \code{unz()} connections have been
      updated with support for more recent Zip64 features (including
      large file sizes and \command{bzip2} compression, but not UTF-8
      file names).

      \code{unzip()} has a new option to restore file times from those
      recorded (in an unknown timezone) in the zip file.

      \item \code{update.packages()} now accepts a character vector of
      package names for the \code{oldPkgs} argument.  (Suggestion of
      Tal Galili.)

      \item The special reference class fields \code{.self} and
      \code{.refClassDef} are now read-only to prevent corrupting
      the object.

      \item \code{decompose()} now returns the original series as part
      of its value, so it can be used (rather than reconstructed) when
      plotting.  (Suggestion of Rob Hyndman.)

      \item Rao's efficient score test has been implemented for
      \code{glm} objects.  Specifically, the \code{add1}, \code{drop1},
      and \code{anova} methods now allow \code{test = "Rao"}.

      \item If a saved workspace (e.g., \file{.RData}) contains objects
      that cannot be loaded, \R will now start with an warning message
      and an empty workspace, rather than failing to start.

      \item \code{strptime()} now accepts times such as \samp{24:00} for
      midnight at the end of the day, for although these are disallowed by
      POSIX 1003.1-2008, ISO 8601:2004 allows them.

      \item Assignment of \code{names()} to S4 objects now checks for
      a corresponding \code{"names"} slot, and generates a warning or
      an error if that slot is not defined.  See the section on slots
      in \code{?Classes}.

      \item The default methods for \code{is.finite()}, \code{is.infinite()}
      and \code{is.nan()} now signal an error if their argument is not
      an atomic vector.

      \item The formula method for \code{plot()} no longer places
      package \pkg{stats} on the search path (it loads the namespace
      instead).

      \item There now is a genuine \code{"function"} method for
      \code{plot()} rather than the generic dispatching internally to
      \code{graphics::plot.function()}.  It is now exported, so can be
      called directly as \code{plot.function()}.

      \item The one-sided \code{ks.test()} allows \code{exact = TRUE} to
      be specified in the presence of ties (but the approximate
      calculation remains the default: the \sQuote{exact} computation
      makes assumptions known to be invalid in the presence of ties).

      \item The behaviour of \code{curve(add = FALSE)} has changed: it
      now no longer takes the default x limits from the previous plot
      (if any): rather they default to \code{c(0, 1)} just as the
      \code{"function"} method for \code{plot()}.  To get the previous
      behaviour use \code{curve(add = NA)}, which also takes the default for
      log-scaling of the x-axis from the previous plot.

      \item Both \code{curve()} and the \code{plot()} method for
      functions have a new argument \code{xname} to facilitate plots
      such as \code{sin(t)} \emph{vs} \code{t}.

      \item The \code{local} argument to \code{source()} can specify an
      environment as well as \code{TRUE} (\code{parent.env()}) and
      \code{FALSE} (\code{.GlobalEnv}).  It gives better error messages
      for other values, such as \code{NA}.

      \item \code{vcov()} gains methods for classes \code{"summary.lm"} and
      \code{"summary.glm"}.

      \item The \code{plot()} method for class \code{"profile.nls"}
      gains \code{ylab} and \code{lty} arguments, and passes
      \code{\dots} on to \code{plot.default}.

      \item Character-string arguments such as the \code{mode} argument
      of \code{vector()}, \code{as.vector()} and \code{is.vector()} and
      the \code{description} argument of \code{file()} are required to
      be of length exactly one, rather than any further elements being
      silently discarded.  This helps catch incorrect usage in
      programming.

      \item The \code{length} argument of \code{vector()} and its
      wrappers such as \code{numeric()} is required to be of length
      exactly one (other values are now an error rather than giving a
      warning as previously).

      \item \code{vector(len)} and \code{length(x) <- len} no longer
      accept \code{TRUE}/\code{FALSE} for \code{len} (not that they
      were ever documented to, but there was special-casing in the C
      code).

      \item There is a new function \code{Sys.setFileTime()} to set the
      time of a file (including a directory).  See its help for exactly
      which times it sets on various OSes.

      \item The file times reported by \code{file.info()} are reported
      to sub-second resolution on systems which support it.  (Currently
      the POSIX 2008 and FreeBSD/Darwin/NetBSD methods are detected.)

      \item New function \code{getCall(m)} as an abstraction for
      \code{m$call}, enabling \code{update()}'s default method to apply % $
      more universally.  (NB: this can be masked by existing functions
      in packages.)

      \item \code{Sys.info()} gains a \code{euser} component to report
      the \sQuote{effective} user on OSes which have that concept.

      \item The result returned by \code{try()} now contains the
      original error condition object as the \code{"condition"}
      attribute.

      \item All packages with \R code are lazy-loaded irrespective of
      the \samp{LazyLoad} field in the \file{DESCRIPTION} file.  A
      warning is given if the \samp{LazyLoad} field is overridden.

      \item \code{Rd} markup has a new \samp{\figure} tag so that
      figures can be included in help pages when converted to HTML or
      LaTeX.  There are examples on the help pages for \code{par()} and
      \code{points()}.

      \item The built-in httpd server now allows access to files
      in the session temporary directory \code{tempdir()},
      addressed as the \file{/session} directory on the httpd
      server.

      \item Development versions of \R are no longer referred to by the
      number under which they might be released, e.g., in the startup
      banner, \command{R --version} and \code{sessionUtils()}.  The
      correct way to refer to a development version of R is
      \sQuote{R-devel}, preferably with the date and SVN version number.\cr
      E.g., \samp{R-devel (2011-07-04 r56266)}

      \item There is a new function \code{texi2pdf()} in package
      \pkg{tools}, currently a convenience wrapper for
      \code{texi2dvi(pdf = TRUE)}.

      \item There are two new options for typesetting PDF manuals from
      Rd files.  These are \samp{beramono} and \samp{inconsolata}, and
      used the named font for monospaced output. They are intended to
      be used in combination with \samp{times}, and
      \samp{times,inconsolata,hyper} is now the default for the
      reference manual and package manuals.  If you do not have that
      font installed, you can set \env{R_RD4PF} to one of the other
      options: see the \sQuote{R Installation and Administration Manual}.

      \item Automatic printing for reference classes is now done by
      the \code{$show()} method.  A method is defined for class % $
      \samp{envRefClass} and may be overridden for user classes (see
      the \code{?ReferenceClasses} example).  S4 \code{show()} methods
      should no longer be needed for reference classes.

      \item \code{tools::Rdiff} (by default) and \code{R CMD Rdiff}
      now ignore differences in pointer values when comparing printed
      environments, compiled byte code, etc.

      \item The \code{"source"} attribute on functions created with
      \code{keep.source=TRUE} has been replaced with a \code{"srcref"}
      attribute.  The \code{"srcref"} attribute references an in-memory
      copy of the source file using the \code{"srcfilecopy"} class or
      the new \code{"srcfilealias"} class.

      \strong{NB:} This means that functions sourced with
      \code{keep.source = TRUE} and saved (e.g., by \code{save()} or
      \code{readRDS()}) in earlier versions of \R will no longer show
      the original sources (including comments).

      \item New items \samp{User Manuals} and
      \href{http://developer.r-project.org/TechDocs}{Technical Papers}
      have been added to the HTML help main page.  These link to
      vignettes in the base and recommended packages and to a
      collection of papers about R issues, respectively.

      \item Documentation and messages have been standardized to
      use \dQuote{namespace} rather than \dQuote{name space}.

      \item \code{setGeneric()} now looks in the default packages for
      a non-generic version of a function if called from a package with a
      namespace.  (It always did for packages without a namespace.)

      \item Setting the environment variable
      \env{_R_WARN_ON_LOCKED_BINDINGS_} will give a warning if an
      attempt is made to change a locked binding.

      \item \code{\\SweaveInput} is now supported when generating
      concordances in \code{Sweave()}.

      \item \code{findLineNum()} and \code{setBreakpoint()} now allow
      the environment to be specified indirectly; the latter gains
      a \code{clear} argument to allow it to call \code{untrace()}.

      \item The body of a closure can be one of further types of \R
      objects, including environments and external pointers.

      \item The \code{Rd2HTML()} function in package \pkg{tools} now has
      a \code{stylesheet} argument, allowing pages to be displayed in
      alternate formats.

      \item New function \code{requireNamespace()} analogous to
      \code{require()}, returning a logical value after attempting to
      load a namespace.

      \item There is a new type of RNG, \code{"L'Ecuyer-CMRG"},
      implementing L'Ecuyer (1999)'s \sQuote{combined multiple-recursive
      generator} \samp{MRG32k3a}.  See the comments on \code{?RNG}.

      \item \code{help.search()} and \code{??} can now display
      vignettes and demos as well as help pages.  The new option
      \code{"help.search.types"} controls the types of documentation
      and the order of their display.

      This also applies to HTML searches, which now give results in all
      of help pages, vignettes and demos.

      \item \code{socketConnection()} now has a \code{timeout} argument.
      It is now documented that large values (package \CRANpkg{snow} used a
      year) do not work on some OSes.

      \item The initialization of the random-number generator now uses
      the process ID as well as the current time, just in case two \R
      processes are launched very rapidly on a machine with
      low-resolution wall clock (some have a resolution of a second;
      modern systems have microsecond-level resolution).

      \item New function \code{pskill()} in the \pkg{tools} package to
      send a terminate signal to one or more processes, plus constants
      such as \code{SIGTERM} to provide a portable way to refer to
      signals (since the numeric values are OS-dependent).

      \item New function \code{psnice()} in the \pkg{tools} package to
      return or change the \sQuote{niceness} of a process.  (Refers to
      the \sQuote{priority class} on Windows.)

      \item \code{list.dirs()} gains a \code{recursive} argument.

      \item An \samp{Authors@R} field in a package \file{DESCRIPTION}
      file can now be used to generate \samp{Author} and
      \samp{Maintainer} fields if needed, and to auto-generate package
      citations.

      \item New utility \code{getElement()} for accessing either a list
      component or a slot in an S4 object.

      \item \code{stars()} gains a \code{col.lines} argument, thanks to
      Dustin Sallings. (Wish of \PR{14657}.)

      \item New function \code{regmatches()} for extracting or replacing
      matched or non-matched substrings from match data obtained by
      \code{regexpr()}, \code{gregexpr()} and \code{regexec()}.

      \item \code{help(package = "pkg_name", help_type = "HTML")} now
      gives HTML help on the package rather than text help.  (This gives
      direct access to the HTML version of the package manual shown
      \emph{via} \code{help.start()}'s \sQuote{Packages} menu.)

      \item \code{agrep()} gains a \code{fixed} argument to optionally
      allow approximate regular expression matching, and a \code{costs}
      argument to specify possibly different integer match costs for
      insertions, deletions and substitutions.

      \item \code{read.dcf()} and \code{write.dcf()} gain a
      \code{keep.white} argument to indicate fields where whitespace
      should be kept as is.

      \item \code{available.packages()} now works around servers that
      fail to return an error code when \file{PACKAGES.gz} does not
      exist.  (Patch submitted by Seth Schommer.)

      \item \code{readBin()} can now read more than
      \eqn{2^{31}-1}{2^31 - 1} bytes in a single call (the previously
      documented limitation).

      \item New function \code{regexec()} for finding the positions of
      matches as well as all substrings corresponding to parenthesized
      subexpressions of the given regular expression.

      \item New function \code{adist()} in package \pkg{utils} for
      computing \sQuote{edit} (generalized Levenshtein) distances between
      strings.

      \item Class \code{"raster"} gains an \code{is.na} method to avoid
      confusion from the misuse of the matrix method (such as \PR{14618}).

      \item The \code{identical()} function gains an
      \code{ignore.bytecode} argument to control comparison of
      compiled functions.

      \item \code{pmin} and \code{pmax} now warn if an argument is
      partially recycled (wish of \PR{14638}).

      \item The default for \code{image(useRaster=)} is now taken from
      option \code{"preferRaster"}: for the small print see \code{?image}.

      \item \code{str()} now displays reference class objects and their
      fields, rather than treating them as classical S4 classes.

      \item New function \code{aregexec()} in package \pkg{utils} for
      finding the positions of approximate string matches as well as all
      substrings corresponding to parenthesized subexpressions of the
      given regular expression.

      \item \code{download.file()} has an \code{extra} argument to pass
      additional command-line options to the non-default methods using
      command-line utilities.

      \code{cacheOK = FALSE} is now supported for \code{method = "curl"}.

      \item \code{interaction.plot(*, type = .)} now also allows type
      \code{"o"} or \code{"c"}.

      \item \code{axTicks(*, log=TRUE)} did sometimes give more values
      than the ticks in the corresponding \code{graphics::axis()}.  By
      default, it now makes use of the new (\pkg{graphics}-package
      independent) \code{axisTicks()} which can make use of a new
      utility \code{.axisPars()}.  Further, it now returns a decreasing
      sequence (as for \code{log=FALSE}) when \code{usr} is decreasing.

      \item Using \code{fix()} or \code{edit()} on a \R{} object (except
      perhaps a matrix or data frame) writes its temporary file with
      extension \file{.R} so editors which select their mode based on
      the extension will select a suitable mode.
    }
  }

  \subsection{GRAPHICS DEVICES}{
    \itemize{
      \item The \code{pdf()} device makes use of Flate compression: this
      is controlled by the new logical argument \code{compress}, and is
      enabled by default.

      \item Devices \code{svg()}, \code{cairo_pdf()} and
      \code{cairo_ps()} gain a \code{family} argument.

      On a Unix-alike \code{X11()} gains a \code{family} argument.  This
      is one of the \code{x11.options()} and so can be passed as an
      argument to the \code{bmp()}, \code{jpeg()}, \code{png()} and
      \code{tiff()} devices.

      Analogous changes have been made on Windows, so all built-in \R
      graphics devices now have a \code{family} argument except
      \code{pictex()} (which has no means to change fonts).

      \item The \code{bmp()}, \code{jpeg()}, \code{png()} and \code{tiff()}
      devices now make use of the \code{antialias} argument for
      \code{type = "quartz"}.

      \item There are several new built-in font mappings for
      \code{X11(type = "Xlib")}: see the help on \code{X11Fonts()}.

      \item There is a new type \code{X11(type = "dbcairo")} which
      updates the screen less frequently: see its help page.

      \item The \code{X11()} device now makes use of cursors to
      distinguish its states.  The normal cursor is an arrow (rather
      than a crosshair); the crosshair is used when the locator is in
      use, and a watch cursor is shown when plotting computations are
      being done.  (These are the standard names for X11 cursors: how
      they are actually displayed depends on the window manager.)

      \item New functions \code{dev.hold()} and \code{dev.flush()} for
      use with graphics devices with buffering.  These are used for most
      of the high-level graphics functions such as \code{boxplot()}, so
      that the plot is only displayed when the page is complete.

      Currently implemented for \code{windows(buffered = TRUE)},
      \code{quartz()} and the cairographics-based \code{X11()} types
      with buffering (which are the default on-screen devices).

      \item New function \code{dev.capture()} for capture of bitmap
      snapshots of image-based devices (a superset of the functionality
      provided by \code{grid.cap()} in \code{grid}).

      \item The default \code{colormodel} for \code{pdf()} and
      \code{postscript()} is now called \code{"srgb"} to more accurately
      describe it.  (Instead of \code{"rgb"}, and in the case of
      \code{postscript()} it no longer switches to and from the gray
      colorspace, by default.)

      The \code{colormodel} for \code{postscript()} which does use both
      gray and sRGB colorspaces is now called \code{"srgb+gray"}.

      Plots which are known to use only black/white/transparent can
      advantageously use \code{colormodel = "gray"} (just as before, but
      there is now slightly more advantage in doing so).

      \item \code{postscript()} with values \code{colormodel = "rgb"} and
      \code{colormodel = "rgb-nogray"} give the behaviour prior to \R
      2.13.0 of uncalibrated RGB, which under some circumstances can be
      rendered much faster by a viewer.

      \code{pdf(colormodel = "rgb")} gives the behaviour prior to \R
      2.13.0 of uncalibrated RGB, which under some circumstances can be
      rendered faster by a viewer, and the files will be smaller (by
      about 9KB if compression is not used).

      \item The \code{postscript()} device only includes the definition
      of the sRGB colorspace in the output file for the colormodels
      which use it.

      \item The \code{postscript()} and \code{pdf()} devices now output
      greyscale raster images (and not RGB) when \code{colormodel = "gray"}.

      \item \code{postscript(colormodel = "gray")} now accepts non-grey
      colours and uses their luminance (as \code{pdf()} long has).

      \item \code{colormodel = "grey"} is allowed as an alternative name
      for \code{postscript()} and \code{pdf()}.

      \item \code{pdf()} in the default sRGB colorspace outputs many
      fewer changes of colorspace, which may speed up rendering in some
      viewing applications.

      \item There is a new function \code{dev.capabilities()} to query
      the capabilities of the current device.  The initial set of
      capabilities are support for semi-transparent colours, rendering
      and capturing raster images, the locator and for interactive
      events.

      \item For \code{pdf()}, \code{maxRasters} is increased as needed
      so the argument is no longer used.
    }
  }

  \subsection{SWEAVE & VIGNETTES}{
    \itemize{
      \item Options \code{keep.source = TRUE, figs.only = FALSE}
      are now the default.

      \item The way the type of user-defined options is determined has
      changed.  Previously they were all regarded as logical: now the
      type is determined by the value given at first use.

      \item The allowed values of logical options are now precisely
      those allowed for character inputs to \code{as.logical()}: this
      means that \samp{t} and \samp{f} are no longer allowed (although
      \code{T} and \code{F} still are).

      \item The preferred location for vignette sources is now the
      directory \file{vignettes} and not \file{inst/doc}: \command{R CMD
      build} will now re-build vignettes in directory \file{vignettes}
      and copy the \file{.Rnw} (etc) files and the corresponding PDFs to
      \file{inst/doc}.  Further files to be copied to \file{inst/doc}
      can be specified \emph{via} the file
      \file{vignettes/.install_extras}.

      \item \command{R CMD Sweave} now supports a \option{--driver}
      option to select the Sweave driver: the default is equivalent to
      \option{--driver=RweaveLatex}.

      \item \command{R CMD Sweave} and \command{R CMD Stangle} support
      options \option{--encoding} and \option{--options}.

      \item The \code{Rtangle()} driver allows \code{output = "stdout"}
      or \code{output = "stderr"} to select the output or message
      connection.  This is convenient for scripting using something like
\preformatted{    R CMD Stangle --options='output="stdout"' foo.Rnw > foo2.R}

      \item There is a new option \code{pdf.compress} controlling
      whether PDF figures are generated using Flate compression (they
      are by default).

      \item \command{R CMD Sweave} now has a \option{--pdf} option to
      produce a PDF version of the processed Sweave document.

      \item It is no longer allowed to have two vignettes with the
      same vignette basename (e.g., \file{vig.Rnw} and \file{vig.Snw}).
      (Previously one vignette hid the other in the \code{vignette()}
      function.)
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item Function \code{R_tmpnam2} has been added to the API to allow
      a temporary filename to include a specified extension.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item Package \file{DESCRIPTION} file field \samp{KeepSource}
      forces the package to be installed with \code{keep.source =
	TRUE} (or \code{FALSE}).  (Suggestion of Greg Snow.  Note that
      as all packages are lazy-loaded, this is now only relevant at
      installation.)

      There are corresponding options \option{--with-keep.source} and
      \option{--without-keep.source} for \command{R CMD INSTALL}.

      \item \command{R CMD INSTALL} has a new option
      \option{--byte-compile} to byte-compile the packages during
      installation (since all packages are now lazy-loaded).  This can
      be controlled on a per-package basis by the optional field
      \samp{ByteCompile} in the \file{DESCRIPTION} file.

      \item A package \R code but without a \file{NAMESPACE} file will
      have a default one created at \command{R CMD build} or \command{R
      CMD INSTALL} time, so all packages will be installed with
      namespaces.  A consequence of this is that \code{.First.lib()}
      functions need to be copied to \code{.onLoad()} (usually) or
      \code{.onAttach()}.  For the time being, if there is an
      auto-generated \file{NAMESPACE} file and no \code{.onLoad()} nor
      \code{.onAttach()} function is found but \code{.First.lib()} is,
      it will be run as the attach hook (unless the package is one of a
      list of known exceptions, when it will be run as the load hook).

      \item A warning is given if test-loading a package changes a
      locked binding in a package other than itself.  It is likely that
      this will be disallowed in future releases.  (There are \emph{pro
	tem} some exceptions to the warning.)

      \item A dependency on SVN revision is allowed for \code{R},
      e.g.\sspace{}\code{R (>= r56550)}.  This should be used in conjunction with a
      version number, e.g.\sspace{}\code{R (>= 2.14.0), R (>= r56550)} to
      distinguish between R-patched and R-devel versions with the same
      SVN revision.

      \item \code{installed.packages()} now hashes the names of its
      cache files to avoid very rare problems with excessively long path
      names.  (\PR{14669})

      \item A top-level \file{COPYING} file in a package is no longer
      installed (file names \file{LICENSE} or \file{LICENCE} having long
      been preferred).
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} now gives an error if the \R code in a
      vignette fails to run, unless this is caused by a missing package.

      \item \command{R CMD check} now unpacks tarballs in the same way
	as \command{R CMD INSTALL}, including making use of the
	environment variable \env{R_INSTALL_TAR} to override the default
	behaviour.

      \item \command{R CMD check} performs additional code analysis of
      package startup functions, and notifies about incorrect argument
      lists and (incorrect) calls to functions which modify the search
      path or inappropriately generate messages.

      \item \command{R CMD check} now also checks compiled code for
      symbols corresponding to functions which might terminate \R or
      write to \file{stdout}/\file{stderr} instead of the console.

      \item \command{R CMD check} now uses a \code{pdf()} device when
      checking examples (rather than \code{postscript()}).

      \item \command{R CMD check} now checks line-endings of makefiles
      and C/C++/Fortran sources in subdirectories of \file{src} as well
      as in \file{src} itself.

      \item \command{R CMD check} now reports as a NOTE what look like
      methods documented with their full names even if there is a
      namespace and they are exported.  In almost all cases they are
      intended to be used only as methods and should use the
      \samp{\\method} markup.  In the other rare cases the recommended
      form is to use a function such as \code{coefHclust} which would
      not get confused with a method, document that and register it in
      the \file{NAMESPACE} file by \code{s3method(coef, hclust,
      coefHclust)}.

      \item The default for the environment variable
      \env{_R_CHECK_COMPACT_DATA2_} is now true: thus if using the newer
      forms of compression introduced in \R 2.10.0 would be beneficial
      is now checked (by default).

      \item Reference output for a vignette can be supplied when
      checking a package by \command{R CMD check}: see \sQuote{Writing R
	Extensions}.

      \item \command{R CMD Rd2dvi} allows the use of LaTeX package
      \samp{inputenx} rather than \samp{inputenc}: the value of the
      environment variable \env{RD2DVI_INPUTENC} is used.  (LaTeX package
      \samp{inputenx} is an optional install which provides greater
      coverage of the UTF-8 encoding.)

      \item \command{Rscript} on a Unix-alike now accepts file names
      containing spaces (provided these are escaped or quoted in the
      shell).

      \item \command{R CMD build} on a Unix-alike (only) now tries to
      preserve dates on files it copies from its input directory.  (This
      was the undocumented behaviour prior to \R 2.13.0.)
     }
   }

  \subsection{DEPRECATED AND DEFUNCT}{
   \itemize{
      \item \code{require()} no longer has a \code{save} argument.

      \item The \code{gamma} argument to \code{hsv()},
      \code{rainbow()}, and \code{rgb2hsv()} has been removed.

      \item The \option{--no-docs} option for
      \command{R CMD build --binary} is defunct: use
      \option{--install-args} instead.

      \item The option \option{--unsafe} to \command{R CMD INSTALL} is
      defunct: use the identical option \option{--no-lock} instead.

      \item The entry point \code{pythag} formerly in \file{Rmath.h} is
      defunct: use instead the C99 function \code{hypot}.

      \item \command{R CMD build --binary} is formally defunct:
      \command{R CMD INSTALL --build} has long been the preferred
      alternative.

      \item \command{zip.file.extract()} is now defunct: use
      \code{unzip()} or \code{unz()} instead.

      \item \command{R CMD Rd2dvi} without the \option{--pdf} option is
      now deprecated: only PDF output will be supported in future
      releases (since this allows the use of fonts only supported for
      PDF), and only \command{R CMD Rd2pdf} will be available.

      \item Options such as \option{--max-nsize} and the function
      \code{mem.limits()} are now deprecated: these limits are nowadays
      almost never used, and are reported by \code{gc()} when they are
      in use.

      \item Forms like \code{binomial(link = "link")} for GLM families
      deprecated since \R 2.4.0 are now defunct.

      \item The \code{declarativeOnly} argument to
      \code{loadNamespace()} (not relevant since \R 2.13.0) has been
      removed.

      \item Use of \code{library.dynam()} without specifying all the
      first three arguments is deprecated.  (It is often called from a
      namespace, and the defaults are only appropriate to a package.)

      Use of \code{chname} in \code{library.dynam()} with the extension
      \file{.so} or \code{.dll} (which is clearly not allowed according
      to the help page) is deprecated.  This also applies to
      \code{library.dynam.unload()} and \code{useDynLib} directives in
      \file{NAMESPACE} files.

      \item It is deprecated to use \code{mean(x)} and \code{sd(x)}
      directly on data frames (or also matrices, for \code{sd})
      \code{x}, instead of simply using \code{sapply}.

      In the same spirit, \code{median(x)} now gives an error for a data
      frame \code{x} (it often gave nonsensical results).

      \item The \code{keep.source} argument to \code{library()} and
      \code{require()} is deprecated: it was only used for packages
      installed without lazy-loading, and now all packages are
      lazy-loaded.

      \item Using a false value for the \file{DESCRIPTION} field
      \samp{LazyLoad} is deprecated.
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item The base and recommended packages are now byte-compiled
      (equivalent to \command{make bytecode} in \R 2.13.x).

      \item Configure option \option{--with-system-zlib} now only makes
      use of the basic interface of \code{zlib} and not the
      C function \samp{gzseek} which has shown erroneous behaviour in
      \code{zlib} 1.2.4 and 1.2.5.

      \item The \code{zlib} in the R sources is now version 1.2.5.
      (This is safe even on 32-bit Linux systems because only the basic
      interface is now used.)

      \item The \file{.afm} files in package \pkg{grDevices} are now
      installed as compressed files (as long done on Windows), saving ca
      2MB on the installed size.

      \item The non-screen cairo-based devices are no longer in the X11
      module and so can be installed without X11.  (We have never seen a
      Unix-alike system with cairographics installed but not X11, but a
      user might select \option{--without-x}.)

      \item Configure will try to use \option{-fobjc-exceptions} for the
      Objective-C compiler (if present) to ensure that even compilers
      that do not enable exceptions by default (such as vanilla gcc) can
      be used.  (Objective-C is currently only used on Mac OS X.)

      \item The system call \code{times} is required.

      \item The C99 functions \code{acosh}, \code{asinh}, \code{atanh},
      \code{snprintf} and \code{vsnprintf} are now required.

      \item There is no longer support for making DVI manuals \emph{via}
      \command{make dvi}, \command{make install-dvi} and similar.  Only
      PDF manuals are supported (to allow the use of fonts which are
      only available for PDF.)

      \item The \file{configure} arguments used during configuration of
      \R are included as a comment in \file{Makeconf} for informative
      purposes on Unix-alikes in a form suitable for shell execution.
      Note that those are merely command-line arguments, they do not
      include environment variables (one more reason to use configure
      variables instead) or site configuration settings.

      \item Framework installation now supports \code{DESTDIR}
      (Mac OS X only).

      \item Java detection (\code{R CMD javareconf}) works around bogus
      \code{java.library.path} property in recent Oracle Java binaries.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item The locale category \samp{LC_MONETARY} was only being set on
      startup on Windows: that is now done on Unix-alikes where
      supported.

      \item Reference class utilities will detect an attempt to modify
      methods or fields in a locked class definition (e.g., in a
      namespace) and generate an error.

      \item The formula methods for \code{lines()}, \code{points()} and
      \code{text()} now work even if package \pkg{stats} is not on the
      search path.

      \item In principle, S4 classes from different packages could
      have the same name.  This has not previously worked.  Changes
      have now been installed that should allow such classes and
      permit methods to use them.  New functions \code{className()}
      and \code{multipleClasses()} are related tools for programming.

      \item Work around an issue in Linux (a system \code{select} call
      resetting \code{tv}) which prevented internet operations from
      timing out properly.

      \item Several stack trampling and overflow issues have been fixed
      in TRE, triggered by \code{agrep} and friends with long patterns.
      (\PR{14627})

      \item (\dQuote{design infelicity}) Field assignments in reference
      classes are now consistent with slots in S4 classes:  the
      assigned value must come from the declared class (if any) for the field
      or from a subclass.

      \item The methods objects constructed for \code{"coerce"} and
      \code{"coerce<-"} were lacking some essential information in the
      \code{generic}, \code{defined} and \code{target} slots;
      \code{as()} did not handle duplicate class definitions correctly.

      \item The parser no longer accepts the digit \code{8} in an octal
      character code in a string, nor does it accept unterminated
      strings in a file.  (Reported by Bill Dunlap.)

      \item The \code{print()} method for class \code{"summary.aov"} did
      not pass on argument \code{digits} when \code{summary()} was
      called on a single object, and hence used more digits than
      documented.

      \item The \code{X11()} device's cairo back-end produced incorrect
      capture snapshot images on big-endian machines.

      \item \code{loglin()} gave a spurious error when argument
      \code{margin} consisted of a single element of length one.
      (\PR{14690})

      \item \code{loess()} is better protected against misuse,
      e.g.\sspace{}zero-length \code{span}.  (\PR{14691})

      \item \code{HoltWinters()} checks that the optimization
      succeeded. (\PR{14694})

      \item The (undocumented) inclusion of superclass objects in
      default initializing of reference classes overwrote explicit
      field arguments. The bug is fixed, the feature documented and a
      test added.

      \item \code{round(x, -Inf)} now does something sensible (return
      zero rather than \code{NA}).

      \item \code{signif(x, -Inf)} now behaves as documented
      (\code{signif(x, 1)}) rather than giving zero.

      \item The \code{"table"} method for \code{Axis()} hardcoded
      \code{side = 1}, hence calls to \code{plot(<vector>, <table>)}
      labelled the wrong axis. (\PR{14699})

      \item Creating a connection might fail under \code{gctorture(TRUE)}.

      \item \code{stack()} and \code{unstack()} converted character
      columns to factors.

      \code{unstack()} sometimes produced incorrect results (a list or a
      vector) if the factor on which to un-split had only one level.

      \item On some systems \code{help(".C", help_type = "pdf")} and
      similar generated file names that TeX was unable to handle.

      \item Non-blocking listening socket connections continued to
      report \code{isIncomplete()} as true even when the peer had closed
      down and all available input had been read.

      \item The revised HTML search system now generates better
      hyperlinks to help topics found: previously it gave problems with
      help pages with names containing e.g.\sspace{}spaces and slashes.

      \item A late change in \R 2.13.2 broke \samp{\Sexpr} expressions
      in Rd files.

      \item The creation of ticks on log axes (including by
      \code{axTicks()}) sometimes incorrectly omitted a tick at one end
      of the range by rounding error in a platform-dependent way.  This
      could be seen in the examples for \code{axTicks()}, where with
      axis limits \code{c(0.2, 88)} the tick for \code{0.2} was
      sometimes omitted.

      \item \code{qgamma()} for small \code{shape} underflows to
      \code{0} rather than sometimes giving \code{NaN}.
      (\PR{8528}, \PR{14710})

      \item \code{mapply()} now gives an explicit error message (rather
      than an obscure one) if inputs of zero and positive length are
      mixed.

      \item Setting a Hershey font family followed by string height
      query would crash R.

      \item \code{R CMD javareconf -e} would fail for some shells due to
      a shift error. Also the resulting paths will no longer contain
      \code{$(JAVA_HOME)} as that can result in an unintended
      substitution based on \file{Makeconf} instead of the shell
      setting.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.13.2}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{mem.limits()} now reports values larger than the
      maximum integer (previously documented to be reported as
      \code{NA}), and allows larger values to be set, including
      \code{Inf} to remove the limit.

      \item The \code{print()} methods for classes \code{"Date"},
      \code{"POSIXct"} and \code{"POSIXlt"} respect the option
      \code{"max.print"} and so are much faster for very long datetime
      vectors.  (Suggestion of Yohan Chalabi.)

      \item \code{untar2()} now works around errors generated with
      \code{tar} files that use more than the standard 6 digits for the
      checksum. (\PR{14654})

      \item \code{install.packages()} with \code{Ncpus > 1} guards
      against simultaneous installation of indirect dependencies as well
      as direct ones.

      \item Sweave now knows about a few more Windows' encodings
      (including \code{cp1250} and \code{cp1257}) and some
      \code{inputenx} encodings such as \code{koi8-r}.

      \item \code{postscript(colormodel = "rgb-nogray")} no longer sets
      the sRGB colorspace for each colour and so some viewers may render
      its files much faster than the default \code{colormodel ="rgb"}.

      \item The default for \code{pdf(maxRasters=)} has been increased
	from 64 to 1000.

      \item \code{readBin()} now warns if \code{signed = FALSE} is used
      inappropriately (rather than being silently ignored).

      It enforces the documented limit of \eqn{2^{31}-1}{2^31-1} bytes
      in a single call.

      \item PCRE has been updated to version 8.13, a bug-fix release
      with updated Unicode tables (version 6.0.0).  An additional patch
      (r611 from PCRE 8.20-to-be) has been added to fix a collation
      symbol recognition issue.
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item It is possible to build in \file{src/extra/xdr} on more
      platforms.  (Needed since glibc 2.14 hides its RPC implementation.)

      \item \command{configure} will find the Sun TI-RPC implementation
      of xdr (in \file{libtirpc}) provided its header files are in the
      search path: see the \sQuote{R Installation and Administration
	Manual}.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item Using a broad \code{exportPattern} directive in a
      \file{NAMESPACE} file is no longer allowed to export internal
      objects such as \code{.onLoad} and \code{.__S3MethodsTable__.} .

      These are also excluded from imports, along with \code{.First.lib}.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
     \item \code{fisher.test()} had a buglet: If arguments were factors
      with unused levels, levels were dropped and you would get an error
      saying that there should be at least two levels, inconsistently
      with pre-tabulated data.  (Reported by Michael Fay).

      \item \code{package.skeleton()} will no longer dump S4 objects
      supplied directly rather than in a code file.  These cannot be
      restored correctly from the dumped version.

      \item Build-time expressions in help files did not have access
      to functions in the package being built (with \command{R CMD build}).

      \item Because \code{quote()} did not mark its result as being in
      use, modification of the result could in some circumstances
      modify the original call.

      \item Plotting \code{pch = '.'} now guarantees at least a one-pixel
      dot if \code{cex > 0}.

      \item The very-rarely-used command-line option
      \option{--max-vsize} was incorrectly interpreted as a number of
      Vcells and not in bytes as documented.  (Spotted by Christophe
      Rhodes.)

      \item The HTML generated by \code{Rd2HTML()} comes closer to
      being standards compliant.

      \item \code{filter(x, recursive = TRUE)} gave incorrect results on a
      series containing \code{NA}s.  (Spotted by Bill Dunlap.)

      \item Profiling \code{stats::mle()} fits with a \code{fixed}
      parameter was not supported.  (\PR{14646})

      \item \code{retracemem()} was still using positional matching.
      (\PR{14650})

      \item The \code{quantile} method for \code{"ecdf"} objects now
      works and is documented.

      \item \code{xtabs(~ .., ..., sparse=TRUE)} now also works together
      with an \code{exclude = ..} specification.

      \item \code{decompose()} computed an incorrect seasonal component for
      time series with odd frequencies.

      \item The \code{pdf()} device only includes the definition of the
      sRGB colorspace in the output file for the \code{"rgb"} colormodel
      (and not for \code{"gray"} nor \code{"cmyk"}): this saves ca
      9KB in the output file.

      \item \code{.hasSlot()} wrongly gave \code{FALSE} in some cases.

      \item \code{Sweave()} with \code{keep.source=TRUE} could generate
      spurious \code{NA} lines when a chunk reference appeared last in
      a code chunk.

      \item \samp{\Sexpr[results=rd]} in an \file{.Rd} file now first tries
      \code{parse_Rd(fragment=FALSE)} to allow Rd section-level macros
      to be inserted.

      \item The \code{print()} method for class \code{"summary.aov"} did
      not pass on arguments such as \code{signif.stars} when
      \code{summary()} was called on a single object.  (\PR{14684})

      \item In rare cases \code{ks.test()} could return a p-value
      very slightly less than 0 by rounding error.  (\PR{14671})

      \item If \code{trunc()} was called on a \code{"POSIXlt"} vector
      and the result was subsetted, all but the first element was
      converted to \code{NA}.  (\PR{14679})

      \item \code{cbind()} and \code{rbind()} could cause memory
      corruption when used on a combination of raw and logical/integer
      vectors.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.13.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{iconv()} no longer translates \code{NA} strings as
      \code{"NA"}.

      \item \code{persp(box = TRUE)} now warns if the surface extends
      outside the box (since occlusion for the box and axes is computed
      assuming the box is a bounding box). (\PR{202})

      \item \code{RShowDoc()} can now display the licences shipped with
      \R, e.g.\sspace{}\code{RShowDoc("GPL-3")}.

      \item New wrapper function \code{showNonASCIIfile()} in package
      \pkg{tools}.

      \item \code{nobs()} now has a \code{"mle"} method in package
      \pkg{stats4}.

      \item \code{trace()} now deals correctly with S4 reference classes
      and corresponding reference methods (e.g., \code{$trace()})%$
      have been added.

      \item \command{xz} has been updated to 5.0.3 (very minor bugfix
      release).

      \item \code{tools::compactPDF()} gets more compression (usually a
      little, sometimes a lot) by using the compressed object streams of
      PDF 1.5.

      \item \code{cairo_ps(onefile = TRUE)} generates encapsulated EPS
      on platforms with cairo >= 1.6.

      \item Binary reads (e.g., by \code{readChar()} and \code{readBin()})
      are now supported on clipboard connections.  (Wish of \PR{14593}.)

      \item \code{as.POSIXlt.factor()} now passes \code{...} to the
      character method (suggestion of Joshua Ulrich).  [Intended for \R
      2.13.0 but accidentally removed before release.]

      \item \code{vector()} and its wrappers such as \code{integer()}
      and \code{double()} now warn if called with a \code{length}
      argument of more than one element.  This helps track down user
      errors such as calling \code{double(x)} instead of
      \code{as.double(x)}.
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item Building the vignette PDFs in packages \pkg{grid} and
      \pkg{utils} is now part of running \command{make} from an SVN
      checkout on a Unix-alike: a separate \command{make vignettes} step
      is no longer required.

      These vignettes are now made with \code{keep.source = TRUE} and
      hence will be laid out differently.

      \item \command{make install-strip} failed under some configuration
      options.

      \item Packages can customize non-standard installation of compiled
      code via a \code{src/install.libs.R} script. This allows packages that
      have architecture-specific binaries (beyond the package's shared
      objects/DLLs) to be installed in a multi-architecture setting.
    }
  }

  \subsection{SWEAVE & VIGNETTES}{
    \itemize{
      \item \code{Sweave()} and \code{Stangle()} gain an \code{encoding}
      argument to specify the encoding of the vignette sources if the
      latter do not contain a \samp{\\usepackage[]{inputenc}} statement
      specifying a single input encoding.

      \item There is a new Sweave option \code{figs.only = TRUE} to run
      each figure chunk only for each selected graphics device, and not
      first using the default graphics device.   This will become the
      default in \R 2.14.0.

      \item Sweave custom graphics devices can have a custom function
      \code{foo.off()} to shut them down.

      \item Warnings are issued when non-portable filenames are found
      for graphics files (and chunks if \code{split = TRUE}).  Portable
      names are regarded as alphanumeric plus hyphen, underscore, plus
      and hash (periods cause problems with recognizing file
      extensions).

      \item The \code{Rtangle()} driver has a new option
      \code{show.line.nos} which is by default false; if true it
      annotates code chunks with a comment giving the line number of the
      first line in the sources (the behaviour of \R >= 2.12.0).

      \item Package installation tangles the vignette sources: this step
      now converts the vignette sources from the vignette/package
      encoding to the current encoding, and records the encoding (if not
      ASCII) in a comment line at the top of the installed \file{.R}
      file.
    }
  }

  \subsection{LICENCE}{
    \itemize{
      \item No parts of \R are now licensed solely under GPL-2.  The
      licences for packages \CRANpkg{rpart} and \CRANpkg{survival} have been
      changed, which means that the licence terms for \R as distributed
      are GPL-2 | GPL-3.
    }
  }

  \subsection{DEPRECATED AND DEFUNCT}{
   \itemize{
     \item The internal functions \code{.readRDS()} and
      \code{.saveRDS()} are now deprecated in favour of the public
      functions \code{readRDS()} and \code{saveRDS()} introduced in \R
      2.13.0.

      \item Switching off lazy-loading of code \emph{via} the
      \samp{LazyLoad} field of the \file{DESCRIPTION} file is now
      deprecated.  In future all packages will be lazy-loaded.

      \item The off-line \code{help()} types \samp{"postscript"} and
      \samp{"ps"} are deprecated.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD check} on a multi-architecture installation now
      skips the user's \file{.Renviron} file for the
      architecture-specific tests (which do read the
      architecture-specific \file{Renviron.site} files).  This is
      consistent with single-architecture checks, which use
      \option{--no-environ}.

      \item \command{R CMD build} now looks for \file{DESCRIPTION}
      fields \samp{BuildResaveData} and \samp{BuildKeepEmpty} for
      per-package overrides.  See \sQuote{Writing R Extensions}.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{plot.lm(which = 5)} was intended to order factor
      levels in increasing order of mean standardized residual.   It
      ordered the factor labels correctly, but could plot the wrong
      group of residuals against the label.  (\PR{14545})

      \item \code{mosaicplot()} could clip the factor labels, and could
      overlap them with the cells if a non-default value of
      \code{cex.axis} was used.  (Related to \PR{14550}.)

      \item \code{dataframe[[row,col]]} now dispatches on \code{[[}
      methods for the selected column.  (Spotted by Bill Dunlap).

      \item \code{sort.int()} would strip the class of an object, but
      leave its object bit set.  (Reported by Bill Dunlap.)

      \item \code{pbirthday()} and \code{qbirthday()} did not implement
      the algorithm exactly as given in their reference and so were
      unnecessarily inaccurate.

      \code{pbirthday()} now solves the approximate formula analytically
      rather than using \code{uniroot()} on a discontinuous function.

      The description of the problem was inaccurate: the probability is
      a tail probability (\sQuote{2 \emph{or more} people share a birthday})

      \item Complex arithmetic sometimes warned incorrectly about
      producing NAs when there were NaNs in the input.

      \item \code{seek(origin = "current")} incorrectly reported it was
      not implemented for a \code{gzfile()} connection.

      \item \code{c()}, \code{unlist()}, \code{cbind()} and
      \code{rbind()} could silently overflow the maximum vector length
      and cause a segfault.  (\PR{14571})

      \item The \code{fonts} argument to \code{X11(type = "Xlib")} was
      being ignored.

      \item Reading (e.g., with \code{readBin()}) from a raw connection
      was not advancing the pointer, so successive reads would read the
      same value.  (Spotted by Bill Dunlap.)

      \item Parsed text containing embedded newlines was printed
      incorrectly by \code{as.character.srcref()}.  (Reported by Hadley
      Wickham.)

      \item \code{decompose()} used with a series of a non-integer
      number of periods returned a seasonal component shorter than the
      original series.  (Reported by Rob Hyndman.)

      \item \code{fields = list()} failed for \code{setRefClass()}.
      (Reported by Michael Lawrence.)

      \item Reference classes could not redefine an inherited field
      which had class \code{"ANY"}. (Reported by Janko Thyson.)

      \item Methods that override previously loaded versions will now
      be installed and called.  (Reported by Iago Mosqueira.)

      \item \code{addmargins()} called \code{numeric(apos)} rather than
      \code{numeric(length(apos))}.

      \item The HTML help search sometimes produced bad links.
      (\PR{14608})

      \item Command completion will no longer be broken if
      \code{tail.default()} is redefined by the user. (Problem reported
      by Henrik Bengtsson.)

      \item LaTeX rendering of markup in titles of help pages has been
      improved; in particular, \code{\\eqn{}} may be used there.

      \item \code{isClass()} used its own namespace as the default of
      the \code{where} argument inadvertently.

      \item Rd conversion to latex mishandled multi-line titles
      (including cases where there was a blank line in the \samp{\title}
      section).  (It seems this happened only in 2.13.0 patched.)

      \item \code{postscript()} with an sRGB colormodel now uses sRGB
      for raster images (in \R 2.13.[01] it used uncalibrated RGB).

      There is no longer an undocumented 21845-pixel limit on raster images.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.13.0}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item \code{replicate()} (by default) and \code{vapply()} (always)
      now return a higher-dimensional array instead of a matrix in the case
      where the inner function value is an array of dimension >= 2.

      \item Printing and formatting of floating point numbers is now
      using the correct number of digits, where it previously rarely
      differed by a few digits. (See \dQuote{scientific} entry below.)
      This affects \emph{many} \file{*.Rout.save} checks in packages.
    }
  }
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{normalizePath()} has been moved to the \pkg{base}
      package (from \pkg{utils}): this is so it can be used by
      \code{library()} and friends.

      It now does tilde expansion.

      It gains new arguments \code{winslash} (to select the separator on
      Windows) and \code{mustWork} to control the action if a canonical
      path cannot be found.

      \item The previously barely documented limit of 256 bytes on a
      symbol name has been raised to 10,000 bytes (a sanity check).
      Long symbol names can sometimes occur when deparsing expressions
      (for example, in \code{model.frame}).

      \item \code{reformulate()} gains a \code{intercept} argument.

      \item \code{cmdscale(add = FALSE)} now uses the more common
      definition that there is a representation in \code{n-1} or less
      dimensions, and only dimensions corresponding to positive
      eigenvalues are used.  (Avoids confusion such as \PR{14397}.)

      \item Names used by \code{c()}, \code{unlist()}, \code{cbind()}
      and \code{rbind()} are marked with an encoding when this can be
      ascertained.

      \item R colours are now defined to refer to the sRGB color space.

      The PDF, PostScript, and Quartz graphics devices record this fact.
      X11 (and cairo) and Windows just assume that your screen conforms.

      \item \code{system.file()} gains a \code{mustWork} argument
      (suggestion of Bill Dunlap).

      \item \code{new.env(hash = TRUE)} is now the default.

      \item \code{list2env(envir = NULL)} defaults to hashing (with a
      suitably sized environment) for lists of more than 100 elements.

      \item \code{text()} gains a formula method.

      \item \code{IQR()} now has a \code{type} argument which is passed
      to \code{quantile()}.

      \item \code{as.vector()}, \code{as.double()} etc duplicate less
      when they leave the mode unchanged but remove attributes.

      \code{as.vector(mode = "any")} no longer duplicates when it does
      not remove attributes.  This helps memory usage in \code{matrix()}
      and \code{array()}.

      \code{matrix()} duplicates less if \code{data} is an atomic vector
      with attributes such as names (but no class).

      \code{dim(x) <- NULL} duplicates less if \code{x} has neither
      dimensions nor names (since this operation removes names and
      dimnames).

      \item \code{setRepositories()} gains an \code{addURLs} argument.

      \item \code{chisq.test()} now also returns a \code{stdres}
      component, for standardized residuals (which have unit variance,
      unlike the Pearson residuals).

      \item \code{write.table()} and friends gain a \code{fileEncoding}
      argument, to simplify writing files for use on other OSes (e.g., a
      spreadsheet intended for Windows or Mac OS X Excel).

      \item Assignment expressions of the form \code{foo::bar(x) <- y}
      and \code{foo:::bar(x) <- y} now work; the replacement functions
      used are \code{foo::`bar<-`} and \code{foo:::`bar<-`}.

      \item \code{Sys.getenv()} gains a \code{names} argument so
      \code{Sys.getenv(x, names = FALSE)} can replace the common idiom
      of \code{as.vector(Sys.getenv())}.  The default has been changed
      to not name a length-one result.

      \item Lazy loading of environments now preserves attributes and
      locked status. (The locked status of bindings and active bindings
      are still not preserved; this may be addressed in the future).

      \item \code{options("install.lock")} may be set to \code{FALSE}
      so that \code{install.packages()} defaults to \option{--no-lock}
      installs, or (on Windows) to \code{TRUE} so that binary installs
      implement locking.

      \item \code{sort(partial = p)} for large \code{p} now tries
      Shellsort if quicksort is not appropriate and so works for
      non-numeric atomic vectors.

      \item \code{sapply()} gets a new option \code{simplify = "array"}
      which returns a \dQuote{higher rank} array instead of just a matrix
      when \code{FUN()} returns a \code{dim()} length of two or more.

      \code{replicate()} has this option set by default, and
      \code{vapply()} now behaves that way internally.

      \item \code{aperm()} becomes S3 generic and gets a \code{table}
      method which preserves the class.

      \item \code{merge()} and \code{as.hclust()} methods for objects of
      class \code{"dendrogram"} are now provided.

      \item The character method of \code{as.POSIXlt()} now tries to
      find a format that works for all non-\code{NA} inputs, not just
      the first one.

      \item \code{str()} now has a method for class \code{"Date"}
      analogous to that for class \code{"POSIXt"}.

      \item New function \code{file.link()} to create hard links on
      those file systems (POSIX, NTFS but not FAT) that support them.

      \item New \code{Summary()} group method for class \code{"ordered"}
      implements \code{min()}, \code{max()} and \code{range()} for
      ordered factors.

      \item \code{mostattributes<-()} now consults the \code{"dim"}
      attribute and not the \code{dim()} function, making it more useful
      for objects (such as data frames) from classes with methods for
      \code{dim()}.  It also uses \code{attr<-()} in preference to the
      generics \code{name<-()}, \code{dim<-()} and \code{dimnames<-()}.
      (Related to \PR{14469}.)

      \item There is a new option \code{"browserNLdisabled"} to disable
      the use of an empty (e.g., via the \sQuote{Return} key) as a synonym
      for \code{c} in \code{browser()} or \code{n} under \code{debug()}.
      (Wish of \PR{14472}.)

      \item \code{example()} gains optional new arguments
      \code{character.only} and \code{give.lines} enabling programmatic
      exploration.

      \item \code{serialize()} and \code{unserialize()} are no longer
      described as \sQuote{experimental}.  The interface is now regarded
      as stable, although the serialization format may well change in
      future releases.  (\code{serialize()} has a new argument
      \code{version} which would allow the current format to be written
      if that happens.)

      New functions \code{saveRDS()} and \code{readRDS()} are public
      versions of the \sQuote{internal} functions \code{.saveRDS()} and
      \code{.readRDS()} made available for general use.  The dot-name
      versions remain available as several package authors have made use
      of them, despite the documentation.  \code{readRDS()} no longer
      wraps non-file connections in a call to \code{gzcon()}, for
      efficiency (see its documentation).

      \code{saveRDS()} supports \code{compress = "xz"}.

      \item Many functions when called with a not-open connection will
      now ensure that the connection is left not-open in the event of
      error.  These include \code{read.dcf()}, \code{dput()},
      \code{dump()}, \code{load()}, \code{parse()}, \code{readBin()},
      \code{readChar()}, \code{readLines()}, \code{save()},
      \code{writeBin()}, \code{writeChar()}, \code{writeLines()},
      \code{.readRDS()}, \code{.saveRDS()} and \code{tools::parse_Rd()},
      as well as functions calling these.

      \item Public functions \code{find.package()} and \code{path.package()}
      replace the internal dot-name versions.

      \item The default method for \code{terms()} now looks for a
      \code{"terms"} attribute if it does not find a \code{"terms"}
      component, and so works for model frames.

      \item \code{httpd()} handlers receive an additional argument
      containing the full request headers as a raw vector (this can be
      used to parse cookies, multi-part forms etc.). The recommended
      full signature for handlers is therefore \code{function(url,
	query, body, headers, ...)}.

      \item \code{file.edit()} gains a \code{fileEncoding} argument to
      specify the encoding of the file(s).

      \item The format of the HTML package listings has changed.  If
      there is more than one library tree , a table of links to
      libraries is provided at the top and bottom of the page.  Where a
      library contains more than 100 packages, an alphabetic index is
      given at the top of the section for that library.  (As a
      consequence, package names are now sorted case-insensitively
      whatever the locale.)

      \item \code{isSeekable()} now returns \code{FALSE} on connections
      which have non-default \code{encoding}.  Although documented to
      record if \sQuote{in principle} the connection supports seeking,
      it seems safer to report \code{FALSE} when it may not work.

      \item \command{R CMD REMOVE} and \code{remove.packages()} now
      remove file \code{R.css} when removing all remaining packages in a
      library tree.  (Related to the wish of \PR{14475}: note that this
      file is no longer installed.)

      \item \code{unzip()} now has a \code{unzip} argument like
      \code{zip.file.extract()}.  This allows an external
      \command{unzip} program to be used, which can be useful to access
      features supported by Info-ZIP's \command{unzip} version 6 which
      is now becoming more widely available.

      \item There is a simple \code{zip()} function, as wrapper for an
      external \command{zip} command.

      \item \code{bzfile()} connections can now read from concatenated
      \command{bzip2} files (including files written with
      \code{bzfile(open = "a")}) and files created by some other
      compressors (such as the example of \PR{14479}).

      \item The primitive function \code{c()} is now of type BUILTIN.

      \item \code{plot(<dendrogram>, .., nodePar=*)} now obeys an optional
      \code{xpd} specification (allowing clipping to be turned off
      completely).

      \item \code{nls(algorithm="port")} now shares more code with
      \code{nlminb()}, and is more consistent with the other
      \code{nls()} algorithms in its return value.

      \item \command{xz} has been updated to 5.0.1 (very minor bugfix
      release).

      \item \code{image()} has gained a logical \code{useRaster}
      argument allowing it to use a bitmap raster for plotting a
      regular grid instead of polygons. This can be more efficient, but
      may not be supported by all devices. The default is \code{FALSE}.

      \item \code{list.files()}/\code{dir()} gains a new argument
      \code{include.dirs()} to include directories in the listing when
      \code{recursive = TRUE}.

      \item New function \code{list.dirs()} lists all directories,
      (even empty ones).

      \item \code{file.copy()} now (by default) copies
      read/write/execute permissions on files, moderated by the current
      setting of \code{Sys.umask()}.

      \item \code{Sys.umask()} now accepts \code{mode = NA} and returns
      the current \code{umask} value (visibly) without changing it.

      \item There is a \code{!} method for classes \code{"octmode"} and
      \code{"hexmode"}: this allows \code{xor(a, b)} to work if both
      \code{a} and \code{b} are from one of those classes.

      \item \code{as.raster()} no longer fails for vectors or matrices
      containing \code{NA}s.

      \item New hook \code{"before.new.plot"} allows functions to be run
      just before advancing the frame in \code{plot.new}, which is
      potentially useful for custom figure layout implementations.

      \item Package \pkg{tools} has a new function \code{compactPDF()}
      to try to reduce the size of PDF files \emph{via} \command{qpdf}
      or \command{gs}.

      \item \code{tar()} has a new argument \code{extra_flags}.

      \item \code{dotchart()} accepts more general objects \code{x} such
      as 1D tables which can be coerced by \code{as.numeric()} to a
      numeric vector, with a warning since that might not be
      appropriate.

      \item The previously internal function \code{create.post()} is now
      exported from \pkg{utils}, and the documentation for
      \code{bug.report()} and \code{help.request()} now refer to that
      for \code{create.post()}.

      It has a new \code{method = "mailto"} on Unix-alikes similar to
      that on Windows: it invokes a default mailer via \command{open}
      (Mac OS X) or \code{xdg-open} or the default browser (elsewhere).

      The default for \code{ccaddress} is now
      \code{getOption("ccaddress")} which is by default unset: using the
      username as a mailing address nowadays rarely works as expected.

      \item The default for \code{options("mailer")} is now
      \code{"mailto"} on all platforms.

      \item \code{unlink()} now does tilde-expansion (like most other
      file functions).

      \item \code{file.rename()} now allows vector arguments (of the
      same length).

      \item The \code{"glm"} method for \code{logLik()} now returns an
      \code{"nobs"} attribute (which \code{stats4::BIC()} assumed it
      did).

      The \code{"nls"} method for \code{logLik()} gave incorrect results
      for zero weights.

      \item There is a new generic function \code{nobs()} in package
      \pkg{stats}, to extract from model objects a suitable value for
      use in BIC calculations.  An S4 generic derived from it is defined
      in package \pkg{stats4}.

      \item Code for S4 reference-class methods is now examined for
      possible errors in non-local assignments.

      \item \code{findClasses}, \code{getGeneric}, \code{findMethods}
      and \code{hasMethods} are revised to deal consistently with
      the \code{package=} argument and be consistent with soft namespace
      policy for finding objects.

      \item \code{tools::Rdiff()} now has the option to return not only
      the status but a character vector of observed differences (which
      are still by default sent to \file{stdout}).

      \item The startup environment variables \env{R_ENVIRON_USER},
      \env{R_ENVIRON}, \env{R_PROFILE_USER} and \env{R_PROFILE} are now
      treated more consistently.  In all cases an empty value is
      considered to be set and will stop the default being used, and for
      the last two tilde expansion is performed on the file name.  (Note
      that setting an empty value is probably impossible on Windows.)

      \item Using \command{R --no-environ CMD}, \command{R
	--no-site-file CMD} or \command{R --no-init-file CMD} sets
      environment variables so these settings are passed on to child \R
      processes, notably those run by \code{INSTALL}, \code{check} and
      \code{build}. \command{R --vanilla CMD} sets these three options
      (but not \option{--no-restore}).

      \item \code{smooth.spline()} is somewhat faster.  With
      \code{cv=NA} it allows some leverage computations to be skipped,

      \item The internal (C) function \samp{scientific()}, at the heart
      of \R's \code{format.info(x)}, \code{format(x)}, \code{print(x)},
      etc, for numeric \code{x}, has been re-written in order to provide
      slightly more correct results, fixing \PR{14491}, notably in
      border cases including when \code{digits >= 16}, thanks to
      substantial contributions (code and experiments) from Petr
      Savicky.  This affects a noticeable amount of numeric output from
      \R.

      \item A new function \code{grepRaw()} has been introduced for
      finding subsets of raw vectors. It supports both literal searches
      and regular expressions.

      \item Package \pkg{compiler} is now provided as a standard
      package.  See \code{?compiler::compile} for information on how to
      use the compiler.  This package implements a byte code compiler
      for \R: by default the compiler is not used in this release.  See
      the \sQuote{R Installation and Administration Manual} for how to
      compile the base and recommended packages.

      \item Providing an \code{exportPattern} directive in a NAMESPACE
      file now causes classes to be exported according to the same
      pattern, for example the default from \code{package.skeleton()}
      to specify all names starting with a letter.  An explicit
      directive to \code{exportClassPattern} will still over-ride.

      \item There is an additional marked encoding \code{"bytes"} for
      character strings.  This is intended to be used for non-ASCII
      strings which should be treated as a set of bytes, and never
      re-encoded as if they were in the encoding of the current locale:
      \code{useBytes = TRUE} is automatically selected in functions such
      as \code{writeBin()}, \code{writeLines()}, \code{grep()} and
      \code{strsplit()}.

      Only a few character operations are supported (such as \code{substr()}).

      Printing, \code{format()} and \code{cat()} will represent non-ASCII
      bytes in such strings by a \samp{\xab} escape.

      \item The new function \code{removeSource()} removes the internally
      stored source from a function.

      \item \code{"srcref"} attributes now include two additional
      line number values, recording the line numbers in the order they
      were parsed.

      \item New functions have been added for source reference access:
      \code{getSrcFilename()}, \code{getSrcDirectory()},
      \code{getSrcLocation()} and \code{getSrcref()}.

      \item \code{Sys.chmod()} has an extra argument \code{use_umask}
      which defaults to true and restricts the file mode by the current
      setting of \code{umask}.  This means that all the \R functions
      which manipulate file/directory permissions by default respect
      \code{umask}, notably \command{R CMD INSTALL}.

      \item \code{tempfile()} has an extra argument \code{fileext} to
      create a temporary filename with a specified extension.
      (Suggestion and initial implementation by Dirk Eddelbuettel.)

      There are improvements in the way \code{Sweave()} and
      \code{Stangle()} handle non-ASCII vignette sources, especially in
      a UTF-8 locale: see \sQuote{Writing R Extensions} which now has a
      subsection on this topic.

      \item \code{factanal()} now returns the rotation matrix if a
      rotation such as \code{"promax"} is used, and hence factor
      correlations are displayed.  (Wish of \PR{12754}.)

      \item The \code{gctorture2()} function provides a more refined
      interface to the GC torture process.  Environment variables
      \env{R_GCTORTURE}, \env{R_GCTORTURE_WAIT}, and
      \env{R_GCTORTURE_INHIBIT_RELEASE} can also be used to control the
      GC torture process.

      \item \code{file.copy(from, to)} no longer regards it as an error
      to supply a zero-length \code{from}: it now simply does nothing.

      \item \code{rstandard.glm()} gains a \code{type} argument which can
      be used to request standardized Pearson residuals.

      \item A start on a Turkish translation, thanks to Murat Alkan.

      \item \code{.libPaths()} calls \code{normalizePath(winslash = "/")}
      on the paths: this helps (usually) to present them in a
      user-friendly form and should detect duplicate paths accessed via
      different symbolic links.

      \item \code{download.file()} can be now used with external methods
      even if there are spaces in the URL or the target filename.

      \item The first formal argument of \code{.C()}, \code{.Fortran()},
      \code{.Call()} and \code{.External()} is now referred to a
      \code{.NAME} rather than \code{name}: however actual calls should
      have an unnamed first argument.
    }
  }

  \subsection{SWEAVE CHANGES}{
    \itemize{
      \item \code{Sweave()} has options to produce PNG and JPEG figures,
      and to use a custom function to open a graphics device (see
      \code{?RweaveLatex}).\cr
      (Based in part on the contribution of \PR{14418}.)

      \item The default for \code{Sweave()} is to produce only PDF
      figures (rather than both EPS and PDF).

      \item Environment variable \env{SWEAVE_OPTIONS} can be used to
      supply defaults for existing or new options to be applied after
      the Sweave driver setup has been run.

      \item The Sweave manual is now included as a vignette in the
      \pkg{utils} package.

      \item \code{Sweave()} handles \code{keep.source=TRUE} much better:
      it could duplicate some lines and omit comments. (Reported by John
      Maindonald and others.)
    }
  }

  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item Because they use a C99 interface which a C++ compiler is not
      required to support, \code{Rvprintf} and \code{REvprintf} are only
      defined by \file{R_ext/Print.h} in C++ code if the macro
      \code{R_USE_C99_IN_CXX} is defined when it is included.

      \item \code{pythag} duplicated the C99 function \code{hypot}.  It
      is no longer provided, but is used as a substitute for \code{hypot}
      in the very unlikely event that the latter is not available.

      \item \code{R_inspect(obj)} and \code{R_inspect3(obj, deep, pvec)}
      are (hidden) C-level entry points to the internal \code{inspect}
      function and can be used for C-level debugging (e.g., in conjunction
      with the \code{p} command in \code{gdb}).

      \item Compiling R with \option{--enable-strict-barrier} now also
      enables additional checking for use of unprotected objects. In
      combination with \code{gctorture()} or \code{gctorture2()} and a
      C-level debugger this can be useful for tracking down memory
      protection issues.
    }
  }

  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD Rdiff} is now implemented in \R on
      Unix-alikes (as it has been on Windows since \R 2.12.0).

      \item \command{R CMD build} no longer does any cleaning in the
      supplied package directory: all the cleaning is done in the copy.

      It has a new option \option{--install-args} to pass arguments to
      \command{R CMD INSTALL} for \option{--build} (but not when
      installing to rebuild vignettes).

      There is new option, \option{--resave-data}, to call
      \code{tools::resaveRdaFiles()} on the \file{data} directory, to
      compress tabular files (\file{.tab}, \file{.csv} etc) and to
      convert \file{.R} files to \file{.rda} files.  The default,
      \option{--resave-data=gzip}, is to do so in a way compatible even
      with years-old versions of \R, but better compression is given by
      \option{--resave-data=best}, requiring \R >= 2.10.0.

      It now adds a \file{datalist} file for \file{data} directories of
      more than 1Mb.

      Patterns in \file{.Rbuildignore} are now also matched against all
      directory names (including those of empty directories).

      There is a new option, \option{--compact-vignettes}, to try
      reducing the size of PDF files in the \file{inst/doc} directory.
      Currently this tries \command{qpdf}: other options may be used in
      future.

      When re-building vignettes and a \file{inst/doc/Makefile} file is
      found, \code{make clean} is run if the makefile has a
      \code{clean:} target.

      After re-building vignettes the default clean-up operation will
      remove any directories (and not just files) created during the
      process: e.g., one package created a \file{.R_cache} directory.

      Empty directories are now removed unless the option
      \option{--keep-empty-dirs} is given (and a few packages do
      deliberately include empty directories).

      If there is a field \code{BuildVignettes} in the package
      \file{DESCRIPTION} file with a false value, re-building the
      vignettes is skipped.

      \item \command{R CMD check} now also checks for filenames that are
      case-insensitive matches to Windows' reserved file names with
      extensions, such as \file{nul.Rd}, as these have caused problems
      on some Windows systems.

      It checks for inefficiently saved \file{data/*.rda} and
      \file{data/*.RData} files, and reports on those large than 100Kb.
      A more complete check (including of the type of compression, but
      potentially much slower) can be switched on by setting environment
      variable \env{_R_CHECK_COMPACT_DATA2_} to \samp{TRUE}.

      The types of files in the \file{data} directory are now checked,
      as packages are \emph{still} misusing it for non-\R data files.

      It now extracts and runs the \R code for each vignette in a
      separate directory and \R process: this is done in the package's
      declared encoding.  Rather than call
      \code{tools::checkVignettes()}, it calls
      \code{tools::buildVignettes()} to see if the vignettes can be
      re-built as they would be by \command{R CMD build}.  Option
      \option{--use-valgrind} now applies only to these runs, and not
      when running code to rebuild the vignettes.  This version does a
      much better job of suppressing output from successful vignette
      tests.

      The \file{00check.log} file is a more complete record of what is
      output to \file{stdout}: in particular contains more details of
      the tests.

      It now checks all syntactically valid Rd usage entries, and warns
      about assignments (unless these give the usage of replacement
      functions).

      \file{.tar.xz} compressed tarballs are now allowed, if
      \command{tar} supports them (and setting environment variable
      \env{TAR} to \samp{internal} ensures so on all platforms).

      \item \command{R CMD check} now warns if it finds
      \file{inst/doc/makefile}, and \command{R CMD build} renames such a
      file to \file{inst/doc/Makefile}.
   }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item Installing \R no longer tries to find \command{perl}, and
      \command{R CMD} no longer tries to substitute a full path for
      \command{awk} nor \command{perl} -- this was a legacy from the
      days when they were used by \R itself.  Because a couple of
      packages do use \command{awk}, it is set as the \command{make}
      (rather than environment) variable \env{AWK}.

      \item \command{make check} will now fail if there are differences
      from the reference output when testing package examples and if
      environment variable \env{R_STRICT_PACKAGE_CHECK} is set to a true
      value.

      \item The C99 double complex type is now required.

      The C99 complex trigonometric functions (such as \samp{csin}) are
      not currently required (FreeBSD lacks most of them): substitutes
      are used if they are missing.

      \item The C99 system call \samp{va_copy} is now required.

      \item If environment variable \env{R_LD_LIBRARY_PATH} is set
      during configuration (for example in \file{config.site}) it is
      used unchanged in file \file{etc/ldpaths} rather than being
      appended to.

      \item \command{configure} looks for support for OpenMP and if
      found compiles \R with appropriate flags and also makes them
      available for use in packages: see \sQuote{Writing R Extensions}.

      This is currently experimental, and is only used in \R with a
      single thread for \code{colSums()} and \code{colMeans()}.  Expect
      it to be more widely used in later versions of \R.

      This can be disabled by the \option{--disable-openmp} flag.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item \command{R CMD INSTALL --clean} now removes copies of a
      \file{src} directory which are created when multiple
      sub-architectures are in use.  (Following a comment from
      Berwin Turlach.)

      \item File \file{R.css} is now installed on a per-package basis
      (in the package's \file{html} directory) rather than in each
      library tree, and this is used for all the HTML pages in the
      package.  This helps when installing packages with static HTML
      pages for use on a webserver.  It will also allow future versions
      of \R to use different stylesheets for the packages they install.

      \item A top-level file \file{.Rinstignore} in the package sources
      can list (in the same way as \file{.Rbuildignore}) files under
      \code{inst} that should not be installed.  (Why should there be any
      such files?  Because all the files needed to re-build vignettes
      need to be under \code{inst/doc}, but they may not need to be
      installed.)

      \item \command{R CMD INSTALL} has a new option
      \option{--compact-docs} to compact any PDFs under the
      \file{inst/doc} directory.  Currently this uses \command{qpdf},
      which must be installed (see \sQuote{Writing R Extensions}).

      \item There is a new option \option{--lock} which can be used to
      cancel the effect of \option{--no-lock} or \option{--pkglock} earlier
      on the command line.

      \item Option \option{--pkglock} can now be used with more than one
      package, and is now the default if only one package is specified.

      \item Argument \code{lock} of \code{install.packages()} can now be
      use for Mac binary installs as well as for Windows ones.  The
      value \code{"pkglock"} is now accepted, as well as \code{TRUE} and
      \code{FALSE} (the default).

      \item There is a new option \option{--no-clean-on-error} for
      \command{R CMD INSTALL} to retain a partially installed package for
      forensic analysis.

      \item Packages with names ending in \file{.} are not portable
      since Windows does not work correctly with such directory names.
      This is now warned about in \command{R CMD check}, and will not be
      allowed in \R 2.14.x.

      \item The vignette indices are more comprehensive (in the style of
      \code{browseVignetttes()}).
    }
  }

  \subsection{DEPRECATED & DEFUNCT}{
    \itemize{
      \item \code{require(save = TRUE)} is defunct, and use of the
      \code{save} argument is deprecated.

      \item \command{R CMD check --no-latex} is defunct: use
      \option{--no-manual} instead.

      \item \command{R CMD Sd2Rd} is defunct.

      \item The \code{gamma} argument to \code{hsv()},
      \code{rainbow()}, and \code{rgb2hsv()} is deprecated
      and no longer has any effect.

      \item The previous options for \command{R CMD build --binary}
      (\option{--auto-zip}, \option{--use-zip-data} and
      \option{--no-docs}) are deprecated (or defunct):
      use the new option \option{--install-args} instead.

      \item When a character value is used for the \code{EXPR}
      argument in \code{switch()}, only a single unnamed alternative
      value is now allowed.

      \item The wrapper \code{utils::link.html.help()} is no longer
      available.

      \item Zip-ing data sets in packages (and hence \command{R CMD
	INSTALL} options \option{--use-zip-data} and \option{--auto-zip}, as
      well as the \samp{ZipData: yes} field in a \code{DESCRIPTION} file)
      is defunct.

      Installed packages with zip-ed data sets can still be used, but a
      warning that they should be re-installed will be given.

      \item The \sQuote{experimental} alternative specification of a
      namespace via \code{.Export()} etc is now defunct.

      \item The option \option{--unsafe} to \command{R CMD INSTALL} is
      deprecated: use the identical option \option{--no-lock} instead.

      \item The entry point \code{pythag} in \file{Rmath.h} is deprecated
      in favour of the C99 function \code{hypot}.  A wrapper for
      \code{hypot} is provided for \R 2.13.x only.

      \item Direct access to the \code{"source"} attribute of functions
      is deprecated; use \code{deparse(fn, control="useSource")} to access
      it, and \code{removeSource(fn)} to remove it.

      \item \command{R CMD build --binary} is now formally deprecated:
      \command{R CMD INSTALL --build} has long been the preferred
      alternative.

      \item Single-character package names are deprecated (and \pkg{R}
      is already disallowed to avoid confusion in \samp{Depends:}
      fields).
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{drop.terms} and the \code{[} method for class
      \code{"terms"} no longer add back an intercept.  (Reported by
      Niels Hansen.)

      \item \code{aggregate} preserves the class of a column (e.g., a
      date) under some circumstances where it discarded the class
      previously.

      \item \code{p.adjust()} now always returns a vector result, as
      documented.  In previous versions it copied attributes (such as
      dimensions) from the \code{p} argument: now it only copies names.

      \item On PDF and PostScript devices, a line width of zero was
      recorded verbatim and this caused problems for some viewers
      (a very thin line combined with a non-solid line dash pattern
      could also cause a problem).  On these devices, the line width is
      now limited at 0.01 and for very thin lines with complex dash
      patterns the device may force the line dash pattern to be solid.
      (Reported by Jari Oksanen.)

      \item The \code{str()} method for class \code{"POSIXt"} now gives
      sensible output for 0-length input.

      \item The one- and two-argument complex maths functions failed to
      warn if NAs were generated (as their numeric analogues do).

      \item Added \code{.requireCachedGenerics} to the \code{dont.mind}
      list for \code{library()} to avoid warnings about duplicates.

      \item \code{$<-.data.frame} messed with the class attribute,
      breaking any S4 subclass.  The S4 \code{data.frame} class now has its own
      \code{$<-} method, and turns dispatch on for this primitive.

      \item \code{Map()} did not look up a character argument \code{f}
      in the correct frame, thanks to lazy evaluation.  (\PR{14495})

      \item \code{file.copy()} did not tilde-expand \code{from} and \code{to}
      when \code{to} was a directory.  (\PR{14507})

      \item It was possible (but very rare) for the loading test in
      \command{R CMD INSTALL} to crash a child \R process and so leave
      around a lock directory and a partially installed package.  That
      test is now done in a separate process.

      \item \code{plot(<formula>, data=<matrix>,..)} now works in more
      cases; similarly for \code{points()}, \code{lines()} and
      \code{text()}.

      \item \code{edit.default()} contained a manual dispatch for matrices
      (the \code{"matrix"} class didn't really exist when it was written).
      This caused an infinite recursion in the no-GUI case and has now
      been removed.

      \item \code{data.frame(check.rows = TRUE)} sometimes worked when
      it should have detected an error.  (\PR{14530})

      \item \code{scan(sep= , strip.white=TRUE)} sometimes stripped
      trailing spaces from within quoted strings.  (The real bug in
      \PR{14522}.)

      \item The rank-correlation methods for \code{cor()} and
      \code{cov()} with \code{use = "complete.obs"} computed the ranks
      before removing missing values, whereas the documentation implied
      incomplete cases were removed first.  (\PR{14488})

      They also failed for 1-row matrices.

      \item The perpendicular adjustment used in placing text and
      expressions in the margins of plots was not scaled by
      \code{par("mex")}. (Part of \PR{14532}.)

      \item Quartz Cocoa device now catches any Cocoa exceptions that
      occur during the creation of the device window to prevent crashes.
      It also imposes a limit of 144 ft^2 on the area used by a window
      to catch user errors (unit misinterpretation) early.

      \item The browser (invoked by \code{debug()}, \code{browser()}
      or otherwise) would display attributes such as \code{"wholeSrcref"}
      that were intended for internal use only.

      \item R's internal filename completion now properly handles
      filenames with spaces in them even when the readline library is
      used.  This resolves \PR{14452} provided the internal filename
      completion is used (e.g., by setting \code{rc.settings(files =
	TRUE)}).

      \item Inside \code{uniroot(f, ...)}, \code{-Inf} function values
      are now replaced by a maximally \bold{negative} value.

      \item \code{rowsum()} could silently over/underflow on integer
      inputs (reported by Bill Dunlap).

      \item \code{as.matrix()} did not handle \code{"dist"} objects with
      zero rows.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.12.2 patched}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{max()} and \code{min()} work harder to ensure that
      \code{NA} has precedence over \code{NaN},
      so e.g.\sspace{}\code{min(NaN, NA)} is \code{NA}.
      (This was not previously documented except
      for within a single numeric vector, where compiler optimizations
      often defeated the code.)
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item A change to the C function \samp{R_tryEval} had broken error
      messages in S4 method selection; the error message is now printed.

      \item PDF output with a non-RGB color model used RGB for the line
      stroke color.  (\PR{14511})

      \item \code{stats4::BIC()} assumed without checking that an object
      of class \code{"logLik"} has an \code{"nobs"} attribute:
      \code{glm()} fits did not and so \code{BIC()} failed for them.

      \item In some circumstances a one-sided \code{mantelhaen.test()}
      reported the p-value for the wrong tail.  (\PR{14514})

      \item Passing the invalid value \code{lty = NULL} to \code{axis()}
      sent an invalid value to the graphics device, and might cause the
      device to segfault.

      \item \code{Sweave()} with \code{concordance=TRUE} could lead to
      invalid PDF files; \file{Sweave.sty} has been updated to avoid
      this.

      \item Non-ASCII characters in the titles of help pages were
      not rendered properly in some locales, and could cause errors
      or warnings.

      \item \code{checkRd()} gave a spurious error if the \code{\\href}
      macro was used.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.12.2}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item Complex arithmetic (notably \code{z^n} for complex \code{z}
      and integer \code{n}) gave incorrect results since \R 2.10.0 on
      platforms without C99 complex support.  This and some
      lesser issues in trigonometric functions have been corrected.

      Such platforms were rare (we know of Cygwin and FreeBSD).
      However, because of new compiler optimizations in the way complex
      arguments are handled, the same code was selected on x86_64 Linux
      with \command{gcc 4.5.x} at the default \code{-O2} optimization
      (but not at \code{-O}).

      \item There is a workaround for crashes seen with several packages
      on systems using \samp{zlib 1.2.5}: see the INSTALLATION section.
    }
  }

  \subsection{NEW FEATURES}{
    \itemize{
      \item PCRE has been updated to 8.12 (two bug-fix releases since 8.10).

      \item \code{rep()}, \code{seq()}, \code{seq.int()} and
      \code{seq_len()} report more often when the first element is taken
      of an argument of incorrect length.

      \item The Cocoa back-end for the \code{quartz()} graphics device
      on Mac OS X provides a way to disable event loop processing
      temporarily (useful, e.g., for forked instances of \R).

      \item \code{kernel()}'s default for \code{m} was not appropriate
      if \code{coef} was a set of coefficients.  (Reported by Pierre
      Chausse.)

      \item \code{bug.report()} has been updated for the current \R bug
      tracker, which does not accept emailed submissions.

      \item \command{R CMD check} now checks for the correct use of
      \samp{$(LAPACK_LIBS)} (as well as \samp{$(BLAS_LIBS)}), since
      several CRAN recent submissions have ignored \sQuote{Writing R
	Extensions}.
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item The \samp{zlib} sources in the distribution are now built
      with all symbols remapped: this is intended to avoid problems seen
      with packages such as \CRANpkg{XML} and \CRANpkg{rggobi} which link to
      \file{zlib.so.1} on systems using \samp{zlib 1.2.5}.

      \item The default for \env{FFLAGS} and \env{FCFLAGS} with
      \command{gfortran} on x86_64 Linux has been changed back to \samp{-g
	-O2}:  however, setting \samp{-g -O} may still be needed for
      \command{gfortran 4.3.x}.
    }
  }

  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item A \samp{LazyDataCompression} field in the \file{DESCRIPTION}
      file will be used to set the value for the
      \option{--data-compress} option of \command{R CMD INSTALL}.

      \item Files \file{R/sysdata.rda} of more than 1Mb are now stored
      in the lazyload database using \command{xz} compression: this for
      example halves the installed size of package \CRANpkg{Imap}.

      \item \command{R CMD INSTALL} now ensures that directories
      installed from \file{inst} have search permission for everyone.

      It no longer installs files \file{inst/doc/Rplots.ps} and
      \file{inst/doc/Rplots.pdf}.  These are almost certainly left-overs
      from \code{Sweave} runs, and are often large.
    }
  }

  \subsection{DEPRECATED & DEFUNCT}{
    \itemize{
      \item The \sQuote{experimental} alternative specification of a
      namespace via \code{.Export()} etc is now deprecated.

      \item \code{zip.file.extract()} is now deprecated.

      \item Zip-ing data sets in packages (and hence \command{R CMD
	INSTALL --use-zip-data} and the \samp{ZipData: yes} field in a
	\code{DESCRIPTION} file) is deprecated: using efficiently
	compressed \file{.rda} images and lazy-loading of data has
	superseded it.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{identical()} could in rare cases generate a warning
      about non-pairlist attributes on CHARSXPs.  As these are used for
      internal purposes, the attribute check should be skipped.
      (Reported by Niels Richard Hansen).

      \item If the filename extension (usually \file{.Rnw}) was not
      included in a call to \code{Sweave()}, source references would not
      work properly and the \code{keep.source} option failed.  (\PR{14459})

      \item \code{format.data.frame()} now keeps zero character column names.

      \item \code{pretty(x)} no longer raises an error when \code{x}
      contains solely non-finite values. (\PR{14468})

      \item The \code{plot.TukeyHSD()} function now uses a line width of
      0.5 for its reference lines rather than \samp{lwd = 0} (which
      caused problems for some PDF and PostScript viewers).

      \item The \code{big.mark} argument to \code{prettyNum()},
      \code{format()}, etc. was inserted reversed if it was more than
      one character long.

      \item \command{R CMD check} failed to check the filenames under
      \file{man} for Windows' reserved names.

      \item The \code{"Date"} and \code{"POSIXt"} methods for
      \code{seq()} could overshoot when \code{to} was supplied and
      \code{by} was specified in months or years.

      \item The internal method of \code{untar()} now restores hard
      links as file copies rather than symbolic links (which did not
      work for cross-directory links).

      \item \code{unzip()} did not handle zip files which contained
      filepaths with two or more leading directories which were not in
      the zipfile and did not already exist.  (It is unclear if such
      zipfiles are valid and the third-party C code used did not support
      them, but \PR{14462} created one.)

      \item \code{combn(n, m)} now behaves more regularly for the border
      case \eqn{m = 0}. (\PR{14473})

      \item The rendering of numbers in plotmath expressions (e.g.,
      \code{expression(10^2)}) used the current settings for conversion
      to strings rather than setting the defaults, and so could be
      affected by what has been done before.  (\PR{14477})

      \item The methods of \code{napredict()} and \code{naresid()} for
      \code{na.action = na.exclude} fits did not work correctly in the
      very rare event that every case had been omitted in the fit.
      (Reported by Simon Wood.)

      \item \code{weighted.residuals(drop0=TRUE)} returned a vector when
      the residuals were a matrix (e.g., those of class \code{"mlm"}).
      (Reported by Bill Dunlap.)

      \item Package HTML index files \file{<pkg>/html/00Index.html} were
      generated with a stylesheet reference that was not correct for
      static browsing in libraries.

      \item \code{ccf(na.action = na.pass)} was not implemented.

      \item The parser accepted some incorrect numeric constants,
      e.g.\sspace{}\code{20x2}.  (Reported by Olaf Mersmann.)

      \item \code{format(*, zero.print)} did not always replace the full
      zero parts.

      \item Fixes for subsetting or subassignment of \code{"raster"}
      objects when not both \code{i} and \code{j} are specified.

      \item \command{R CMD INSTALL} was not always respecting the
      \samp{ZipData: yes} field of a \file{DESCRIPTION} file (although
      this is frequently incorrectly specified for packages with no data
      or which specify lazy-loading of data).

      \command{R CMD INSTALL --use-zip-data} was incorrectly implemented
      as \option{--use-zipdata} since \R 2.9.0.

      \item \command{source(file, echo=TRUE)} could fail if the file
      contained \samp{#line} directives.  It now recovers more gracefully, but
      may still display the wrong line if the directive gives incorrect
      information.

      \item \code{atan(1i)} returned \code{NaN+Infi} (rather than
      \code{0+Infi}) on platforms without C99 complex support.

      \item \code{library()} failed to cache S4 metadata (unlike
      \code{loadNamespace()}) causing failures in S4-using packages
      without a namespace (e.g., those using reference classes).

      \item The function \code{qlogis(lp, log.p=TRUE)} no longer
      prematurely overflows to \code{Inf} when exp(lp) is close to 1.

      \item Updating S4 methods for a group generic function requires
      resetting the methods tables for the members of the group (patch
      contributed by Martin Morgan).

      \item In some circumstances (including for package \CRANpkg{XML}),
      \command{R CMD INSTALL} installed version-control directories from
      source packages.

      \item Added \code{PROTECT} calls to some constructed expressions
      used in C level \code{eval} calls.

      \item \code{utils:::create.post()} (used by \code{bug.report()}
      and \code{help.request()}) failed to quote arguments to the
      mailer, and so often failed.

      \item \code{bug.report()} was naive about how to extract
      maintainer email addresses from package descriptions, so would
      often try mailing to incorrect addresses.

      \item \code{debugger()} could fail to read the environment of a
      call to a function with a \code{\dots} argument.  (Reported by
      Charlie Roosen.)

      \item \code{prettyNum(c(1i, NA), drop0=TRUE)} or
      \code{str(NA_complex_)} now work correctly.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.12.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item The DVI/PDF reference manual now includes the help pages for
      all the standard packages: \pkg{splines}, \pkg{stats4} and
      \pkg{tcltk} were previously omitted (intentionally).

      \item \url{http://www.rforge.net} has been added to the default
      set of repositories known to \code{setRepositories()}.

      \item xz-utils has been updated to version 5.0.0.

      \item \code{reshape()} now makes use of \code{sep} when forming
      names during reshaping to wide format.  (\PR{14435})

      \item \code{legend()} allows the length of lines to be set by the
      end user \emph{via} the new argument \code{seg.len}.

      \item New S4 reference class utility methods \code{copy()},
      \code{field()}, \code{getRefClass()} and \code{getClass()} have
      been added to package \pkg{methods}.

      \item When a character value is used for the \code{EXPR}
      argument in \code{switch()}, a warning is given if more than
      one unnamed alternative value is given.  This will become an
      error in \R 2.13.0.

      \item \code{StructTS(type = "BSM")} now allows series with just
      two seasons.  (Reported by Birgit Erni.)
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item The PDF reference manual is now built as PDF version 1.5
      with object compression, which on platforms for which this is not
      the default (notably MiKTeX) halves its size.

      \item Variable \env{FCLIBS} can be set during configuration, for
      any additional library flags needed when linking a shared object
      with the Fortran 9x compiler.  (Needed with Solaris Studio 12.2.)
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \code{seq.int()} no longer sometimes evaluates arguments
      twice.  (\PR{14388})

      \item The \code{data.frame} method of \code{format()} failed if a
      column name was longer than 256 bytes (the maximum length allowed
      for an \R name).

      \item \code{predict(<lm object>, type ="terms", ...)} failed if
      both \code{terms} and \code{interval} were specified.  (Reported
      by Bill Dunlap.)

      Also, if \code{se.fit = TRUE} the standard errors were reported
      for all terms, not just those selected by a non-null \code{terms}.

      \item The TRE regular expressions engine could terminate \R rather
      than give an error when given certain invalid regular expressions.
      (\PR{14398})

      \item \code{cmdscale(eig = TRUE)} was documented to return \eqn{n-1}
      eigenvalues but in fact only returned \code{k}.  It now returns
      all \eqn{n} eigenvalues.

      \code{cmdscale(add = TRUE)} failed to centre the return
      configuration and sometimes lost the labels on the points.  Its
      return value was described wrongly (it is always a list and
      contains component \code{ac}).

      \item \code{promptClass()} in package \pkg{methods} now works for
      reference classes and gives a suitably specialized skeleton of
      documentation.

      Also, \code{callSuper()} now works via the \code{methods()}
      invocation as well as for initially specified methods.

      \item \code{download.file()} could leave the destination file open
      if the URL was not able to be opened.  (\PR{14414})

      \item Assignment of an environment to functions or as an attribute
      to other objects now works for S4 subclasses of \code{"environment"}.

      \item Use of \samp{[[<-} for S4 subclasses of
      \code{"environment"} generated an infinite recursion from the
      method.  The method has been replaced by internal code.

      \item In a reference class S4 method, \code{callSuper()} now works in
      \code{initialize()} methods when there is no explicit superclass
      method.

      \item \samp{!} dropped attributes such as names and dimensions from a
      length-zero argument.  (\PR{14424})

      \item When \code{list2env()} created an environment it was missing
      a \code{PROTECT} call and so was vulnerable to garbage collection.

      \item \code{Sweave()} with \code{keep.source=TRUE} dropped
      comments at the start and end of code chunks.  It could also
      fail when \samp{\SweaveInput} was combined with named chunks.

      \item The Fortran code used by \code{nls(algorithm = "port")}
      could infinite-loop when compiled with high optimization on a
      modern version of \code{gcc}, and \code{SAFE_FFLAGS} is now used
      to make this less likely.  (\PR{14427}, seen with 32-bit Windows
      using \code{gcc 4.5.0} used from \R 2.12.0.)

      \item \code{sapply()} with default \code{simplify = TRUE} and
      \code{mapply()} with default \code{SIMPLIFY = TRUE} wrongly
      simplified language-like results, as, e.g., in
      \code{mapply(1:2, c(3,7), FUN = function(i,j) call(':',i,j))}.

      \item Backreferences to undefined patterns in
      \code{[g]sub(pcre = TRUE)} could cause a segfault.  (\PR{14431})

      \item The \code{format()} (and hence the \code{print()}) method
      for class \code{"Date"} rounded fractional dates towards zero: it
      now always rounds them down.

      \item Reference S4 class creation could generate ambiguous
      inheritance patterns under very special circumstances.

      \item \samp{[[<-} turned S4 subclasses of \code{"environment"} into
      plain environments.

      \item Long titles for help pages were truncated in package indices
      and a few other places.

      \item Additional utilities now work correctly with S4 subclasses of
      \code{"environment"} (\code{rm}, locking tools and active
      bindings).

      \item \code{spec.ar()} now also work for the \code{"ols"} method.
      (Reported by Hans-Ruedi Kuensch.)

      \item The initialization of objects from S4 subclasses of
      \code{"environment"} now allocates a new environment object.

      \item \command{R CMD check} has more protection against (probably
      erroneous) example or test output which is invalid in the current
      locale.

      \item \code{qr.X()} with column names and pivoting now also pivots
      the column names.  (\PR{14438})

      \item \code{unit.pmax()} and \code{unit.pmin()} in package
      \pkg{grid} gave incorrect results when all inputs were of length 1.
      (\PR{14443})

      \item The parser for \file{NAMESPACE} files ignored misspelled
      directives, rather than signalling an error.  For 2.12.x a warning
      will be issued, but this will be correctly reported as an error
      in later releases. (Reported by Charles Berry.)

      \item Fix for subsetting of \code{"raster"} objects when only one
      of \code{i} or \code{j} is specified.

      \item \code{grid.raster()} in package \pkg{grid} did not accept
      \code{"nativeRaster"} objects (like \code{rasterImage()} does).

      \item Rendering raster images in PDF output was resetting the
      clipping region.

      \item Rendering of raster images on cairo X11 device was wrong,
      particularly when a small image was being scaled up using
      interpolation.

      With cairo < 1.6, will be better than before, though still a
      little clunky.  With cairo >= 1.6, should be sweet as.

      \item Several bugs fixed in \code{read.DIF()}:  single column
      inputs caused errors, cells marked as \code{"character"} could
      be converted to other types, and (in Windows) copying from the
      clipboard failed.
    }
  }
}

\section{\Rlogo CHANGES IN R VERSION 2.12.0}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item Reading a package's \file{CITATION} file now defaults to
       ASCII rather than Latin-1: a package with a non-ASCII
       \file{CITATION} file should declare an encoding in its
       \file{DESCRIPTION} file and use that encoding for the
       \file{CITATION} file.

      \item \code{difftime()} now defaults to the \code{"tzone"}
       attribute of \code{"POSIXlt"} objects rather than to the current
       timezone as set by the default for the \code{tz} argument.  (Wish
       of \PR{14182}.)

      \item \code{pretty()} is now generic, with new methods for
       \code{"Date"} and \code{"POSIXt"} classes (based on code
       contributed by Felix Andrews).

      \item \code{unique()} and \code{match()} are now faster on
       character vectors where all elements are in the global \code{CHARSXP}
       cache and have unmarked encoding (ASCII).  Thanks to Matthew
       Dowle for suggesting improvements to the way the hash code is
       generated in \file{unique.c}.

      \item The \code{enquote()} utility, in use internally, is exported now.

      \item \code{.C()} and \code{.Fortran()} now map non-zero return
       values (other than \code{NA_LOGICAL}) for logical vectors to
       \code{TRUE}: it has been an implicit assumption that they are
       treated as true.

      \item The \code{print()} methods for \code{"glm"} and \code{"lm"}
       objects now insert linebreaks in long calls in the same way that
       the \code{print()} methods for \code{"summary.[g]lm"} objects
       have long done.  This does change the layout of the examples for
       a number of packages, e.g.\sspace{}\CRANpkg{MASS}.  (\PR{14250})

      \item \code{constrOptim()} can now be used with method
      \code{"SANN"}.  (\PR{14245})

       It gains an argument \code{hessian} to be passed to
       \code{optim()}, which allows all the \code{...} arguments to be
       intended for \code{f()} and \code{grad()}.  (\PR{14071})

      \item \code{curve()} now allows \code{expr} to be an object of
       mode \code{"expression"} as well as \code{"call"} and
       \code{"function"}.

      \item The \code{"POSIX[cl]t"} methods for \code{Axis()} have been
       replaced by a single method for \code{"POSIXt"}.

       There are no longer separate \code{plot()} methods for
       \code{"POSIX[cl]t"} and \code{"Date"}: the default method has
       been able to handle those classes for a long time.  This
       \emph{inter alia} allows a single date-time object to be
       supplied, the wish of \PR{14016}.

       The methods had a different default (\code{""}) for \code{xlab}.

      \item Classes \code{"POSIXct"}, \code{"POSIXlt"} and
       \code{"difftime"} have generators \code{.POSIXct()},
       \code{.POSIXlt()} and \code{.difftime()}.  Package authors are
       advised to make use of them (they are available from \R 2.11.0) to
       proof against planned future changes to the classes.

       The ordering of the classes has been changed, so \code{"POSIXt"}
       is now the second class.  See the document \sQuote{Updating
       packages for changes in R 2.12.x} on
       \url{http://developer.r-project.org} for the consequences for a
       handful of CRAN packages.

      \item The \code{"POSIXct"} method of \code{as.Date()} allows a
       timezone to be specified (but still defaults to UTC).

      \item New \code{list2env()} utility function as an inverse of
       \code{as.list(<environment>)} and for fast multi-\code{assign()}
       to existing environment.  \code{as.environment()} is now generic
       and uses \code{list2env()} as list method.

      \item There are several small changes to output which \sQuote{zap}
       small numbers, e.g.\sspace{}in printing quantiles of residuals in
       summaries from \code{"lm"} and \code{"glm"} fits, and in test
       statistics in \code{print.anova()}.

      \item Special names such as \code{"dim"}, \code{"names"}, etc, are
       now allowed as slot names of S4 classes, with \code{"class"} the
       only remaining exception.

      \item File \file{.Renviron} can have architecture-specific versions
       such as \file{.Renviron.i386} on systems with sub-architectures.

      \item \code{installed.packages()} has a new argument
       \code{subarch} to filter on sub-architecture.

      \item The \code{summary()} method for \code{packageStatus()} now
       has a separate \code{print()} method.

      \item The default \code{summary()} method returns an object
       inheriting from class \code{"summaryDefault"} which has a
       separate \code{print()} method that calls \code{zapsmall()} for
       numeric/complex values.

      \item The startup message now includes the platform and if used,
       sub-architecture: this is useful where different
       (sub-)architectures run on the same OS.

      \item The \code{getGraphicsEvent()} mechanism now allows multiple windows
       to return graphics events, through the new functions
       \code{setGraphicsEventHandlers()}, \code{setGraphicsEventEnv()}, and
       \code{getGraphicsEventEnv()}.  (Currently implemented in the
       \code{windows()} and \code{X11()} devices.)

      \item \code{tools::texi2dvi()} gains an \code{index} argument,
       mainly for use by \command{R CMD Rd2pdf}.

       It avoids the use of \command{texindy} by \command{texinfo}'s
       \command{texi2dvi >= 1.157}, since that does not emulate
       'makeindex' well enough to avoid problems with special characters
       (such as \samp{(}, \samp{\{}, \samp{!}) in indices. % )

      \item The ability of \code{readLines()} and \code{scan()} to
       re-encode inputs to marked UTF-8 strings on Windows since \R 2.7.0
       is extended to non-UTF-8 locales on other OSes.

      \item \code{scan()} gains a \code{fileEncoding} argument to
      match \code{read.table()}.

      \item \code{points()} and \code{lines()} gain \code{"table"}
       methods to match \code{plot()}.  (Wish of \PR{10472}.)

      \item \code{Sys.chmod()} allows argument \code{mode} to be a
      vector, recycled along \code{paths}.

      \item There are \code{|}, \code{&} and \code{xor()} methods for
       classes \code{"octmode"} and \code{"hexmode"}, which work
       bitwise.

      \item Environment variables \env{R_DVIPSCMD}, \env{R_LATEXCMD},
       \env{R_MAKEINDEXCMD}, \env{R_PDFLATEXCMD} are no longer used
       nor set in an \R session.  (With the move to
       \code{tools::texi2dvi()}, the conventional environment variables
       \env{LATEX}, \env{MAKEINDEX} and \env{PDFLATEX} will be used.
       \code{options("dvipscmd")} defaults to the value of \env{DVIPS},
       then to \code{"dvips"}.)

      \item New function \code{isatty()} to see if terminal connections are
       redirected.

      \item \code{summaryRprof()} returns the sampling interval in
       component \code{sample.interval} and only returns in
       \code{by.self} data for functions with non-zero self times.

      \item \code{print(x)} and \code{str(x)} now indicate if an empty
      list \code{x} is named.

      \item \code{install.packages()} and \code{remove.packages()} with
       \code{lib} unspecified and multiple libraries in
       \code{.libPaths()} inform the user of the library location used
       with a message rather than a warning.

      \item There is limited support for multiple compressed streams on a
       file: all of \code{[bgx]zfile()} allow streams to be appended to an
       existing file, but \code{bzfile()} reads only the first stream.

      \item Function \code{person()} in package \pkg{utils} now uses
        a given/family scheme in preference to first/middle/last, is
        vectorized to handle an arbitrary number of persons, and gains a
        \code{role} argument to specify person roles using a controlled
        vocabulary (the MARC relator terms).

      \item Package \pkg{utils} adds a new \code{"bibentry"} class
        for representing and manipulating bibliographic information in
        enhanced BibTeX style, unifying and enhancing the previously
        existing mechanisms.

      \item A \code{bibstyle()} function has been added to the
       \pkg{tools} package with default JSS style for rendering
       \code{"bibentry"} objects, and a mechanism for registering other
       rendering styles.

      \item Several aspects of the display of text help are now
       customizable using the new \code{Rd2txt_options()} function.
       options(\code{"help_text_width"}) is no longer used.

      \item Added \samp{\href} tag to the Rd format, to allow
       hyperlinks to URLs without displaying the full URL.

      \item Added \samp{\newcommand} and \samp{\renewcommand} tags
       to the Rd format, to allow user-defined macros.

      \item New \code{toRd()} generic in the \pkg{tools} package to
       convert objects to fragments of Rd code, and added
       \code{"fragment"} argument to \code{Rd2txt()}, \code{Rd2HTML()},
       and \code{Rd2latex()} to support it.

      \item Directory \file{R_HOME/share/texmf} now follows the TDS
       conventions, so can be set as a \code{texmf} tree (\sQuote{root
       directory} in MiKTeX parlance).

      \item S3 generic functions now use correct S4 inheritance when
      dispatching on an S4 object.  See \code{?Methods}, section on
      \dQuote{Methods for S3 Generic Functions} for recommendations
      and details.

      \item \code{format.pval()} gains a \code{...} argument to pass
       arguments such as \code{nsmall} to \code{format()}.  (Wish of
       \PR{9574})

      \item \code{legend()} supports \code{title.adj}.  (Wish of
      \PR{13415})

      \item Added support for subsetting \code{"raster"} objects, plus
      assigning to a subset, conversion to a matrix (of colour
      strings), and comparisons (\samp{==} and \samp{!=}).

      \item Added a new \code{parseLatex()} function (and related
      functions \code{deparseLatex()} and \code{latexToUtf8()}) to
      support conversion of bibliographic entries for display in R.

      \item Text rendering of \samp{\itemize} in help uses a Unicode
      bullet in UTF-8 and most single-byte Windows locales.

      \item Added support for polygons with holes to the graphics
      engine.  This is implemented for the \code{pdf()},
      \code{postscript()}, \code{x11(type="cairo")}, \code{windows()},
      and \code{quartz()} devices (and associated raster formats),
      but not for \code{x11(type="Xlib")} or \code{xfig()} or
      \code{pictex()}.  The user-level interface is the
      \code{polypath()} function in \pkg{graphics} and
      \code{grid.path()} in \pkg{grid}.

      \item File \file{NEWS} is now generated at installation with a
      slightly different format: it will be in UTF-8 on platforms using
      UTF-8, and otherwise in ASCII.  There is also a PDF version,
      \file{NEWS.pdf}, installed at the top-level of the R distribution.

      \item \code{kmeans(x, 1)} now works.  Further, \code{kmeans} now
      returns between and total sum of squares.

      \item \code{arrayInd()} and \code{which()} gain an argument
      \code{useNames}.  For \code{arrayInd}, the default is now false,
      for speed reasons.

      \item As is done for closures, the default \code{print} method for
      the formula class now displays the associated environment if it is
      not the global environment.

      \item A new facility has been added for inserting code into a
      package without re-installing it, to facilitate testing
      changes which can be selectively added and backed out.  See
      \code{?insertSource}.

      \item New function \code{readRenviron} to (re-)read files in the
      format of \file{~/.Renviron} and \file{Renviron.site}.

      \item \code{require()} will now return \code{FALSE} (and not fail)
      if loading the package or one of its dependencies fails.

      \item \code{aperm()} now allows argument \code{perm} to be a
      character vector when the array has named dimnames (as the results
      of \code{table()} calls do).  Similarly, \code{array()} allows
      \code{MARGIN} to be a character vector.  (Based on suggestions of
      Michael Lachmann.)

      \item Package \pkg{utils} now exports and documents functions
      \code{aspell_package_Rd_files()} and
      \code{aspell_package_vignettes()} for spell checking package Rd
      files and vignettes using Aspell, Ispell or Hunspell.

      \item Package news can now be given in Rd format, and
      \code{news()} prefers these \file{inst/NEWS.Rd} files to old-style
      plain text \file{NEWS} or \file{inst/NEWS} files.

      \item New simple function \code{packageVersion()}.

      \item The PCRE library has been updated to version 8.10.

      \item The standard Unix-alike terminal interface declares its name
      to readline as 'R', so that can be used for conditional sections
      in \file{~/.inputrc} files.

      \item \sQuote{Writing R Extensions} now stresses that the standard
      sections in \file{.Rd} files (other than \samp{\alias},
      \samp{\keyword} and \samp{\note}) are intended to be unique, and
      the conversion tools now drop duplicates with a warning.

      The \file{.Rd} conversion tools also warn about an unrecognized type
      in a \samp{\docType} section.

      \item \code{ecdf()} objects now have a \code{quantile()} method.

      \item \code{format()} methods for date-time objects now attempt to make
      use of a \code{"tzone"} attribute with \code{"\%Z"} and
      \code{"\%z"} formats, but it is not always possible.  (Wish of
      \PR{14358}.)

      \item \code{tools::texi2dvi(file, clean = TRUE)} now works in more
      cases (e.g., where emulation is used and when \file{file} is not in
      the current directory).

      \item New function \code{droplevels()} to remove unused factor levels.

      \item \code{system(command, intern = TRUE)} now gives an error on
      a Unix-alike (as well as on Windows) if \code{command} cannot be
      run.  It reports a non-success exit status from running
      \code{command} as a warning.

      On a Unix-alike an attempt is made to return the actual exit
      status of the command in \code{system(intern = FALSE)}: previously
      this had been system-dependent but on POSIX-compliant systems the
      value return was 256 times the status.

      \item \code{system()} has a new argument \code{ignore.stdout}
      which can be used to (portably) ignore standard output.

      \item \code{system(intern = TRUE)} and \code{pipe()} connections
      are guaranteed to be available on all builds of \R.

      \item \code{Sys.which()} has been altered to return \code{""} if
      the command is not found (even on Solaris).

      \item A facility for defining reference-based S4 classes (in the
      OOP style of Java, C++, etc.) has been added experimentally to
      package \pkg{methods}; see \code{?ReferenceClasses}.

      \item The \code{predict} method for \code{"loess"} fits gains an
      \code{na.action} argument which defaults to \code{na.pass} rather
      than the previous default of \code{na.omit}.

      Predictions from \code{"loess"} fits are now named from the row
      names of \code{newdata}.

      \item Parsing errors detected during \code{Sweave()} processing
      will now be reported referencing their original location in the
      source file.

      \item New \code{adjustcolor()} utility, e.g., for simple
      translucent color schemes.

      \item \code{qr()} now has a trivial \code{lm} method with a
      simple (fast) validity check.

      \item An experimental new programming model has been added to
      package \pkg{methods} for reference (OOP-style) classes and
      methods.  See \code{?ReferenceClasses}.

      \item bzip2 has been updated to version 1.0.6 (bug-fix release).
      \option{--with-system-bzlib} now requires at least version 1.0.6.

      \item R now provides \file{jss.cls} and \file{jss.bst} (the class
      and bib style file for the Journal of Statistical Software) as
      well as \file{RJournal.bib} and \file{Rnews.bib}, and
      \command{R CMD} ensures that the \file{.bst} and \file{.bib} files
      are found by BibTeX.

      \item Functions using the \env{TAR} environment variable no longer
      quote the value when making \code{system} calls.  This allows
      values such as \samp{tar --force-local}, but does require
      additional quotes in, e.g., \code{TAR = "'/path with spaces/mytar'"}.
    }
  }

  \subsection{DEPRECATED & DEFUNCT}{
    \itemize{
      \item Supplying the parser with a character string containing both
       octal/hex and Unicode escapes is now an error.

      \item File extension \file{.C} for C++ code files in packages is
      now defunct.

      \item \command{R CMD check} no longer supports configuration
      files containing Perl configuration variables: use the environment
      variables documented in \sQuote{R Internals} instead.

      \item The \code{save} argument of \code{require()} now defaults to
      \code{FALSE} and \code{save = TRUE} is now deprecated.  (This
      facility is very rarely actually used, and was superseded by the
      \samp{Depends} field of the \file{DESCRIPTION} file long ago.)

      \item \command{R CMD check --no-latex} is deprecated in favour of
      \option{--no-manual}.

      \item \command{R CMD Sd2Rd} is formally deprecated and will be
      removed in \R 2.13.0.
    }
  }
  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item \code{install.packages()} has a new argument
       \code{libs_only} to optionally pass \option{--libs-only} to
       \command{R CMD INSTALL} and works analogously for Windows binary
       installs (to add support for 64- or 32-bit Windows).

      \item When sub-architectures are in use, the installed
       architectures are recorded in the \code{Archs} field of the
       \file{DESCRIPTION} file.  There is a new default filter,
       \code{"subarch"}, in \code{available.packages()} to make use of
       this.

       Code is compiled in a copy of the \file{src} directory when a
       package is installed for more than one sub-architecture: this
       avoid problems with cleaning the sources between building
       sub-architectures.

      \item \command{R CMD INSTALL --libs-only} no longer overrides the
       setting of locking, so a previous version of the package will be
       restored unless \option{--no-lock} is specified.
    }
  }
  \subsection{UTILITIES}{
    \itemize{
      \item \command{R CMD Rprof|build|check} are now based on \R rather
       than Perl scripts.  The only remaining Perl scripts are the
       deprecated \command{R CMD Sd2Rd} and \code{install-info.pl} (used
       only if \code{install-info} is not found) as well as some
       maintainer-mode-only scripts.

       \strong{NB:} because these have been completely rewritten, users
       should not expect undocumented details of previous
       implementations to have been duplicated.

       \command{R CMD} no longer manipulates the environment variables
       \env{PERL5LIB} and \env{PERLLIB}.

      \item \command{R CMD check} has a new argument \option{--extra-arch}
       to confine tests to those needed to check an additional
       sub-architecture.

       Its check for \dQuote{Subdirectory 'inst' contains no files} is
       more thorough: it looks for files, and warns if there are only
       empty directories.

       Environment variables such as \env{R_LIBS} and those used for
       customization can be set for the duration of checking \emph{via} a file
       \file{~/.R/check.Renviron} (in the format used by
       \file{.Renviron}, and with sub-architecture specific versions
       such as \file{~/.R/check.Renviron.i386} taking precedence).

       There are new options \option{--multiarch} to check the package
       under all of the installed sub-architectures and
       \option{--no-multiarch} to confine checking to the
       sub-architecture under which \command{check} is invoked.  If
       neither option is supplied, a test is done of installed
       sub-architectures and all those which can be run on the current
       OS are used.

       Unless multiple sub-architectures are selected, the install done
       by \code{check} for testing purposes is only of the current
       sub-architecture (\emph{via} \command{R CMD INSTALL --no-multiarch}).

       It will skip the check for non-ascii characters in code or data
       if the environment variables \env{_R_CHECK_ASCII_CODE_} or
       \env{_R_CHECK_ASCII_DATA_} are respectively set to \env{FALSE}.
       (Suggestion of Vince Carey.)

      \item \command{R CMD build} no longer creates an \file{INDEX} file
       (\command{R CMD INSTALL} does so), and \option{--force} removes
       (rather than overwrites) an existing \file{INDEX} file.

       It supports a file \file{~/.R/build.Renviron} analogously to
       \command{check}.

       It now runs build-time \samp{\Sexpr} expressions in help files.

      \item \command{R CMD Rd2dvi} makes use of \code{tools::texi2dvi()}
       to process the package manual.  It is now implemented entirely in
       \R (rather than partially as a shell script).

      \item \command{R CMD Rprof} now uses \code{utils::summaryRprof()}
       rather than Perl.  It has new arguments to select one of the
       tables and to limit the number of entries printed.

      \item \command{R CMD Sweave} now runs \R with \option{--vanilla} so
       the environment setting of \env{R_LIBS} will always be used.
    }
  }
  \subsection{C-LEVEL FACILITIES}{
    \itemize{
      \item \code{lang5()} and \code{lang6()} (in addition to
       pre-existing \code{lang[1-4]()}) convenience functions for easier
       construction of \code{eval()} calls.  If you have your own
       definition, do wrap it inside \code{#ifndef lang5 .... #endif}
       to keep it working with old and new \R.

      \item Header \file{R.h} now includes only the C headers it itself needs,
       hence no longer includes \code{errno.h}.  (This helps avoid problems
       when it is included from C++ source files.)

      \item Headers \file{Rinternals.h} and \file{R_ext/Print.h} include
       the C++ versions of \file{stdio.h} and \file{stdarg.h}
       respectively if included from a C++ source file.
    }
  }

  \subsection{INSTALLATION}{
    \itemize{
      \item A C99 compiler is now required, and more C99 language features
       will be used in the \R sources.

      \item Tcl/Tk >= 8.4 is now required (increased from 8.3).

      \item System functions \code{access}, \code{chdir} and
       \code{getcwd} are now essential to configure \R.  (In practice
       they have been required for some time.)

      \item \command{make check} compares the output of the examples
       from several of the base packages to reference output rather than
       the previous output (if any).  Expect some differences due to
       differences in floating-point computations between platforms.

      \item File \file{NEWS} is no longer in the sources, but generated as
      part of the installation.  The primary source for changes is now
      \file{doc/NEWS.Rd}.

      \item The \code{popen} system call is now required to build \R.
      This ensures the availability of \code{system(intern = TRUE)},
      \code{pipe()} connections and printing from \code{postscript()}.

      \item The \command{pkg-config} file \file{libR.pc} now also works
      when \R is installed using a sub-architecture.

      \item \R has always required a BLAS that conforms to IE60559
      arithmetic, but after discovery of more real-world problems caused
      by a BLAS that did not, this is tested more thoroughly in this
      version.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item Calls to \code{selectMethod()} by default no longer cache
       inherited methods.  This could previously corrupt methods used by
       \code{as()}.

      \item The densities of non-central chi-squared are now more accurate
       in some cases in the extreme tails,
       e.g.\sspace{}\code{dchisq(2000, 2, 1000)},
       as a series expansion was truncated too early.
       (\PR{14105})

      \item \code{pt()} is more accurate in the left tail for \code{ncp}
       large, e.g.\sspace{}\code{pt(-1000, 3, 200)}.  (\PR{14069})

      \item The default C function (\code{R_binary}) for binary ops now
       sets the S4 bit in the result if either argument is an S4 object.
       (\PR{13209})

      \item \code{source(echo=TRUE)} failed to echo comments that
       followed the last statement in a file.

      \item S4 classes that contained one of \code{"matrix"},
       \code{"array"} or \code{"ts"} and also another class now accept
       superclass objects in \code{new()}.  Also fixes failure to call
       \code{validObject()} for these classes.

      \item Conditional inheritance defined by argument \code{test} in
       \code{methods::setIs()} will no longer be used in S4 method
       selection (caching these methods could give incorrect results).
       See \code{?setIs}.

      \item The signature of an implicit generic is now used by
       \code{setGeneric()} when that does not use a definition nor
       explicitly set a signature.

      \item A bug in \code{callNextMethod()} for some examples with
       \code{"..."} in the arguments has been fixed.  See file
       \file{src/library/methods/tests/nextWithDots.R} in the sources.

      \item \code{match(x, table)} (and hence \code{\%in\%}) now treat
      \code{"POSIXlt"} consistently with, e.g., \code{"POSIXct"}.

      \item Built-in code dealing with environments (\code{get()},
      \code{assign()}, \code{parent.env()}, \code{is.environment()} and
      others) now behave consistently to recognize S4 subclasses;
      \code{is.name()} also recognizes subclasses.

      \item The \code{abs.tol} control parameter to \code{nlminb()}
      now defaults to \code{0.0} to avoid false declarations of
      convergence in objective functions that may go negative.

      \item The standard Unix-alike termination dialog to ask whether to
      save the workspace takes a EOF response as \code{n} to avoid
      problems with a damaged terminal connection.  (\PR{14332})

      \item Added \code{warn.unused} argument to \code{hist.default()}
      to allow suppression of spurious warnings about graphical
      parameters used with \code{plot=FALSE}.  (\PR{14341})

      \item \code{predict.lm()}, \code{summary.lm()}, and indeed
      \code{lm()} itself had issues with residual DF in zero-weighted
      cases (the latter two only in connection with empty
      models). (Thanks to Bill Dunlap for spotting the
      \code{predict()} case.)

      \item \code{aperm()} treated \code{resize = NA} as \code{resize =
      TRUE}.

      \item \code{constrOptim()} now has an improved convergence
      criterion, notably for cases where the minimum was (very close to)
      zero; further, other tweaks inspired from code proposals by Ravi
      Varadhan.

      \item Rendering of S3 and S4 methods in man pages has been
      corrected and made consistent across output formats.

      \item Simple markup is now allowed in \samp{\title} sections
      in \file{.Rd} files.

      \item The behaviour of \code{as.logical()} on factors (to use the
      levels) was lost in \R 2.6.0 and has been restored.

      \item \code{prompt()} did not backquote some default arguments in
      the \samp{\usage} section.  (Reported by Claudia Beleites.)

      \item \code{writeBin()} disallows attempts to write 2GB or
      more in a single call. (\PR{14362})

      \item \code{new()} and \code{getClass()} will now work if Class
      is a subclass of \code{"classRepresentation"} and should also be
      faster in typical calls.

      \item The \code{summary()} method for data frames makes a better
      job of names containing characters invalid in the current locale.

      \item \code{[[} sub-assignment for factors could create an invalid
      factor (reported by Bill Dunlap).

      \item \code{Negate(f)} would not evaluate argument \code{f}
      until first use of returned function (reported by Olaf Mersmann).

      \item \code{quietly=FALSE} is now also an optional argument of
      \code{library()}, and consequently, \code{quietly} is now
      propagated also for loading dependent packages, e.g., in
      \code{require(*, quietly=TRUE)}.

      \item If the loop variable in a \code{for} loop was deleted, it
      would be recreated as a global variable.  (Reported by Radford
      Neal; the fix includes his optimizations as well.)

      \item Task callbacks could report the wrong expression when
      the task involved parsing new code. (\PR{14368})

      \item \code{getNamespaceVersion()} failed; this was an
      accidental change in 2.11.0. (\PR{14374})

      \item \code{identical()} returned \code{FALSE} for external
      pointer objects even when the pointer addresses were the same.

      \item \code{L$a@x[] <- val} did not duplicate in a case it should have.

      \item \code{tempfile()} now always gives a random file name (even
      if the directory is specified) when called directly after
      startup and before the \R RNG had been used.  (\PR{14381})

      \item \code{quantile(type=6)} behaved inconsistently.  (\PR{14383})

      \item \code{backSpline(.)} behaved incorrectly when the knot
      sequence was decreasing.  (\PR{14386})

      \item The reference BLAS included in \R was assuming that
      \code{0*x} and \code{x*0} were always zero (whereas they could be
      \code{NA} or \code{NaN} in IEC 60559 arithmetic).  This was seen
      in results from \code{tcrossprod}, and for example that
      \code{log(0) \%*\% 0} gave \code{0}.

      \item The calculation of whether text was completely outside
      the device region (in which case, you draw nothing)
      was wrong for screen devices (which have [0, 0] at top-left).
      The symptom was (long) text disappearing when
      resizing a screen window (to make it smaller).  (\PR{14391})

      \item \code{model.frame(drop.unused.levels = TRUE)} did not
      take into account \code{NA} values of factors when deciding to
      drop levels. (\PR{14393})

      \item \code{library.dynam.unload} required an absolute path for
      \code{libpath}.  (\PR{14385})

      Both \code{library()} and \code{loadNamespace()} now record
      absolute paths for use by \code{searchpaths()} and
      \code{getNamespaceInfo(ns, "path")}.

      \item The self-starting model \code{NLSstClosestX} failed if some
      deviation was exactly zero.  (\PR{14384})

      \item \code{X11(type = "cairo")} (and other devices such as
      \code{png} using cairographics) and which use Pango font selection
      now work around a bug in Pango when very small fonts (those with
      sizes between 0 and 1 in Pango's internal units) are requested.
      (\PR{14369})

      \item Added workaround for the font problem with \code{X11(type =
      "cairo")} and similar on Mac OS X whereby italic and bold styles
      were interchanged.  (\PR{13463} amongst many other reports.)

      \item \code{source(chdir = TRUE)} failed to reset the working
      directory if it could not be determined -- that is now an error.

      \item Fix for crash of \code{example(rasterImage)} on
      \code{x11(type="Xlib")}.

      \item Force Quartz to bring the on-screen display up-to-date
      immediately before the snapshot is taken by \code{grid.cap()}
      in the Cocoa implementation. (\PR{14260})

      \item \code{model.frame} had an unstated 500 byte limit on
      variable names.  (Example reported by Terry Therneau.)

      \item The 256-byte limit on names is now documented.

      \item Subassignment by \code{[}, \code{[[} or \code{$} on an
      expression object with value \code{NULL} coerced the object to a
      list.
    }
  }
}


\section{\Rlogo CHANGES IN R VERSION 2.11.1 patched}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{install.packages()} has a new optional argument
      \code{INSTALL_opts} which can be used to pass options to
      \command{R CMD INSTALL} for source-package installs.

      \item \command{R CMD check} now runs the package-specific tests
      with \env{LANGUAGE=en} to facilitate comparison to
      \file{.Rout.save} files.

      \item \code{sessionInfo()} gives more detailed platform
      information, including 32/64-bit and the sub-architecture if one
      is used.
    }
  }

  \subsection{DEPRECATED & DEFUNCT}{
    \itemize{
      \item The use of Perl configuration variables for \command{R CMD
	check} (as previously documented in \sQuote{Writing R
	Extensions}) is deprecated and will be removed in \R 2.12.0.  Use
      the environment variables documented in \sQuote{R Internals}
      instead.
    }
  }

  \subsection{BUG FIXES}{
    \itemize{
      \item \command{R CMD Rd2dvi} failed if run from a path containing
       space(s).  This also affected \command{R CMD check}, which calls
       \command{Rd2dvi}.

      \item \code{stripchart()} could fail with an empty factor
      level.  (\PR{14317})

      \item Text help rendering of \samp{\tabular\{\}} has been
      improved: under some circumstances leading blank columns were
      not rendered.

      \item \code{strsplit(x, fixed=TRUE)} marked UTF-8 strings with the
      local encoding when no splits were found.

      \item \code{weighted.mean(NA, na.rm=TRUE)} and similar now returns
      \code{NaN} again, as it did prior to \R 2.10.0.

      \item \command{R CMD} had a typo in its detection of whether the
      environment variable \env{TEXINPUTS} was set (reported by Martin
      Morgan).

      \item The command-line parser could mistake
      \option{--file=size...} for one of the options for setting limits
      for Ncells or Vcells.

      \item The internal \code{strptime()} could corrupt its copy of the
      timezone which would then lead to spurious warnings. (\PR{14338})

      \item \code{dir.create(recursive = TRUE)} could fail if one of the
      components existed but was a directory on a read-only file system.
      (Seen on Solaris, where the error code returned is not even listed
      as possible on the man page.)

      \item The \code{postscript()} and \code{pdf()} devices will now
      allow \code{lwd} values less than 1 (they used to force such
      values to be 1).

      \item Fixed font face for CID fonts in \code{pdf()} graphics output.
      (\PR{14326})

      \item \code{GERaster()} now checks for width or height of zero and
      does nothing in those cases; previously the behaviour was
      undefined, probably device-specific, and possibly dangerous.

      \item \code{wilcox.test(x, y, conf.int = TRUE)} failed with an unhelpful
      message if \code{x} and \code{y} were constant vectors, and
      similarly in the one-sample case.  (\PR{14329})

      \item Improperly calling \code{Recall()} from outside a function
      could cause a segfault.  (Reported by Robert McGehee.)

      \item \samp{\Sexpr[result=rd]} in an Rd file added a
      spurious newline, which was displayed as extra whitespace when
      rendered.

      \item \code{require(save = TRUE)} recorded the names of packages
      it failed to load.

      \item \code{packageStatus()} could return a data frame with
      duplicate row names which could then not be printed.

      \item \code{txtProgressBar(style = 2)} did not work correctly.

      \code{txtProgressBar(style = 3)} did not display until a
      non-minimum value was set.

      \item \code{contour()} did not display dashed line types
      properly when contour lines were labelled. (Reported by
      David B. Thompson.)

      \item \code{tools::undoc()} again detects undocumented data
      objects.  Of course, this also affects \command{R CMD check}.

      \item \code{ksmooth(x,NULL)} no longer segfaults.

      \item \code{approxfun()}, \code{approx()}, \code{splinefun()}
      and \code{spline()} could be confused by \code{x} values that
      were different but so close as to print identically.
      (\PR{14377})
    }
  }
}


\section{\Rlogo CHANGES IN R VERSION 2.11.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item \command{R CMD INSTALL} checks if dependent packages are
       available early on in the installation of source packages,
       thereby giving clearer error messages.

      \item \command{R CMD INSTALL --build} now names the file in the
       format used for Mac OS X binary files on that platform.

       \item \code{BIC()} in package \pkg{stats4} now also works with
       multiple fitted models, analogously to \code{AIC()}.
    }
  }
  \subsection{DEPRECATED & DEFUNCT}{
    \itemize{
      \item Use of file extension \file{.C} for C++ code in packages is now
       deprecated: it has caused problems for some \command{make}s on
       case-insensitive file systems (although it currently works
       with the recommended toolkits).
    }
  }
  \subsection{INSTALLATION}{
    \itemize{
      \item Command \command{gnutar} is preferred to \command{tar}
       when configure sets \env{TAR}.  This is needed on Mac OS 10.6,
       where the default \code{tar}, \code{bsdtar 2.6.2}, has been
       reported to produce archives with illegal extensions to tar
       (according to the POSIX standard).
    }
  }
  \subsection{BUG FIXES}{
    \itemize{
      \item The C function \code{mkCharLenCE} now no longer reads past
       \code{len} bytes (unlikely to be a problem except in user
       code).  (\PR{14246})

      \item On systems without any default \env{LD_LIBRARY_PATH} (not
       even \file{/usr/local/lib}), \env{[DY]LIB_LIBRARY_PATH} is now
       set without a trailing colon.  (\PR{13637})

      \item More efficient implementation of \code{utf8ToInt()} on long
       multi-byte strings with many multi-byte characters.  (\PR{14262})

      \item \code{aggregate.ts()} gave platform-dependent results due to
       rounding error for \code{ndeltat != 1}.

      \item \code{package.skeleton()} sometimes failed to fix filenames
        for \file{.R} or \file{.Rd} files to start with an alphanumeric.
        (\PR{14253})

	It also failed when only an S4 class without any methods was
        defined.  (\PR{14280})

      \item \code{splinefun(method = "monoH.FC")} was not
      quite monotone in rare cases.  (\PR{14215})

      \item \code{Rhttpd} no longer crashes due to \code{SIGPIPE} when
       the client closes the connection prematurely.  (\PR{14266})

      \item \code{format.POSIXlt()} could cause a stack overflow and
        crash when used on very long vectors.  (\PR{14267})

      \item \code{Rd2latex()} incorrectly escaped special characters in
      \samp{\usage} sections.

      \item \code{mcnemar.test()} could alter the levels (dropping
       unused levels) if passed \code{x} and \code{y} as factors
       (reported by Greg Snow).

      \item \command{Rd2pdf} sometimes needed a further
       \command{pdflatex} pass to get hyperlinked pages correct.

      \item \code{interaction()} produced malformed results when levels were
        duplicated, causing segfaults in \code{split()}.

      \item \code{cut(d, breaks = <n>)} now also works for \code{"Date"}
        or \code{"POSIXt"} argument \code{d}.
        (\PR{14288})

      \item \code{memDecompress()} could decompress incompletely rare
       \code{xz}-compressed input due to incorrect documentation of
       \command{xz utils}.  (Report and patch from Olaf Mersmann.)

      \item The S4 \code{initialize()} methods for \code{"matrix"},
        \code{"array"}, and \code{"ts"} have been fixed to call
        \code{validObject()}.  (\PR{14284})

      \item \command{R CMD INSTALL} now behaves the same way with or
       without \option{--no-multiarch} on platforms with only one
       installed architecture.  (It used to clean the \file{src}
       directory without \option{--no-multiarch}.)

      \item \code{[<-.data.frame} was not quite careful enough in
        assigning (and potentially deleting) columns
        right-to-left.  (\PR{14263})

      \item \code{rbeta(n, a, b)} no longer occasionally returns
       \code{NaN} for \code{a >> 1 > b}.  (\PR{14291})

      \item \code{pnorm(x, log.p = TRUE)} could return \code{NaN} not
       \code{-Inf} for \code{x} near (minus for \code{lower.tail=TRUE})
       the largest representable number.

      \item Compressed data files \file{*.(txt|tab|csv).(gz|bz2|xz)}
       were not recognized for the list of data topics and hence for
       packages using \code{LazyData}.  (\PR{14273})

      \item \code{textConnection()} did an unnecessary translation on
       strings in a foreign encoding (e.g., UTF-8 strings on Windows) and
       so was slower than it could have been on very long input strings.
       (\PR{14286})

      \item \code{tools::Rd2txt()} did not render poorly written Rd
       files consistently with other renderers.

       It computed widths of strings that would be \code{print()}ed with
       escapes incorrectly, for example in the computation of column
       width for \samp{\tabular}.

      \item \code{na.action()} did not extract the \code{na.action}
      component as documented.

      \item \code{do.call()}ing \code{NextMethod} in erroneous ways no
      longer segfaults. (\PR{13487})
    }
  }
}


\section{\Rlogo CHANGES IN R VERSION 2.11.0}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item Packages must have been installed under \R >= 2.10.0, as the
       current help system is the only one now supported.

      \item A port to 64-bit Windows is now available as well as binary
       package repositories: see the \sQuote{R Administration and
       Installation Manual}.

      \item Argument matching for primitive functions is now done in the
       same way as for interpreted functions except for the deliberate
       exceptions
       \preformatted{
	 call switch .C .Fortran .Call .External
       }
       all of which use positional matching for their first argument,
       and also some internal-use-only primitives.

      \item The default device for command-line \R at the console on Mac OS X
       is now \code{quartz()} and not \code{X11()}.
    }
  }
  \subsection{NEW FEATURES}{
    \itemize{
      \item The \code{open} modes for connections are now interpreted
       more consistently.  \code{open = "r"} is now equivalent to
       \code{open = "rt"} for all connections.  The default \code{open =
       ""} now means \code{"rt"} for all connections except the
       compressed-file connections \code{gzfile()}, \code{bzfile()} and
       \code{xzfile()} for which it means \code{"rb"}.

      \item \command{R CMD INSTALL} now uses the internal \code{untar()}
       function in package \pkg{utils}: this ensures that all platforms
       can install \command{bzip2}- and \command{xz}-compressed
       tarballs.  In case this causes problems (as it has on some
       Windows file systems when run from Cygwin tools) it can be
       overridden by the environment variable \env{R_INSTALL_TAR}:
       setting this to a modern external tar program will speed up
       unpacking of large (tens of Mb or more) tarballs.

      \item \code{help(try.all.packages = TRUE)} is much faster
       (although the time taken by the OS to find all the packages the
       first time it is used can dominate the time).

      \item \command{R CMD check} has a new option \option{--timings}
       to record per-example timings in file
       \file{<pkg>.Rcheck/<pkg>-Ex.timings}.

      \item The TRE library has been updated to version 0.8.0 (minor bugfixes).

      \item \code{grep[l]}, \code{[g]sub} and \code{[g]regexpr} now work
       in bytes in an 8-bit locales if there is no marked UTF-8 input
       string: this will be somewhat faster, and for \code{[g]sub()}
       give the result in the native encoding rather than in UTF-8
       (which returns to the behaviour prior to \R 2.10.0).

      \item A new argument \code{skipCalls} has been added to
       \code{browser()} so that it can report the original context when
       called by other debugging functions.

      \item More validity checking of UTF-8 and MBCS strings is done by
       \code{agrep()} and the regular-expression matching functions.

      \item The undocumented restriction on \code{gregexpr()} to
       \code{length(text) > 0} has been removed.

      \item Package \pkg{tcltk} now sends strings to Tcl in UTF-8: this
       means that strings with a marked UTF-8 encoding are supported in
       non-UTF-8 locales.

      \item The graphics engine now supports rendering of raster (bitmap)
       images, though not all graphics devices can provide (full)
       support.  Packages providing graphics devices (e.g., \code{Cairo},
       \code{RSvgDevice}, \code{cairoDevice}) will need to be reinstalled.

       There is also support in the graphics engine for capturing
       raster images from graphics devices (again not supported
       on all graphics devices).

      \item \command{R CMD check} now also checks if the package and
       namespace can be unloaded: this provides a check of the
       \code{.Last.lib()} and \code{.onUnload()} hook functions (unless
       \option{--install=fake}).

      \item \code{prop.table(x)} now accepts a one-dimensional table for
      \code{x}.

      \item A new function \code{vapply()} has been added, based on a
       suggestion from Bill Dunlap.  It requires that a template for the
       function value be specified, and uses it to determine the output
       type and to check for consistency in the function values.

      \item The main HTML help page now links to a reformatted copy of
       this \file{NEWS} file.  (Suggested by Henrik Bengtsson.)  Package
       index files link to the package \file{DESCRIPTION} and
       \file{NEWS} files and a list of demos when using dynamic help.

      \item The \code{[} method for class \code{"AsIs"} allows the next
       method to change the underlying class.  (Wish of Jens
       Oehlschlägel.)

      \item \code{write.csv[2]} no longer allow argument \code{append}
       to be changed: as ever, direct calls to \code{write.table()} give
       more flexibility as well as more room for error.

      \item The index page for HTML help for a package now collapses
       multiple signatures for S4 methods into a single entry.

      \item The use of \code{.required} by \code{require()} and
       \code{detach()} has been replaced by \code{.Depends} which is set
       from the \code{Depends} field of a package (even in packages with
       namespaces).  By default \code{detach()} prevents such
       dependencies from being detached: this can be overridden by the
       argument \code{force}.

      \item \code{bquote()} has been extended to work on function
       definitions.  (Wish of
       \PR{14031}).

      \item \code{detach()} when applied to an object other than a
       package returns the environment that has been detached, to
       parallel \code{attach()}.

      \item \code{readline()} in non-interactive use returns \code{""}
       and does not attempt to read from the \sQuote{terminal}.

      \item New function \code{file_ext()} in package \pkg{tools}.

      \item \code{xtfrm()} is now primitive and internally generic, as
       this allows S4 methods to be set on it without name-space scoping
       issues.

       There are now \code{"AsIs"} and \code{"difftime"} methods, and
       the default method uses \code{unclass(x)} if \code{is.numeric(x)}
       is true (which will be faster but relies on \code{is.numeric()}
       having been set correctly for the class).

      \item \code{is.numeric(x)} is now false for a \code{"difftime"}
       object (multiplication and division make no sense for such
       objects).

      \item The default method of \code{weighted.mean(x, w)} coerces
       \code{w} to be numeric (aka double); previously only integer
       weights were coerced.  Zero weights are handled specially so an
       infinite value with zero weight does not force an \code{NaN}
       result.

       There is now a \code{"difftime"} method.

      \item \code{bug.report()} now has arguments \code{package} and
       \code{lib.loc} to generate bug reports about packages.  When
       this is used, it looks for a \code{BugReports} field in the
       package \file{DESCRIPTION} file, which will be assumed to be a
       URL at which to submit the report, and otherwise generates an
       email to the package maintainer.  (Suggested by Barry
       Rowlingson.)

      \item \code{quantile()} now has a method for the date-time class
       \code{"POSIXt"}, and types 1 and 3 (which never interpolate) work
       for Dates and ordered factors.

      \item \code{length(<POSIXlt>)} now returns the length of the
       corresponding abstract timedate-vector rather than always 9 (the
       length of the underlying list structure).  (Wish of \PR{14073}
       and \PR{10507}.)

      \item The \code{readline} completion backend no longer sorts
       possible completions alphabetically (e.g., function argument
       names) if \R was built with \code{readline >= 6}.

      \item \code{select.list()} gains a \code{graphics} argument to
       allow Windows/Mac users to choose the text interface.  This
       changes the behaviour of \code{new.packages(ask=TRUE)} to be like
       \code{update.packages(ask=TRUE)} on those platforms in using a
       text menu: use ask=\code{"graphics"} for a graphical menu.

      \item New function \code{chooseBioCmirror()} to set the
      \code{"BioC_mirror"} option.

      \item The \R grammar now prevents using the argument \code{name}
       in signatures of S4 methods for \code{$} and \code{$<-}, since
       they will always be called with a character string value for
       \code{name}.  The implicit S4 generic functions have been
       changed to reflect this: packages which included \code{name} in
       the signature of their methods need to be updated and
       re-installed.

      \item The handling of the \code{method} argument of \code{glm()}
       has been refined following suggestions by Ioannis Kosmidis and
       Heather Turner.

      \item \code{str()} gains a new argument \code{list.len} with
       default 99, limiting the number of \code{list()} items (per
       level), thanks to suggestions from David Winsenius.

      \item Having formal arguments of an S4 method in a different order
       from the generic is now an error (the warning having been
       ignored by some package maintainers for a long time).

      \item New functions \code{enc2native()} and \code{enc2utf8()}
       convert character vectors with possibly marked encodings to the
       current locale and UTF-8 respectively.

      \item Unrecognized escapes and embedded nuls in character strings are
       now an error, not just a warning.  Thus option \code{"warnEscapes"}
       is no longer needed.  \code{rawToChar()} now removes trailing nuls
       silently, but other embedded nuls become errors.

      \item Informational messages about masked objects displayed when a
       package is attached are now more compact, using \code{strwrap()}
       instead of one object per line.

      \item \code{print.rle()} gains argument \code{prefix}.

      \item \code{download.file()} gains a \code{"curl"} method, mainly
       for use on platforms which have \command{curl} but not
       \command{wget}, but also for some hard-to-access URLs.

      \item In \code{Rd}, \samp{\eqn} and \samp{\deqn} will render in
       HTML (and convert to text) upper- and lower-case Greek letters
       (entered as \samp{\alpha} \dots), \samp{\ldots}, \samp{\dots},
       \samp{\ge} and \samp{\le}.

      \item \code{utf8ToInt()} and \code{intToUtf8()} now map \code{NA} inputs
      to \code{NA} outputs.

      \item \code{file()} has a new argument \code{raw} which may help
       if it is used with something other than a regular file, e.g.\sspace{}a
       character device.

      \item New function \code{strtoi()}, a wrapper for the C function
      \code{strtol}.

      \item \code{as.octmode()} and \code{as.hexmode()} now allow inputs
       of length other than one.

       The \code{format()} and \code{print()} methods for
       \code{"octmode"} now preserve names and dimensions (as those for
       \code{"hexmode"} did).

       The \code{format()} methods for classes \code{"octmode"} and
       \code{"hexmode"} gain a \code{width} argument.

      \item \code{seq.int()} returns an integer result in some further cases
       where \code{seq()} does, e.g.\sspace{}\code{seq.int(1L, 9L, by = 2L)}.

      \item Added \samp{\subsection\{\}\{\}} macro to Rd syntax, for
       subsections within sections.

      \item n-dimensional arrays with dimension names can now be indexed
       by an n-column character matrix.  The indices are matched against
       the dimension names.  \code{NA} indices are propagated to the
       result.  Unmatched values and \code{""} are not allowed and
       result in an error.

      \item \code{interaction(drop=TRUE)} uses less memory (related to
      \PR{14121}).

      \item \code{summary()} methods have been added to the
       \code{"srcref"} and \code{"srcfile"} classes, and various
       encoding issues have been cleaned up.

      \item If option \code{"checkPackageLicense"} is set to \code{TRUE} (not
       currently the default), users will be asked to agree to
       non-known-to-be-FOSS package licences at first use.

      \item Checking \code{setAs(a, b)} methods only gives a message
       instead of a warning, when one of \code{a} or \code{b} is
       unknown.

      \item New function \code{norm()} to compute a matrix norm.
       \code{norm()} and also \code{backsolve()} and \code{sample()}
       have implicit S4 generics.

      \item Files \file{Renviron.site} and \file{Rprofile.site} can have
       architecture-specific versions on systems with sub-architectures.

      \item \command{R CMD check} now (by default) also checks Rd files
       for auto-generated content in need of editing, and missing
       argument descriptions.

      \item \code{aggregate()} gains a formula method thanks to a
       contribution by Arni Magnusson.  The data frame method now allows
       summary functions to return arbitrarily many values.

      \item \code{path.expand()} now propagates \code{NA} values rather
       than converting them to \code{"NA"}.

      \item \code{file.show()} now disallows \code{NA} values for file names,
       headers, and pager.

      \item The \sQuote{fuzz} used by \code{seq()} and \code{seq.int()} has
       been reduced from \code{1e-7} to \code{1e-10}, which should be
       ample for the double-precision calculations used in \R.  It
       ensures that the fuzz never comes into play with sequences of
       integers (wish of \PR{14169}).

      \item The default value of \code{RSiteSearch(restrict=)} has been
       changed to include vignettes but to exclude R-help.  The R-help
       archives available have been split, with a new option of
       \code{"Rhelp10"} for those from 2010.

      \item New function \code{rasterImage()} in the \code{graphics}
       package for drawing raster images.

      \item \code{stats:::extractAIC.coxph()} now omits aliased terms
       when computing the degrees of freedom (suggestion of Terry
       Therneau).

      \item \code{cor()} and \code{cov()} now test for misuse with
       non-numeric arguments, such as the non-bug report \PR{14207}.

      \item \code{pchisq(ncp =, log.p = TRUE)} is more accurate for
       probabilities near one.  E.g., \code{pchisq(80, 4, ncp=1,
       log.p=TRUE)}.  (Maybe what was meant in \PR{14216}.)

      \item \code{maintainer()} has been added, to give convenient
       access to the name of the maintainer of a package (contributed by
       David Scott).

      \item \code{sample()} and \code{sample.int()} allow zero items to
       be sampled from a zero-length input.  \code{sample.int()} gains a
       default value \code{size=n} to be more similar to
       \code{sample()}.

      \item \code{switch()} returned \code{NULL} on error (not
       previously documented on the help page): it now does so
       invisibly, analogously to if-without-else.

       It is now primitive: this means that argument \code{EXPR} is
       always matched to the first argument and there is no danger of
       partial matching to later named arguments.

      \item Primitive functions \code{UseMethod()}, \code{attr()},
       \code{attr<-()}, \code{on.exit()}, \code{retracemem()} and
       \code{substitute()} now use standard argument matching (rather
       than positional matching).  This means that all multi-argument
       primitives which are not internal now use standard argument
       matching except where positional matching is desirable (as for
       \code{switch()}, \code{call()}, \code{.C()} ...).

      \item All the one-argument primitives now check that any name
       supplied for their first argument is a partial match to the
       argument name as documented on the help page: this also
       applies to replacement functions of two arguments.

      \item \code{base::which()} uses a new \code{.Internal} function
       when \code{arr.ind} is \code{FALSE} resulting in a 10x speedup.
       Thanks to Patrick Aboyoun for implementation suggestions.

      \item Help conversion to text now uses the first part of
       \samp{\enc\{\}\{\}} markup if it is representable in the current
       output encoding.  On the other hand, conversion to LaTeX with the
       default \code{outputEncoding = "ASCII"} uses the second part.

      \item A new class \code{"listOfMethods"} has been introduced to
       represent the methods in a methods table, to replace the
       deprecated class \code{"MethodsList"}.

      \item \code{any()} and \code{all()} return early if possible.
       This may speed up operations on long vectors.

      \item \code{strptime()} now accepts \code{"\%z"} (for the offset
       from UTC in the RFC822 format of \code{+/-hhmm}).

      \item The PCRE library has been updated to version 8.02, a bug-fix
       release which also updates tables to Unicode 5.02.

      \item Functions which may use a graphical \code{select.list()}
       (including \code{menu()} and \code{install.packages()}) now check
       on a Unix-alike that Tk can be started (and not just
       \code{capabilities("tcltk") && capabilities("X11")}).

      \item The parser no longer marks strings containing octal or hex
       escapes as being in UTF-8 when entered in a UTF-8 locale.

      \item On platforms with cairo but not Pango (notably Mac OS X) the
       initial default \code{X11()} type is set to \code{"Xlib"}: this avoids
       several problems with font selection when done by cairo rather
       than Pango (at least on Mac OS X).

      \item New function \code{arrayInd()} such that \code{which(x,
       arr.ind = TRUE)} for an array 'x' is now equivalent to
       \code{arrayInd(which(x), dim(x), dimnames(x))}.
    }
  }
  \subsection{DEPRECATED & DEFUNCT}{
    \itemize{
      \item Bundles of packages are defunct.

      \item \code{stats::clearNames()} is defunct: use \code{unname()}.

      \item Basic regular expressions are defunct, and
       \code{strsplit()}, \code{grep()}, \code{grepl()}, \code{sub()},
       \code{gsub()}, \code{regexpr()} and \code{gregexpr()} no longer
       have an \code{extended} argument.

      \item \code{methods::trySilent()} is defunct.

      \item \code{index.search()} (which was deprecated in 2.10.0) is no
       longer exported and has a different argument list.

      \item Use of multiple arguments to \code{return()} is now defunct.

      \item The use of \code{UseMethod()} with more than two arguments
      is now defunct.

      \item In the \pkg{methods} package, the \code{"MethodsList"}
       metadata objects which had been superseded by hash tables
       (environments) since \R 2.8.0 are being phased out.  Objects of
       this class are no longer assigned or used as metadata by the
       package.

       \code{getMethods()} is now deprecated, with its internal use replaced
       by \code{findMethods()} and other changes.  Creating objects from the
       \code{"MethodsList"} class is also deprecated.

      \item Parsing strings containing both octal/hex and Unicode escapes
       now gives a warning and will become an error in \R 2.12.0.
    }
  }
  \subsection{INSTALLATION}{
    \itemize{
      \item UTF-8 is now used for the reference manual and package
       manuals.  This requires LaTeX \sQuote{2005/12/01} or later.

      \item \command{configure} looks for a POSIX compliant
       \command{tr}, Solaris's \command{/usr/ucb/tr} having been found
       to cause \command{Rdiff} to malfunction.

      \item \command{configure} is now generated with \command{autoconf
       2.65}, which works better on recent systems and on Mac OS X.
    }
  }
  \subsection{PACKAGE INSTALLATION}{
    \itemize{
      \item Characters in \R source which are not translatable to the
       current locale are now handled more tolerantly:  these will be
       converted to hex codes with a warning.  Such characters are
       only really portable if they appear in comments.

      \item \command{R CMD INSTALL} now tests that the installed package
       can be loaded (and backs out the installation if it cannot): this
       can be suppressed by \option{--no-test-load}.  This avoids
       installing/updating a package that cannot be used: common causes
       of failures to load are missing/incompatible external software
       and missing/broken dependent packages.

      \item Package installation on Windows for a package with a
       \file{src} directory now checks if a DLL is created unless there
       is a \file{src/Makefile.win} file: this helps catch broken
       installations where the toolchain has not reported problems in
       building the DLL.  (Note: this can be any DLL, not just one named
       \file{<pkg-name>.dll}.)
     }
  }
  \subsection{BUG FIXES}{
    \itemize{

      \item Using \code{with()}, \code{eval()} etc with a list with some
      unnamed elements now works.
      (\PR{14035})

      \item The \code{"quick"} dispatch of S4 methods for primitive
       functions was not happening, forcing a search each time.
       (Dispatch for closures was not affected.)  A side effect is that
       default values for arguments in a method that do not have
       defaults in the generic will now be ignored.

      \item Trying to dispatch S4 methods for primitives during the search
       for inherited methods slows that search down and potentially
       could cause an infinite recursion.  An internal switch was
       added to turn off all such methods from
       \code{findInheritedMethods()}.

      \item \R framework installation (on Mac OS X) would not work
       properly if a rogue \code{Resources} directory was present at the
       top level.  Such a non-symlink will now be renamed to
       \code{Resources.old} (and anything previously named
       \code{Resources.old} removed) as part of the framework
       installation process.

      \item The checks for conforming S4 method arguments could fail
       when the signature of the generic function omitted some of the
       formal arguments (in addition to \code{...}).  Arguments omitted
       from the method definition but conforming (per the documentation)
       should now be ignored (treated as \code{"ANY"}) in dispatching.

      \item The computations for S4 method evaluation when \code{...}
       was in the signature could fail, treating \code{...} as an
       ordinary symbol.  This has been fixed, for the known cases.

      \item Various \code{ar()} fitting methods have more protection for
       singular fits.

      \item \code{callNextMethod} now works again with the \code{drop=}
      argument in \samp{[}

      \item \code{parse()} and \code{parse_Rd()} miscounted columns when
       multibyte UTF-8 characters were present.

      \item Formatting of help pages has had minor improvements: extra
       blank lines have been removed from the text format, and empty
       package labels removed from HTML.

      \item \code{cor(A, B)} where \code{A} is \eqn{n \times 1}{n x 1}
       and \code{B} a 1-dimensional array segfaulted or gave an internal
       error.  (The case \code{cor(B, A)} was
       \PR{7116}.)

      \item \code{cut.POSIXt()} applied to a start value after the DST
       transition on a DST-change day could give the wrong time for
       argument \code{breaks} in units of days or longer.  (\PR{14208})

      \item \code{do_par()} \code{UNPROTECT}ed too early  (\PR{14214})

      \item Subassignment \code{x[[....]] <- y} didn't check for a
       zero-length right hand side, and inserted a rubbish
       value.  (\PR{14217})

      \item \code{fisher.test()} no longer gives a P-value \strong{very}
       slightly > 1, in some borderline cases.

      \item Internal function \code{matchArgs()} no longer modifies the
       general purpose bits of the \code{SEXP}s that make up the formals
       list of \R functions.  This fixes an invalid error message that
       would occur when a garbage collection triggered a second call to
       \code{matchArgs} for the same function \emph{via} a finalizer.

      \item \code{gsub()} in 2.10.x could fail from stack overflow for
       extremely long strings due to temporary data being allocated on
       the stack.  Also, \code{gsub()} with \code{fixed=TRUE} is in some
       circumstances considerably faster.

      \item Several primitives, including \code{attributes()},
       \code{attr<-()} \code{interactive()}, \code{nargs()} and
       \code{proc.time()}, did not check that they were called with the
       correct number of arguments.

      \item A potential race condition in \code{list.files()} when other
       processes are operating on the directory has been fixed; the code
       now dynamically allocates memory for file listings in a single
       pass instead of making an initial count pass.

      \item \code{mean(x, trim=, na.rm = FALSE)} failed to return \code{NA} if
       \code{x} contained missing values.  (Reported by Bill Dunlap.)

      \item Extreme tail behavior of, \code{pbeta()} \{and hence
       \code{pf()}\}, e.g., \code{pbeta(x, 3, 2200, lower.tail=FALSE,
       log.p=TRUE)} now returns finite values instead of jumping to
       \code{-Inf} too early.  (\PR{14230}).

      \item \code{parse(text=x)} misbehaved for objects \code{x} that
       were not coerced internally to character, notably symbols.
       (Reported to R-devel by Bill Dunlap.)

      \item The internal C function \code{coerceSymbol} now handles
       coercion to character, and warns if coercion fails (rather than
       silently returning \code{NULL}).  This allows a name to be given
       where a character vector is required in functions which coerce
       internally.

      \item The interpretation by \code{strptime()} of \code{"\%c"} was
       non-standard (not that it is ever advisable to use locale- and
       system-specific input formats).

      \item capabilities(\code{"X11"}) now works the same way on Mac OS X as on
       other platforms (and as documented: it was always true for R
       built with \option{--with-aqua}, as the CRAN builds are).

      \item The \code{X11()} device with cairo but not Pango (notably Mac OS X)
       now checks validity of text strings in UTF-8 locales (since
       Pango does but cairo it seems does not).

      \item \code{read.fwf()} misread multi-line records when n was specified.
       (\PR{14241})

      \item \code{all.equal(tolerance = e)} passes the numeric
       tolerance also to the comparison of the attributes.

      \item \code{pgamma(0, 0)}, a boundary case, now returns 0, its
       limit from the left, rather than the limit from the right.

      \item Issuing \code{POST} requests to the internal web server could stall
       the request under certain circumstances.

      \item \code{gzcon( <textConnection> )}, an error, no longer
       damages the connection (in a way to have it
       segfault).  (\PR{14237})

      \item All the results from \code{hist()} now use the nominal
       \code{breaks} not those adjusted by the numeric \sQuote{fuzz}:
       in recent versions the nominal \code{breaks} were reported but
       the 'density' referred to the intervals used in the calculation
       -- which mattered very slightly for one of the extreme bins.
       (Based on a report by Martin Becker.)

      \item If \code{xy[z].coords} (used internally by many graphics
       functions) are given a list as \code{x}, they now check that
       the list has suitable names and give a more informative error
       message.  (\PR{13936})
    }
  }
}


\section{\Rlogo CHANGES IN R VERSION 2.10.1 patched}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item The handling of line textures in the \code{postscript()} and
       \code{pdf()} devices was set up for round end caps (the only type
       which existed at the time): it has now been adjusted for butt
       endcaps.

      \item \code{lchoose(a, k)} is now defined as
       \code{log(abs(choose(a,k)))}, analogously to \code{lfactorial()}.

      \item Although \code{\\eqn\{\}} in Rd files is defined as a
       \sQuote{verbatim} macro, many packages expected \code{\\dots} and
       \code{\\ldots} to be interpreted there (as was the case in \R <
       2.10.0), so this is now done (using an ellipsis in HTML
       rendering).

      \item Escaping of braces in quoted strings in \R-code sections of
       Rd files is allowed again.  This had been changed for the new Rd
       format in \R 2.10.0 but was only documented on the developer site
       and was handled inconsistently by the converters: text and
       example conversion removed the escapes but HTML conversion did
       not.

      \item The PCRE library has been updated to version 8.01, a bug-fix
       release.

      \item \code{tools::readNEWS()} now accepts a digit as the first
       character of a news section.
    }
  }
  \subsection{BUG FIXES}{
    \itemize{
      \item Using \code{read.table(header=TRUE)} on a header with an
       embedded new line would copy part of the header into the data.
       (\PR{14103})

      \item \code{qpois(p = 1, lambda = 0)} now gives 0 as for all other
      \code{p}.  (\PR{14135})

      \item Functions related to string comparison
       (e.g., \code{unique()}, \code{match()}) could cause crashes when
       used with strings not in the native encoding, e.g., UTF-8 strings
       on Windows.  (\PR{14114} and \PR{14125})

      \item \code{x[ , drop=TRUE]} dropped an \code{NA} level even if it
      was in use.

      \item The dynamic HTML help system reported the wrong MIME type
       for the style sheet.

      \item \code{tools::codoc()} (used by \command{R CMD check}) was
       missing cases where the function had no arguments but was
       documented to have some.

      \item Help links containing special characters (e.g., \code{"?"})
       were not generated correctly when rendered in
       HTML.  (\PR{14155})

      \item \code{lchoose(a, k)} no longer wrongly gives \code{NaN} for
      negative \code{a}.

      \item \code{ks.test()} could give a p-value that was off by one
       observation due to rounding error.  (\PR{14145})

      \item \code{readBin()}/\code{readChar()} when reading millions of
       character strings in a single call used excessive amounts of
       memory (which also slowed them down).

      \item \command{R CMD SHLIB} could fail if used with paths that
       were not alphanumeric, e.g.\sspace{}contained \code{+}.  (\PR{14168})

      \item \code{sprintf()} was not re-entrant, which potentially
       caused problems if an \code{as.character()} method called it.

      \item The \code{quartz()} device did not restore the clipping
       region when filling the background for a new page.  This could be
       observed in multi-page bitmap output as stale outer regions of
       the plot.

      \item \code{p.adjust(method, n)} now works correctly for the
       rare case \code{n > length(p)}, also when method differs from
       \code{"bonferroni"} or \code{"none"}, thanks to a patch from
       Gordon Smyth.

      \item \code{tools::showNonASCII()} failed to detect non-ASCII characters
       if \code{iconv()} (incorrectly) converted them to different ASCII
       characters.  (Seen on Windows only.)

      \item \code{tcrossprod()} wrongly failed in some cases when one of the
       arguments was a vector and the other a matrix.

      \item \code{[cr]bind(..., deparse.level=2)} was not always giving
       names when documented to do so.  (Discovered whilst investigating
       \PR{14189}.)

      \item \code{match(incomparables=<non-NULL>)} could in rare cases
       infinite-loop.

      \item \code{poisson.test()} needed to pass argument
       \code{conf.level} to \code{binom.test()}.  (\PR{14195})

      \item The \code{"nls"} method for \code{df.residual()} gave
       incorrect results for models fitted with \code{na.action =
       na.exclude}.  (\PR{14194})

      \item A change to \code{options(scipen=)} was only implemented
       when printing next occurred, even though it should have affected
       intervening calls to \code{axis()}, \code{contour()} and
       \code{filledcontour()}.

      \item \code{prettyNum(drop0trailing=TRUE)} did not handle signs of
       imaginary parts of complex numbers correctly (and this was used
       by \code{str()}: \PR{14201}).

      \item \code{system.time()} had the \code{sys.child} component
       wrong (copied \code{user.child} instead) on systems with
       \code{HAVE_GETRUSAGE}.
       (\PR{14210})

      \item Changing both line texture and line cap (end) resulted in the
       latter to be omitted form the PDF code.  In addition, line cap
       (end) and join are now set explicitly in PDF output to ensure
       correct defaults.

      \item The suppression of auto-rotation in \code{bitmap()} and
       \code{dev2bitmap()} with the \code{"pdfwrite"} device was not
       working correctly.

      \item \code{plot(ecdf(), log="x")} no longer gives an incorrect
      warning.

      \item \code{read.fwf()} works again when argument \code{file} is
      a connection.

      \item Startup files will now be found if their paths exceed 255
       bytes.  (\PR{14228})

      \item \code{contrasts<-} (in the \pkg{stats} package) no longer has an
       undeclared dependence on \pkg{methods} (introduced in 2.10.0).
    }
  }
}


\section{\Rlogo CHANGES IN R VERSION 2.10.1}{
  \subsection{NEW FEATURES}{
    \itemize{
      \item The PCRE library has been updated to version 8.00.

      \item \command{R CMD INSTALL} has new options \option{--no-R},
      \option{--no-libs}, \option{--no-data}, \option{--no-help},
      \option{--no-demo}, \option{--no-exec}, and \option{--no-inst} to
      suppress installation of the specified part of the package.
      These are intended for special purposes (e.g., building a database
      of help pages without fully installing all packages).

      \item The documented line-length limit of 4095 bytes when reading
      from the console now also applies also to \code{parse(file="")}
      (which previously had a limit of around 1024 bytes).

      \item A Bioconductor mirror can be set for use by
      \code{setRepositories()} \emph{via} the option \code{"BioC_mirror"},
      e.g.\sspace{}the European mirror can be selected by
      \code{options(BioC_mirror="http://bioconductor.statistik.tu-dortmund.de")}.

      \item Double-clicking in a \code{tk_select.list()} list box now
      selects the item and closes the list box (as happens on the
      Windows \code{select.list()} widget).
    }
  }
  \subsection{INSTALLATION}{
    \itemize{
      \item \command{configure} will be able to find a usable
      \code{libtiff} in some rare circumstances where it did not
      previously (where \code{libtiff} needed to be linked explicitly against
      \code{-ljpeg}).

      \item Making \code{refman.pdf} works around a problem with the indexing
      with \code{hyperref 6.79d} and later.
    }
  }
  \subsection{DEPRECATED & DEFUNCT}{
    \itemize{
      \item The \code{extended} argument is deprecated in
      \code{strsplit()}, \code{grep()}, \code{grepl()}, \code{sub()},
      \code{gsub()}, \code{regexpr()} and \code{gregexpr()} (not just
      the value \code{extended = FALSE}) and will be removed in \R
      2.11.0.
    }
  }
  \subsection{BUG FIXES}{
    \itemize{
      \item \code{trigamma(x)} and other \code{psigamma(x, n)} calls
      are now accurate for very large \code{abs(x)}.  (\PR{14020})

      \item \code{[g]sub(perl=FALSE, fixed=FALSE)} could use excessive
      stack space when used with a very long vector containing some
      non-ASCII strings.

      \item The default method of \code{weighted.mean(na.rm = TRUE)}
      did not omit weights for \code{NA} observations in 2.10.0.
      (\PR{14032})

      \item \code{[g]regexpr(pattern, fixed = TRUE)} returned match
      positions in bytes (not characters) in an MBCS locale if
      \code{pattern} was a single byte.

      \code{[g]sub(fixed = TRUE)} with a single-byte pattern could
      conceivably have matched part of a multibyte character in a
      non-UTF-8 MBCS.

      \item \code{findLineNum()} and \code{setBreakpoint()} would
      sometimes fail if the specified file was not in the current
      directory.

      \item Package \pkg{tcltk}'s \code{demo(tkdensity)} was broken in
      2.9.0 when \code{demo()} was changed to set \code{par(ask = TRUE)}.

      \item \code{gsub()} with backrefs could fail on extremely long strings
      (hundreds of thousands of characters) due to integer overflow
      in a length calculation.

      \item \code{abline(untf=TRUE)} now uses a better x-grid in
      log-scale, e.g., for \code{plot(c(1,300), c(1,300), log="xy");
	abline(4,1, untf=TRUE)}.

      \item \code{detach()}/\code{unloadNamespace()} arrange to flush
      the package's lazyload cache of \R objects once the
      package/namespace is no longer needed.

      \item There have been small fixes to the rendering of help,
      e.g.\sspace{}\code{\\command} is now rendered verbatim
      (so e.g.\sspace{}\code{--} is not interpreted, \PR{14045}).

      Also, there are many small changes to help files where the new
      converters were not rendering them in the same way as before.

      \item \code{available.packages()} would fail when run on a
      repository with no packages meeting the filtering conditions.
      (\PR{14042})

      \item \code{rep(x, times, each = 2)} gave invalid results when the
      \code{times} argument was a vector longer than \code{x}.
      Reported by Bill Dunlap.

      \item An error when \code{unloadNamespace()} attempted to run the
      \code{.onUnload()} function gave an error in the reporting
      function and so was not reported properly.

      \item Text help rendering did not handle very long input lines
      properly.

      \item \code{promptMethods()} generated signature documentation
      improperly.

      \item \code{pgamma(x, a, lower.tail=FALSE)} and
      \code{qgamma(\dots)} are now considerably more accurate in some
      regions for very small \code{a}.  \code{qgamma()} now correctly
      returns \code{0} instead of \code{NaN} in similar extreme cases,
      and \code{qgamma()} no longer warns in the case of small
      \code{a}, see (\PR{12324}).

      \item \code{unname()} now also removes names from a zero length vector.

      \item Printing results from \code{ls.str()} no longer evaluates
      unevaluated calls.

      \item \code{complete.cases()} failed on a 0-column data frame
      argument.  (Underlies \PR{14066}.)

      It could return nonsensical results if no input determined the
      number of cases (seen in the no-segfault tests).

      \item An error in \code{nls()} with a long formula could cause a
      segfault.  (\PR{14059})

      \item \code{qchisq(p, df, ncp, lower.tail = FALSE)} with
      \code{ncp >= 80} was inaccurate for small \code{p} (as the help page
      said): it is now less inaccurate.  (In part,
      \PR{13999}.)

      For \code{ncp} less than but close to 80, \code{pchisq()} and
      \code{qchisq()} are more accurate for probabilities very close
      to 1 (a series expansion was truncated slightly too early).

      \code{pchisq(x, df, ncp)} can no longer return values just larger
      than one for large values of \code{ncp}.

      \item \code{intToUtf8()} could fail when asked to produce 10Mb or more
      strings, something it was never intended to do: unfortunately
      Windows crashed \R (other OSes reported a lack of resources).
      (\PR{14068})

      \item \code{chisq.test()} could fail when given argument
      \code{x} or \code{y} which deparsed to more than one line.
      (Reported by Laurent Gauthier.)

      \item S4 methods are uncached whenever the namespace containing
      them is unloaded (by \code{unloadNamespace()} as well as by
      \code{detach(unload = TRUE))}.

      \item The internal record-keeping by
      \code{dyn.load}/\code{dyn.unload} was incomplete, which could
      crash \R if a DLL that registered \code{.External} routines had
      earlier been unloaded.

      \item \code{bessel[JY](x, nu)} with \code{nu} a negative integer (a
      singular case) is now correct, analogously to \code{besselI()},
      see \PR{13556}.

      \item \code{tools::file_path_as_absolute()} doubled the file
      separator when applied to a file such as \file{"/vmunix"} or (on
      Windows) \file{"d:/afile"} in a directory for which
      \code{getwd()} would return a path with a trailing separator
      (largely cosmetic, as reasonable file systems handle such a path
      correctly).  (Perhaps what was meant by \PR{14078}.)

      \item \code{unsplit(drop = TRUE)} applied to a data frame failed
      to pass \code{drop} to the computation of row names.  (\PR{14084})

      \item The \code{"difftime"} method of \code{mean()} ignored its
      \code{na.rm} argument.

      \item \code{tcltk::tk_select.list()} is now more likely to remove the
      widget immediately after selection is complete.

      \item Adding/subtracting a \code{"difftime"} object to/from a
      \code{"POSIXt"} or \code{"Date"} object works again (it was
      broken by the addition of \code{Ops.difftime}).

      \item Conversion to latex of an Rd file with no aliases failed.

      \item \code{wilcox.test(conf.int=TRUE)} has achieved.level
      corrected and, for \code{exact=FALSE}, now returns a
      \code{estimate} component which does not depend on the
      alternative used.

      \item \code{help.search()} failed when the package argument was
      specified.  (\PR{14113})

      \item \code{switch(EXPR = "A")} now returns \code{NULL}, as does
      \code{switch(1)} (which used to signal an error).
    }
  }
}


\section{\Rlogo CHANGES IN R VERSION 2.10.0}{
  \subsection{SIGNIFICANT USER-VISIBLE CHANGES}{
    \itemize{
      \item Package help is now converted from \code{Rd} by the \R-based
       converters that were first introduced in 2.9.0.  This means

       \itemize{
	 \item Packages that were installed by R-devel after 2009-08-09
         should not be used with earlier versions of \R, and most
         aspects of package help (including the runnable examples)
         will be missing if they are so used.

	 \item Text, HTML and latex help and examples for packages
         installed under the new system are converted on-demand from
         stored parsed Rd files.  (Conversions stored in packages
         installed under \R < 2.10.0 are used if no parsed Rd files
         are found.  It is recommended that such packages be
         re-installed.)
       }

      \item HTML help is now generated dynamically using an HTTP server
       running in the \R process and listening on the loopback
       interface.

       \itemize{
	 \item Those worried about security implications of such
	 a server can disable it by setting the environment variable
	 \env{R_DISABLE_HTTPD} to a non-empty value.  This disables
	 \code{help.start()} and HTML help (so text help is shown
	 instead).

	 \item The Java/Javascript search engine has been replaced by an
         HTML interface to \code{help.search()}.  \code{help.start()} no
         longer has an argument \code{searchEngine} as it is no longer
         needed.

	 \item The HTML help can now locate cross-references of the form
         \code{\\link[pkg]\{foo\}} and \code{\\link[pkg:foo]\{bar\}}
         where \code{foo} is an alias in the package, rather than the
         documented (basename of a) filename (since the documentation
         has been much ignored).
       }
    }
  }
  \subsection{NEW FEATURES}{
    \itemize{
      \item \code{polygon()}, \code{pdf()} and \code{postscript()} now
       have an argument \code{fillOddEven} (default \code{FALSE}),
       which controls the mode used for polygon fills of
       self-intersecting shapes.

      \item New \code{debugonce()} function; further,
       \code{getOption("deparse.max.lines")} is now observed when
       debugging, from a code suggestion by John Brzustowski.
       (\PR{13647}/8)

      \item \code{plot()} methods for \code{"stepfun"} and hence
       \code{"ecdf"} no longer plot points by default for \code{n >= 1000}.

      \item \code{[g]sub(perl=TRUE)} now also supports \code{"\\E"}
      in order to \strong{end} \code{"\\U"} and \code{"\\L"} case changes,
      thanks to a patch from Bill Dunlap.

      \item \code{factor()}, \code{levels()<-}, etc, now ensure that
       the resulting factor levels are unique (as was always the implied
       intention).  Factors with duplicated levels are still
       constructible by low-level means, but are now declared illegal.

      \item New \code{print()} (S3) method for class \code{"function"},
       also used for auto-printing.  Further, \code{.Primitive}
       functions now print and auto-print identically.  The new method
       is based on code suggestions by Romain François.

      \item The \code{print()} and \code{toLatex()} methods for class
       \code{"sessionInfo"} now show the locale in a nicer format and
       have arguments to suppress locale information.

      \item In addition to previously only \code{round()}, there are
       other \code{Math} group (S3) methods for \code{"difftime"},
       such as \code{floor()}, \code{signif()}, \code{abs()}, etc.

      \item For completeness, \code{old.packages()} and
       \code{available.packages()} allow arguments \code{type} to be
       specified (you could always specify arguments \code{available}
       or \code{contriburl}).

      \item \code{available.packages()} by default only returns
       information on the latest versions of packages whose version
       requirements are satisfied by the currently running \R.

      \item \code{tools::write_PACKAGES()} has a new argument
       \code{latestOnly}, which defaults to \code{TRUE} when only the
       latest versions in the repository will be listed in the index.

      \item \code{getOption()} has a new argument \code{default} that
       is returned if the specified option is not set.  This simplifies
       querying a value and checking whether it is \code{NULL} or not.

      \item \code{parse()} now warns if the requested encoding is not supported.

      \item The \code{"table"} method of \code{as.data.frame()} gains a
       \code{stringsAsFactors} argument to allow the classifying
       factors to be returned as character vectors rather than the
       default factor type.

      \item If \code{model.frame.default()} encounters a character
       variable where \code{xlev} indicates a factor, it now converts
       the variable to a factor (with a warning).

      \item \code{curve()} now returns a list containing the points that
      w§ere drawn.

      \item \code{spineplot()} now accepts \code{axes = FALSE}, for
       consistency with other functions called by \code{plot.factor()}.

      \item The Kendall and Spearman methods of \code{cor.test()} can
       optionally use continuity correction when not computing exact
       p-values.  (The Kendall case is the wish of \PR{13691}.)

      \item \R now keeps track of line numbers during execution for code
       sourced with \code{options(keep.source = TRUE)}.  The source
       reference is displayed by debugging functions such as
       \code{traceback()}, \code{browser()}, \code{recover()}, and
       \code{dump.frames()}, and is stored as an attribute on each
       element returned by \code{sys.calls()}.

      \item More functions now have an implicit (S4) generic definition.

      \item \code{quantile.default()} now disallows factors (wish of
       \PR{13631}) and its help
       documents what numeric-like properties its input need to have to
       work correctly.

      \item \code{weighted.mean()} is now generic and has \code{"Date"},
       \code{"POSIXct"} and \code{"POSIXlt"} methods.

      \item Naming subscripts (e.g., \code{x[i=1, j=2]}) in
       \code{data.frame} methods for \code{[} and \code{[[} now gives a
       warning.  (Names are ignored in the default method, but could
       have odd semantics for other methods, and do for the data.frame
       ones.)

      \item \code{as.data.frame()} has an \code{"aovproj"} method.
      (Wish of \PR{13505})

      \item \code{as.character(x)} for numeric \code{x} no longer
       produces strings such as \code{"0.30"}, i.e., with trailing
       zeros.  This change also renders levels construction in
       \code{factor()} more consistent.

      \item \code{codocClasses()}, which checks consistency of the
       documentation of S4 class slots, now does so in considerably more
       cases.  The documentation of inherited slots (from superclasses)
       is now optional.  This affects \command{R CMD check <pkg>} when
       the package defines S4 classes.

      \item \code{codoc()} now also checks S4 methods for code/documentation
       mismatches.

      \item \code{for()}, \code{while()}, and \code{repeat()} loops now
       always return NULL as their (invisible) value.  This change was
       needed to address a reference counting bug without creating
       performance penalties for some common use cases.

      \item The \code{print()} method for \code{ls.str()} results now
       obeys an optional \code{digits} argument.

      \item The \code{method} argument of \code{glm()} now allows
      user-contributed methods.

      \item More general \code{reorder.default()} replaces functionality of
       \code{reorder.factor()} and \code{reorder.character()}.

      \item The function \code{aspell()} has been added to provide an
       interface to the \command{Aspell} spell-checker.

      \item Filters \code{RdTextFilter()} and \code{SweaveTeXFilter()}
       have been added to the tools package to provide support for
       \code{aspell()} or other spell checkers.

      \item \code{xtabs()} with the new argument \code{sparse = TRUE}
       now returns a sparse Matrix, using package \CRANpkg{Matrix}.

      \item \code{contr.sum()} etc gain an argument \code{sparse}
       which allows sparse matrices to be returned.

       \code{contrasts()} also gains a \code{sparse} argument which it
       passes to the actual contrast function if that has a formal
       argument \code{sparse}.

       \code{contrasts(f, .) <- val} now also works when \code{val}
       is a sparse Matrix.  It is planned that \code{model.matrix()}
       will work with such factors \code{f} in the future.

      \item \code{readNEWS()} will recognize a UTF-8 byte-order mark
       (BOM) in the \file{NEWS} file.  However, it is safer to use only
       ASCII code there because not all editors recognize BOMs.

      \item New utility function \code{inheritedSlotNames()} for S4
      class programming.

      \item \code{tabulate()} now allows NAs to pass through (and be ignored).

      \item If \code{debug()} is called on an S3 generic function then
       all methods are debugged as well.

      \item Outlier symbols drawn by \code{boxplot()} now obey the
       \code{outlwd} argument.  Reported by Jurgen Kluge.

      \item \code{svd(x)} and \code{eigen(x)} now behave analogously to
       \code{qr(x)} in accepting logical matrices \code{x}.

      \item File \file{NEWS} is now in UTF-8, and has a BOM (often
       invisible) on the first line, and \command{Emacs} local variables
       set for UTF-8 at the end.  \code{RShowDoc("NEWS")} should display
       this correctly, given suitable fonts.

      \item \code{terms.formula(simplify = TRUE)} now does not deparse
       the LHS and so preserves non-standard responses such as \code{`a:
       b`} (requested by Sundar Dorai-Raj).

      \item New function \code{news()} for building and querying \R or
       package news information.

      \item \code{z^n} for integer \code{n} and complex \code{z} is more
       accurate now if \code{|n| <= 65536}.

      \item \code{factor(NULL)} now returns the same as
       \code{factor(character(0))} instead of an error, and
       \code{table(NULL)} consequently does analogously.

      \item \code{as.data.frame.vector()} (and its copies) is slightly faster
       by avoiding a copy if there are no names (following a
       suggestion of Tim Hesterberg).

      \item \code{writeLines()}, \code{writeBin()} and
       \code{writeChar()} have a new argument \code{useBytes}.  If
       false, character strings with marked encodings are translated to
       the current locale (as before) but if true they are written
       byte-by-byte.

      \item \code{iconv()} has a new argument \code{mark} which can be
       used (by experts) to suppress the declaration of encodings.

      \item \file{DESCRIPTION} file's \code{LinkingTo} specs are now
       recognized as installation dependencies, and included in package
       management computations.

      \item Standardized \file{DESCRIPTION} file \code{License} specs
       are now available for package management computations.

      \item \code{"\\uxxxx"} and \code{"\\Uxxxxxxxx"} escapes can now be
       parsed to a UTF-8 encoded string even in non-UTF-8 locales (this
       has been implemented on Windows since \R 2.7.0).  The semantics
       have been changed slightly: a string containing such escapes is
       always stored in UTF-8 (and hence is suitable for portably
       including Unicode text in packages).

      \item New \code{as.raw()} method for \code{"tclObj"} objects (wish
      of \PR{13758}).

      \item \code{Rd.sty} now makes a better job of setting email addresses,
       including using a monospaced font.

      \item \code{textConnection()} gains an \code{encoding} argument
       to determine how input strings with marked encodings will be
       handled.

      \item \command{R CMD Rd2pdf} is available as a shortcut for
      \command{R CMD Rd2dvi --pdf}.

      \item \command{R CMD check} now checks links where a package is
       specified (\code{\\link[pkg]\{file\}} or
       \code{\\link[pkg:file]\{topic\}}), if the package is available.
       It notes if the package is not available, as in many cases this
       is an error in the link.

      \item \code{identical()} gains three logical arguments, which
       allow for even more differentiation, notably \code{-0} and
       \code{0}.

      \item \code{legend()} now can specify the \code{border} color of
       filled boxes, thanks to a patch from Frederic Schutz.

      \item Indexing with a vector index to \code{[[ ]]} has now been
       extended to all recursive types.

      \item Pairlists may now be assigned as elements of lists.  (Lists
       could always be created with pairlist elements, but \code{[[<-}
       didn't support assigning them.)

      \item The parser now supports C-preprocessor-like \code{#line}
       directives, so error messages and source references may refer to
       the original file rather than an intermediate one.

      \item New functions \code{findLineNum()} and
       \code{setBreakpoint()} work with the source references to find
       the location of source lines and set breakpoints (using
       \code{trace()}) at those lines.

      \item Namespace importing is more careful about warning on masked
       generics, thanks to a patch by Yohan Chalabi.

      \item \code{detach()} now has an argument \code{character.only}
       with the same meaning as for \code{library()} or
       \code{require()}.

      \item \code{available.packages()} gains a \code{filters}
       argument for specifying the filtering operations performed on the
       packages found in the repositories.  A new built-in
       \code{"license/FOSS"} filter only retains packages for which
       installation can proceed solely based on packages which can be
       verified as Free or Open Source Software (FOSS) employing the
       available license specifications.

      \item In registering an S3 class by a call to
       \code{setOldClass()}, the data part (e.g., the object type)
       required for the class can be included as one of the superclasses
       in the Classes argument.

      \item The argument \code{f} to \code{showMethods()} can be an
       expression evaluating to a generic function, allowing methods to
       be shown for non-exported generics and other nonstandard cases.

      \item \code{sprintf()} now supports \code{\%o} for octal
      conversions.

      \item New function \code{Sys.readlink()} for information about symbolic
       links, including if a file is a symbolic link.

      \item Package \pkg{tools} has new functions
       \code{checkRdaFiles()} and \code{resaveRdaFiles()} to report on
       the format of \file{.rda}/\file{.RData} data files, and to
       re-save them in a different compressed format, including choosing
       the most compact format available.

       A new \command{INSTALL} option, \option{--resave-data}, makes use
       of this.

      \item File \file{~/.R/config} is used in preference to
       \file{~/.Rconfig}, and these are now documented in \sQuote{R
       Installation and Administration}.

      \item Logic operations with complex numbers now work, as they were always
       documented to, and as in S.

      \item \code{arrows()} and \code{segments()} allow one of \code{x1}
       or \code{y1} to be omitted to simplify the specification of
       vertical or horizontal lines (suggestion of Tim Hesterberg).

      \item \code{approxfun()} is faster by avoiding repeated \code{NA}
       checks (diagnosis and patch by Karline Soetaert & Thomas
       Petzoldt).

      \item There are the beginnings of a Nynorsk translation by Karl Ove
       Hufthammer.

      \item \code{stripchart()} allows \code{par} \code{bg} to be
       passed in for the background colour for \code{pch = 21} (wish of
       \PR{13984}).

      \item New generic function \code{.DollarNames()} to enable class authors
       to customize completion after the \code{$} extractor.

      \item \code{load()}, \code{save()}, \code{dput()} and
       \code{dump()} now open a not-yet-open connection in the
       appropriate mode (as other functions using connections directly
       already did).
    }
  }
  \subsection{REGULAR EXPRESSIONS}{
    \itemize{
      \item A different regular expression engine is used for basic and
       extended regexps and is also for approximate matching.  This is
       based on the TRE library of Ville Laurikari, a modified copy of
       which is included in the \R sources.

       This is often faster, especially in a MBCS locale.

       Some known differences are that it is less tolerant of invalid
       inputs in MBCS locales, and in its interpretation of undefined
       (extended) regexps such as \code{"^*"}.  Also, the interpretation of
       ranges such as \code{[W-z]} in caseless matching is no longer to map
       the range to lower case.

       This engine may in future be used in \sQuote{literal} mode for
       \code{fixed = TRUE}, and there is a compile-time option in
       \code{src/main/grep.c} to do so.

      \item The use of repeated boundary regexps in \code{gsub()} and
       \code{gregexpr()} as warned about in the help page does not work
       in this engine (it did in the previous one since 2005).

      \item Extended (and basic) regexps now support same set of options
       as for \code{fixed = TRUE} and \code{perl = TRUE}, including
       \code{useBytes} and support for UTF-8-encoded strings in
       non-UTF-8 locales.

      \item \code{agrep()} now has full support for MBCS locales with a modest
       speed penalty.  This enables \code{help.search()} to use approximate
       matching character-wise rather than byte-wise.

      \item \code{[g]sub} use a single-pass algorithm instead of
       matching twice and so is usually faster.

      \item The \code{perl = TRUE} versions now work correctly in a
       non-UTF-8 MBCS locale, by translating the inputs to UTF-8.

      \item \code{useBytes = TRUE} now inhibits the translation of inputs with
       marked encodings.

      \item \code{strsplit()} gains a \code{useBytes} argument.

      \item The algorithm used by \code{strsplit()} has been reordered
       to batch by elements of \code{split}: this can be much faster for
       \code{fixed = FALSE} (as multiple compilation of regexps is avoided).

      \item The help pages, including \code{?regexp}, have been updated
       and should be consulted for details of the new implementations.
    }
  }
  \subsection{HELP & Rd FILE CHANGES}{
    \itemize{
      \item A new dynamic HTML help system is used by default, and may be
       controlled using \code{tools::startDynamicHelp()}.  With this enabled,
       HTML help pages will be generated on request, resolving links
       by searching through the current \code{.libPaths()}.  The user
       may set options(\code{"help.ports"}) to control which IP port is used
       by the server.

      \item \code{help.start()} no longer sets \code{options(htmlhelp =
       TRUE)} (it used to on Unix but not on Windows).  Nor does it on
       Unix reset the \code{"browser"} option if given an argument of
       that name.

       Arguments \code{update} and \code{remote} are now available
       on all platforms: the default is \code{update = FALSE} since the
       http server will update the package index at first use.

      \item \code{help()} has a new argument \code{help_type} (with
       default set by the option of that name) to supersede arguments
       \code{offline}, \code{htmlhelp} and \code{chmhelp}
       (although for now they still work if \code{help_type} is
       unset).  There is a new type, \code{"PDF"} to allow offline PDF
       (rather than PostScript).

       A function \code{offline_help_helper()} will be used if this exists
       in the workspace or further down the search path, otherwise
       the function of that name in the \pkg{utils} namespace is used.

      \item Plain text help is now used as the fallback for HTML help (as
       it always was for Compiled HTML help on Windows).

      \item It is possible to ask for static HTML pages to be prebuilt
       \emph{via} the configure option \option{--enable-prebuilt-html}.  This
       may be useful for those who wish to make HTML help available
       outside R, e.g.\sspace{}on a local web site.

      \item An experimental tag \code{\\Sexpr} has been added to Rd
       files, to evaluate expressions at build, install, or render time.
       Currently install time and render time evaluation are supported.

      \item Tags \code{\\if}, \code{\\ifelse} and \code{\\out} have been
       added to allow format-specific (or more general, using
       \code{\\Sexpr}) conditional text in man pages.

      \item The \code{parse_Rd()} parser has been made more tolerant of coding
       errors in Rd files:  now all syntax errors are reported as
       warnings, and an attempt is made to continue parsing.

      \item \code{parse_Rd()} now has an argument \code{fragment}
       (default \code{FALSE}) to accept small fragments of Rd files (so
       that \code{\\Sexpr} can output Rd code which is then parsed).

      \item \code{parse_Rd()} now always converts its input to UTF-8.
       The \code{Rd2*} rendering functions have a new argument,
       \code{outputEncoding}, which controls how their output is
       encoded.

      \item \code{parse_Rd()} no longer includes the newline as part of
       a \code{"\%"}-style comment.

      \item There have been various bug fixes and code reorganization in
       the Rd renderers \code{Rd2HTML}, \code{Rd2latex}, \code{Rd2txt},
       and \code{Rd2ex}.

       All example files are now created with either ASCII or UTF-8
       encoding, and the encoding is only marked in the file if there
       is any non-UTF-8 code (previously it was marked if the help
       file had non-ASCII contents, possibly in other sections).

      \item \code{print.Rd()} now adds necessary escape characters so that
       printing and re-parsing an Rd object should produce an
       equivalent object.

      \item \code{parse_Rd()} was incorrectly handling multiple backslashes in
       \R code strings, converting 4n+3 backslashes to 2n+1 instead
       of 2n+2.

      \item \code{parse_Rd()} now recognizes the \code{\\var} tag within
       a quoted string in \R-like text.

      \item \code{parse_Rd()} now treats the argument of
       \code{\\command} as LaTeX-like, rather than verbatim.
    }
  }
  \subsection{COMPRESSION}{
    \itemize{
      \item New function \code{untar()} to list or unpack tar archives,
       possibly compressed.  This uses either an external \command{tar}
       command or an internal implementation.

      \item New function \code{tar()} to create (possibly compressed)
      tar archives.

      \item New functions \code{memCompress()} and
       \code{memDecompress()} for in-memory compression and
       decompression.

      \item \code{bzfile()} has a \code{compress} argument to select
       the amount of effort put into compression when writing.

      \item New function \code{xzfile()} for use with
       \command{xz}-compressed files.  (This can also read files
       compressed by some versions of \command{lzma}.)

      \item \code{gzfile()} looks at the file header and so can now also
       read \command{bzip2}-ed files and \command{xz}-compressed files.

      \item There are the new options of \code{save(compress = "bzip2")}
       and \code{"xz"} to use \command{bzip2} or \command{xz}
       compression (which will be slower, but can give substantially
       smaller files).  Argument \code{compression_level} gives finer
       control over the space/time tradeoffs.

       \code{load()} can read such saves (but only as from this version of \R).

      \item \command{R CMD INSTALL}/\command{check} and
       \code{tools::writePACKAGES} accept a wider range of compressed
       tar archives.  Precisely how wide depends on the capabilities of
       the host system's \command{tar} command: they almost always
       include \command{.tar.bz2} archives, and with modern versions of
       \command{tar} other forms of compression such as \command{lzma}
       and \command{xz}, and arbitrary extensions.

      \item \command{R CMD INSTALL} has a new option
       \option{--data-compress} to control the compression used when
       lazy-loading data.  New possibilities are
       \option{--data-compress=bzip2} which will give ca 15\% better
       compression at the expense of slower installation times, and
       \option{--data-compress=xz}, often giving even better compression
       on large datasets at the expense of much longer installation
       times.  (The latter is used for the recommended packages: it is
       particularly effective for \CRANpkg{survival}.)

      \item \code{file()} for open = \code{""}, \code{"r"} or
       \code{"rt"} will automagically detect compressed files (from
       \command{gzip}, \command{bzip2} or \command{xz}).  This means
       that compressed files can be specified by file name (rather than
       \emph{via} a \code{gzfile()} connection) to \code{read.table()},
       \code{readlines()}, \code{scan()} and so on.

      \item \code{data()} can handle compressed text files with extensions
       \file{.\{txt,tab,csv\}.\{gz,bz2,xz\}} .
    }
  }
  \subsection{DEPRECATED & DEFUNCT}{
    \itemize{
      \item \code{png(type="cairo1")} is defunct: the value is no longer
      recognized.

      \item \code{tools::Rd_parse()} is defunct (as this version of \R
       uses only Rd version 2).

      \item Use of file \file{~/.Rconf} (which was deprecated in favour
       of \file{~/.Rconfig} in 2004) has finally been removed.

      \item Bundles of packages are deprecated.  See \sQuote{Writing R
       Extensions} for the steps needed to unbundle a bundle.

      \item \code{help()} arguments \code{offline}, \code{htmlhelp} and
       \code{chmhelp} are deprecated in favour of \code{help_type}.

      \item \code{clearNames()} (in package \pkg{stats}) is deprecated
      for \code{unname()}.

      \item Basic regular expressions (\code{extended = FALSE}) are
       deprecated in \code{strsplit}, \code{grep} and friends.  There is
       a precise POSIX standard for them, but it is not what recent RE
       engines implement, and it seems that in almost all cases package
       authors intended \code{fixed = TRUE} when using \code{extended =
       FALSE}.

      \item \code{methods::trySilent()} is deprecated in favour of
      \code{try(silent=TRUE)} or -- more efficiently and flexibly --
      something like \code{tryCatch(error = function(e) e)}.

      \item \code{index.search()} is deprecated: there are no longer
       directories of types other than \code{help}.
    }
  }
  \subsection{INSTALLATION}{
    \itemize{
      \item cairo >= 1.2 is now required (1.2.0 was released in July 2006)
       for cairo-based graphics devices (which remain optional).

      \item A suitable \code{iconv()} is now required: support for
       configure option \option{--without-iconv} has been withdrawn (it
       was deprecated in \R 2.5.0).

      \item Perl is no longer \sQuote{essential}.  \R can be built
       without it, but scripts \command{R CMD build}, \command{check},
       \command{Rprof} and \command{Sd2d} currently require it.

      \item A system \command{glob} function is now essential (a working
       \code{Sys.glob()} has been assumed since \R 2.9.0 at least).

      \item C99 support for MBCS is now required, and configure option
       \option{--disable-mbcs} has been withdrawn.

      \item Having a version of \command{tar} capable of automagically
       detecting compressed archives is useful for
       \code{utils::untar()}, and so \command{gtar} (a common name for
       GNU \command{tar}) is preferred to \command{tar}: set environment
       variable \env{TAR} to specify a particular \command{tar} command.
    }
  }
  \subsection{INTERNATIONALIZATION}{
    \itemize{
      \item There is some makefile support for adding/updating translations
       in packages: see \code{po/README} and \sQuote{Writing R Extensions}.

       There is support for the use of \code{dngettext} for C-level
       translations in packages: see \sQuote{Writing R Extensions}.
    }
  }
  \subsection{BUG FIXES}{
    \itemize{
      \item Assigning an extra 0-length column to a data frame by
       \code{DF[, "foo"] <- value} now works in most cases (by filling
       with \code{NA}s) or fails.  (It used to give a corrupt data
       frame.)

      \item \code{validObject()} avoids an error during evaluation in the case
       of various incorrect slot definitions.

      \item \code{n:m} now returns a result of type \code{"integer"} in
       a few more boundary cases.

      \item The \code{zap.ind} argument to \code{printCoefmat()} did
       not usually work as other code attempted to ensure that non-zero
       values had a non-zero representation.

      \item \code{printCoefmat()} formatted groups of columns together,
       not just the \code{cs.ind} group but also the \code{zap.ind}
       group and a residual group.  It now formats all columns except
       the \code{cs.ind} group separately (and zaps the \code{zap.ind}
       group column-by-column).  The main effect will be see in the
       output from \code{print.anova()}, as this grouped SS-like columns
       in the \code{zap.ind} group.

      \item \code{R_ReplDLLinit()} initializes the top-level jump so
       that some embedded applications on Windows no longer crash on
       error.

      \item \code{identical()} failed to take the encoding of character
       strings into account, so identical byte patterns are not
       necessarily identical strings, and similarly Latin-1 and UTF-8
       versions of the same string differ in byte pattern.

      \item \code{methods(f)} used to warn unnecessarily for an S4
       generic \code{f} which had been created based on an existing S3
       generic.

      \item The check for consistent ordering of superclasses was not
       ignoring all conditional relations (the symptom was usually
       spurious warnings for classes extending \code{"array"}).

      \item Trying to assign into a raw vector with an index vector
       containing \code{NA}s could cause a segfault.  Reported by Hervé
       Pagès.

      \item \command{Rscript} could segfault if (by user error) its
       filename argument was missing.  Reported by Martin Morgan.

      \item \code{getAnywhere()} (and functions that use it, including argument
       completion in the console) did not handle special built-in
       functions.  Reported by Romain Francois.

      \item \code{order()} was missing a \code{PROTECT()} call and so
       could segfault when called on character data under certain (rare)
       circumstances involving marked non-native encodings.

      \item \code{prettyNum(z, drop0trailing=TRUE)} did not work
       correctly when \code{z} was a complex vector.  Consequently,
       \code{str(z, \dots)} also did not.  (\PR{13985})

      \item \command{make distclean} removed too many files in
       \code{etc/} if builddir = srcdir.

      \item \command{R CMD} replaced \code{TEXINPUTS} rather than
       appending to it (as documented and intended).

      \item \code{help.start()} no longer fails on unix when
       \code{"browser"} is a function.

      \item \code{pbeta(x, ..., log.p = TRUE)} is sometimes more accurate,
       e.g., for very small \code{x}.

      \item Unserializing a pre-2.8 workspace containing pure ASCII
       character objects with a Latin-1 or UTF-8 encoding would corrupt
       the \code{CHARSXP} cache.
    }
  }
}

\section{OLDER NEWS}{
  \itemize{
    \item News for \R 2.9.2 patched and earlier can be found in files
    such as \file{NEWS.2} in the \file{doc} directory.
  }
}
