				Dear Emacs, please make this -*-Text-*- mode!


	This file covers NEWS for R 2.x.y.
        See 'NEWS.3' for subsequent changes and NEWS.0 and NEWS.1
	for earlier ones.

	There is a change in format at 2.10.0: entries from
	then on are generated from doc/NEWS.2.Rd.


CHANGES IN R VERSION 2.15.3:

  NEW FEATURES:

    • lgamma(x) for very small x (in the denormalized range) is no
      longer Inf with a warning.

    • image() now sorts an unsorted breaks vector, with a warning.

    • The internal methods for tar() and untar() do a slightly more
      general job for ‘ustar’-style handling of paths of more than 100
      bytes.

    • Packages compiler and parallel have been added to the reference
      index (refman.pdf).

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

    • sQuote() and dQuote() now handle 0-length inputs.  (Suggestion of
      Ben Bolker.)

    • summaryRprof() returns zero-row data frames rather than throw an
      error if no events are recorded, for consistency.

    • The included version of PCRE has been updated to 8.32.

    • The tcltk namespace can now be re-loaded after unloading.

      The Tcl/Tk event loop is inhibited in a forked child from package
      parallel (as in e.g. mclapply()).

    • parallel::makeCluster() recognizes the value random for the
      environment variable 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.

  UTILITIES:

    • The default for TAR on Windows for R CMD build has been changed
      to be internal if no tar command is on the path.

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

  C-LEVEL FACILITIES:

    • On a 64-bit Windows platform with enough RAM, R_alloc can now
      allocate up to just under 32GB like other 64-bit platforms.

  DEPRECATED AND DEFUNCT:

    • Use of col2rgb(0) is deprecated (see the help page for its
      limitations).

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

    • real(), as.real() and is.real() are now formally deprecated and
      give a warning.

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

  INSTALLATION:

    • The configure tests for Objective C and Objective C++ now work on
      Mac OS 10.8 with Xcode 4.5.2 (PR#15107).

    • The cairo-based versions of 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 X11.options(type
      = "nbcairo").

    • Configuration and 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
      libjpeg) supplied in the JDK and system libraries.  This can
      always be overridden if needed: see the ‘R Installation and
      Administration’ manual.

  BUG FIXES:

    • beta(a, b) could overflow to infinity in its calculations when
      one of a and b was less than one.  (PR#15075)

    • lbeta(a, b) no longer gives NaN if a or b is very small (in the
      denormalized range).

    • bquote() is now able to substitute default arguments in
      single-argument functions.  (PR#15077)

    • browseEnv(html = FALSE) would segfault if called from R (not
      R.app) on a CRAN-style Mac OS X build of R.

    • [[<- for lists (generic vectors) needed to increment NAMED count
      when RHS is used more than once. (PR#15098)

    • 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.

    • The call() function did not duplicate its arguments.  (PR#15115)

    • TukeyHSD() could give NA results with some na.action methods such
      as na.exclude().  (Hinted at on R-help by John Fox.)

    • The deprecated svd(X, LINPACK = TRUE) could alter X in R
      2.15.[12].  (Reported by Bill Dunlap.)

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

    • summaryRprof(memory = "both") mixed up the units of Vcells and
      Ncells: it now works in bytes.  (PR#15138)

    • tools::Rd2HTML() would sometimes delete text. (PR#15134)

    • plot() failed for "table" objects containing just one entry.
      (PR#15118)

    • embedFonts() needed to quote some filepaths.  (PR#15149)

    • parallel::mccollect() handled NULL returns incorrectly (removing
      the element rather than setting it to NULL).

    • The full reference index (fullrefman.pdf) was missing packages
      compiler and parallel.

    • The report for 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)

    • qt(1e-12, 1.2) no longer gives NaN.

    • dt(1e160, 1.2, log=TRUE) no longer gives -Inf.

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

    • The version for Windows 8 and Windows Server 2012 is now
      displayed by win.version().  (Reported by Gabor Grothendieck.)

    • The custom Windows installer target myR in the installer Makefile
      did not work in 2.15.2.  (Reported by Erich Neuwirth.)

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

    • Expressions involving user defined operators were not always
      deparsed faithfully. (PR#15179)

    • The enc2utf8() function converted NA_character_ to "NA" in
      non-UTF-8 locales. (PR#15201)

    • The exclude argument to xtabs() was ignored for "factor"
      arguments.

    • On Windows, work around an event-timing problem when the RGui
      console was closed from the ‘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.)

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

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

CHANGES IN R VERSION 2.15.2:

  NEW FEATURES:

    • The X11() window gains an icon: the latter may be especially
      useful on Ubuntu's ‘Unity’ interface.

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

      (Contributed by Philip Johnson.)

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

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

    • More Polish translations are available: for the RGui menus and
      for several recommended packages.

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

    • qqline() has new optional arguments distribution, probs and
      qtype, following the example of lattice's panel.qqmathline().

    • The handling of single quotes in the en@quot pseudo-language has
      been slightly improved.  Double quotes are no longer converted.

    • New functions checkPoFiles() and checkPoFile() have been added to
      the tools package to check for consistency of format strings in
      translation files.

    • model.matrix(~1, ...) now also contains the same rownames that
      less trivial formulae produce.  (Wish of PR#14992, changes the
      output of several packages.)

    • Misuse of rep() on undocumented types of objects (e.g. calls) is
      now reported as an error.

    • The included LAPACK has been updated to 3.4.1, with some patches
      from the current SVN sources.  (_Inter alia_, this resolves
      PR#14692.)

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

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

    • The included version of liblzma has been updated to version
      5.0.4, a minor bug-fix release.

    • New function .bincode(), a ‘bare-bones’ version of
      cut.default(labels = FALSE) for use in packages with image()
      methods.

    • The HTML manuals now use directional single quotes.

    • maintainer() now converts embedded new lines to spaces.  It no
      longer gives a non-obvious error for non-installed packages.

    • The X11() device has some protection against being used with
      forked processes _via_ package parallel.

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

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

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

    • Functions such as parLapply() in package parallel can make use of
      a default cluster if one is set.  (Reported by Martin Morgan.)

    • chol(pivot = TRUE, LINPACK = FALSE) is now available using LAPACK
      3.2 subroutine DPSTRF.

    • The functions .C(), .Call(), .External() and .Fortran() now check
      that they are called with an unnamed first argument: the formal
      arguments were changed from name= to .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.

    • step() no longer tries to improve a model with AIC of -Inf (a
      perfect fit).

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

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

  PERFORMANCE IMPROVEMENTS:

    • array() is now implemented in C code (for speed) when data is
      atomic or an unclassed list (so it is known that as.vector(data)
      will have no class to be used by rep()).

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

    • findInterval(), tabulate(), cut(), hist() and image.default() all
      use .Call() and are more efficient.

    • duplicated(), unique() and similar now support vectors of lengths
      above 2^29 on 64-bit platforms.

    • Omitting PACKAGE in .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 PACKAGE should be used
      to indicate which package is intended) but in some the namespace
      does not have a DLL specified by a useDynLib() directive so
      PACKAGE is required.

  UTILITIES:

    • R CMD check now checks if a package can be loaded by
      library(pkgname, lib.loc = "somewhere") without being on the
      library search path (unless it is already installed in .Library,
      when it always will be).

    • R CMD check --as-cran notes ‘hidden’ files and directories (with
      names starting with a dot) that are not needed for the operation
      of R CMD INSTALL or R CMD build: such files should be excluded
      from the published tarball.

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

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

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

    • R CMD check now checks for .C(), .Call(), .External() and
      .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).

  C-LEVEL FACILITIES:

    • The limit for R_alloc on 64-bit platforms has been raised to just
      under 32GB (from just under 16GB).

    • The misuse of .C("name", ..., PACKAGE = foo) where foo is an
      arbitrary R object is now an error.

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

  DEPRECATED AND DEFUNCT:

    • Use of array() with a 0-length dim argument is deprecated with a
      warning (and was contrary to the documentation).

    • Use of tapply() with a 0-length INDEX list is deprecated with a
      warning.

    • Translation packages are deprecated.

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

    • Entry point rcont2 is no longer part of the API, and will move to
      package stats in R 3.0.0.

    • The ‘internal’ graphics device invoked by
      .Call("R_GD_nullDevice", package = "grDevices") is about to be
      removed: use pdf(file = NULL) instead.

    • eigen(EISPACK = TRUE), chol(pivot = FALSE, LINPACK = TRUE),
      chol2inv(LINPACK = TRUE), solve(LINPACK = TRUE) and svd(LINPACK =
      TRUE) are deprecated and give a warning.

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

    • The ‘internal function’ kappa.tri() has been renamed to
      .kappa_tri() so it is not inadvertently called as a method for
      class "tri".

    • Functions sessionData() and browseAll() in package methods are on
      a help page describing them as ‘deprecated’ and are now formally
      deprecated.

  PACKAGE INSTALLATION:

    • For a Windows or Mac OS X binary package install,
      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.

    • 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).

  INSTALLATION:

    • There is a new configure option --with-libtiff (mainly in case
      the system installation needs to be avoided).

    • LAPACK 3.4.1 does use some Fortran 90 features, so g77 no longer
      suffices.

    • If an external LAPACK is used, it must be version 3.2 or later.

  BUG FIXES:

    • On Windows, starting Rterm via R.exe caused Ctrl-C to misbehave.
      (PR#14948)

    • The tools::latexToUtf8() function missed conversions that were
      contained within braces.

    • Long timezone specifications (such as a file name preceded by :)
      could crash as.POSIXlt.  (PR#14945)

    • R CMD build --resave-data could fail if there was no data
      directory but there was an R/sysdata.rda file.  (PR#14947)

    • is.na() misbehaved on a 0-column data frame.  (PR#14959)

    • anova.lmlist() failed if test was supplied.  (PR#14960)

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

    • The formula method for sunflowerplot() now allows xlab and ylab
      to be set.  (Reported by Gerrit Eichner.)

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

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

    • aov() and manova() gave spurious warning about singular error
      model in the multiresponse case.

    • In ns() and bs(), specifying knots = NULL is now equivalent to
      omitting it, also when df is specified.  (PR#14970)

    • sprintf() did not accept numbered arguments ending in zero.
      (PR#14975)

    • 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.)

    • Base package vignettes (e.g. vignette("Sweave")) were not fully
      installed in builds of R from the tarball.

    • lchoose() and choose() could overflow the C stack and crash R.

    • When given a 0-byte file and asked to keep source references,
      parse() read input from stdin() instead.

    • pdf(compress = TRUE) did not delete temporary files it created
      until the end of the R session.  (PR#14991)

    • logLik() did not detect the error of applying it to a
      multiple-response linear model.  (PR#15000)

    • file.copy(recursive = TRUE) did not always report FALSE for a
      failure two or more directories deep.

    • qgeom() could return -1 for extremely small q. (PR#14967)

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

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

    • On OS X, the Quartz versions of the bitmap devices did not
      respect antialias = "none".  (PR#15006)

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

    • parallel::stopCluster() now works with MPI clusters without snow
      being on the search path.

    • terms.formula() could exhaust the stack, and the stack check did
      not always catch this before the segfault.  (PR#15013)

    • sort.list(method = "radix") could give incorrect results on
      certain compilers (seen with clang on Mac OS 10.7 and Xcode
      4.4.1).

    • backsolve(T, b) gave incorrect results when nrows(b) > ncols(T)
      and b had more than one column.

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

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

    • Protection added to do_system. (PR#15025)

    • Printing of vectors with names > 1000 characters now works
      correctly rather than truncating. (PR#15028)

    • qr() for a complex matrix did not pivot the column names.

    • --with-blas='-framework vecLib' now also works on OS X 10.8.

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

    • install.packages(type = "both") could call chooseCRANmirror()
      twice.

    • lm.wfit() could segfault in R 2.15.1 if all the weights were
      zero. (PR#15044)

    • A malformed package name could cause R CMD INSTALL to write
      outside the target library.

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

    • The default type of display by browseEnv() when using R.app on
      Mac OS X has been incorrect for a long time.

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

    • The detection of the C stack direction is better protected
      against compiler optimization. (PR#15011)

    • Long custom line types would sometimes segfault on the
      cairographics-based devices. (PR#15055)

    • tools::checkPoFile() unprotected too early in its C code and so
      segfaulted from time to time.

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

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

    • arima.sim() could give too long an output in some corner cases
      (in part, PR#15068).

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

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

    • Compilation with the vecLib or Accelerate frameworks on OS X
      without using that also for LAPACK is more likely to be
      successful.

CHANGES IN R VERSION 2.15.1:

  NEW FEATURES:

    • source() now uses withVisible() rather than
      .Internal(eval.with.vis).  This sometimes alters tracebacks
      slightly.

    • 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).

    • splineDesign() and spline.des() in package splines have a new
      option sparse which can be used for efficient construction of a
      sparse B-spline design matrix (_via_ Matrix).

    • norm() now allows type = "2" (the ‘spectral’ or 2-norm) as well,
      mainly for didactical completeness.

    • pmin() and 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, +.

    • colorRamp() (and hence colorRampPalette()) now also works for the
      boundary case of just one color when the ramp is flat.

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

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

    • print(packageDescription(*)) trims the Collate field by default.

    • The included copy of zlib has been updated to version 1.2.7.

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

    • The NA warning messages from e.g. pchisq() now report the call to
      the closure and not that of the .Internal.

    • Added Polish translations by Łukasz Daniel.

  PERFORMANCE IMPROVEMENTS:

    • In package parallel, makeForkCluster() and the multicore-based
      functions use native byte-order for serialization (deferred from
      2.15.0).

    • lm.fit(), lm.wfit(), glm.fit() and lsfit() do less copying of
      objects, mainly by using .Call() rather than .Fortran().

    • .C() and .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).

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

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

    • There is less copying when using primitive replacement functions
      such as names(), attr() and attributes().

  DEPRECATED AND DEFUNCT:

    • The converters for use with .C() (see ?getCConverterDescriptions)
      are deprecated: use the .Call() interface instead.  There are no
      known examples (they were never fully documented).

  UTILITIES:

    • For 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 R_WIN_NO_JUNCTIONS to a non-empty value (e.g. in
      ~/.R/check.Renviron) will force copies to be used instead.

  INSTALLATION:

    • R CMD INSTALL with _R_CHECK_INSTALL_DEPENDS_ set to a true value
      (as done by R CMD check --as-cran) now restricts the packages
      available when lazy-loading as well as when test-loading (since
      packages such as ETLUtils and agsemisc had top-level calls to
      library() for undeclared packages).

      This check is now also available on Windows.

  C-LEVEL FACILITIES:

    • C entry points mkChar and mkCharCE now check that the length of
      the string they are passed does not exceed 2^31-1 bytes: they
      used to overflow with unpredictable consequences.

    • C entry points R_GetCurrentSrcref and R_GetSrcFilename have been
      added to the API to allow debuggers access to the source
      references on the stack.

  WINDOWS-SPECIFIC CHANGES:

    • Windows-specific changes will now be announced in this file
      (NEWS).  Changes up and including R 2.15.0 remain in the CHANGES
      file.

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

      If R_WIN_INTERNET2 is set to a non-empty value, it is as if
      --internet2 was used.

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

  BUG FIXES:

    • lsfit() lost the names from the residuals.

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

    • Nonsense uses such as seq(1:50, by = 5) (from package plotrix)
      and seq.int(1:50, by = 5) are now errors.

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

    • tracemem() reported that all objects were copied by .C() or
      .Fortran() whereas only some object types were ever copied.

      It also reported and marked as copies _some_ transformations such
      as rexp(n, x): it no longer does so.

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

    • Names containing characters which need to be escaped were not
      deparsed properly.  (PR#14846)

    • Trying to update (recommended) packages in 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 .libPaths().
      (PR#14866)

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

    • get_all_vars() failed when the data came entirely from vectors in
      the global environment. (PR#14847)

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

    • formatC() uses the C entry point str_signif which could write
      beyond the length allocated for the output string.

    • Missing default argument added to implicit S4 generic for
      backsolve(). (PR#14883)

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

    • For tiff(type = "windows"), the numbering of per-page files
      except the last was off by one.

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

    • On Windows, the compatibility function x11() had not kept up with
      changes to windows(), and issued warnings about bad parameters.
      (PR#14880)

    • On Windows, the Sys.glob() function did not handle UNC paths as
      it was designed to try to do. (PR#14884)

    • In package parallel, clusterApply() and similar failed to handle
      a (pretty pointless) length-1 argument. (PR#14898)

    • Quartz Cocoa display reacted asynchronously to 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 dev.flush() to allow animations without sleep
      cycles.

    • Source locations reported in traceback() were incorrect when
      byte-compiled code was on the stack.

    • plogis(x, lower = FALSE, log.p = TRUE) no longer underflows early
      for large x (e.g. 800).

    • ?Arithmetic's “1 ^ y and y ^ 0 are 1, _always_” now also applies
      for integer vectors y.

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

    • 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.

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

    • Under some circumstances 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.)

    • The evaluator now keeps track of source references outside of
      functions, e.g. when source() executes a script.

    • The replacement method for window() now works correctly for
      multiple time series of class "mts".  (PR#14925)

    • is.unsorted() gave incorrect results on non-atomic objects such
      as data frames.  (Reported by Matthew Dowle.)

    • The value returned by tools::psnice() for invalid pid values was
      not always NA as documented.

    • Closing an X11() window while locator() was active could abort
      the R process.

    • getMethod(f, sig) produced an incorrect error message in some
      cases when f was not a string).

    • Using a string as a “call” in an error condition with
      options(showErrorCalls=TRUE) could cause a segfault.  (PR#14931)

    • The string "infinity" allowed by C99 was not accepted as a
      numerical string value by e.g. scan() and as.numeric().
      (PR#14933)

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

    • by() failed for a zero-row data frame.  (Reported by Weiqiang
      Qian.)

    • The Yates' correction in 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 NaN.

    • xgettext() and related functions sometimes returned items that
      were not strings for translation. (PR#14935)

    • plot(<lm>, which=5) now correctly labels the factor level
      combinations for the special case where all h[i,i] are the same.
      (PR#14837)

    • Sys.glob() caused a segfault if the first element of path was
      NA_character. (PR#14990)

CHANGES IN R VERSION 2.15.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • The behaviour of unlink(recursive = TRUE) for a symbolic link to
      a directory has changed: it now removes the link rather than the
      directory contents (just as rm -r does).

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

  NEW FEATURES:

    • Environment variable RD2DVI_INPUTENC has been renamed to
      RD2PDF_INPUTENC.

    • .Deprecated() becomes a bit more flexible, getting an old
      argument.

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

    • 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.

    • system() and system2() when capturing output report a non-zero
      status in the new "status" attribute.

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

    • pdf() accepts forms like file = "|lpr" in the same way as
      postscript().

    • pdf() accepts 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).

    • format() (and hence print()) on "bibentry" objects now uses
      options("width") to set the output width.

    • legend() gains a text.font argument. (Suggested by Tim Paine,
      PR#14719.)

    • nchar() and nzchar() no longer accept factors (as integer
      vectors).  (Wish of PR#6899.)

    • summary() behaves slightly differently (or more precisely, its
      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 "data.frame" method is more consistent with the default
      method: in particular it now applies zapsmall() to
      numeric/complex summaries.

    • The number of items retained with options(warn = 0) can be set by
      options(nwarnings=).

    • There is a new function assignInMyNamespace() which uses the
      namespace of the function it is called from.

    • attach() allows the default name for an attached file to be
      overridden.

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

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

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

    • The "dendrogram" method of str() now takes its default for
      last.str from option str.dendrogram.last.

    • New simple fitted() method for "kmeans" objects.

    • The traceback() function can now be called with an integer
      argument, to display a current stack trace. (Wish of PR#14770.)

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

    • serialize() has a new option 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.

    • The internal (un)serialization code is faster for long vectors,
      particularly with XDR on some platforms.  (Based on a suggested
      patch by Michael Spiegel.)

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

    • NROW(x) and NCOL(x) now work whenever dim(x) looks appropriate,
      e.g., also for more generalized matrices.

    • PCRE has been updated to version 8.30.

    • The internal R_Srcref variable is now updated before the browser
      stops on entering a function.  (Suggestion of PR#14818.)

    • There are ‘bare-bones’ functions .colSums(), .rowSums(),
      .colMeans() and .rowMeans() for use in programming where ultimate
      speed is required.

    • The formerly internal function .package_dependencies() from
      package tools for calculating (recursive) (reverse) dependencies
      on package databases has been renamed to package_dependencies()
      and is now exported.

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

    • .filled.contour() is a ‘bare-bones’ function to add a
      filled-contour rectangular plot to an already prepared plot
      region.

    • 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 if statements as well as for for and while
      statements.  (Wish of PR#14814.)

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

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

    • New function rWishart() generates Wishart-distributed random
      matrices.

    • Packages may now specify actions to be taken when the package is
      loaded (setLoadActions()).

    • options(max.print = Inf) and similar now give an error (instead
      of warnings later).

    • The "difftime" replacement method of units tries harder to
      preserve other attributes of the argument.  (Wish of PR#14839.)

    • poly(raw = TRUE) no longer requires more unique points than the
      degree.  (Requested by John Fox.)

  PACKAGE parallel:

    • There is a new function mcmapply(), a parallel version of
      mapply(), and a wrapper mcMap(), a parallel version of Map().

    • A default cluster can be registered by the new function
      setDefaultCluster(): this will be used by default in functions
      such as parLapply().

    • clusterMap() has a new argument .scheduling to allow the use of
      load-balancing.

    • There are new load-balancing functions parLapplyLB() and
      parSapplyLB().

    • makePSOCKCluster() has a new option 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).

  PACKAGE INSTALLATION:

    • Non-ASCII vignettes without a declared encoding are no longer
      accepted.

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

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

    • R CMD INSTALL will test loading under all installed
      sub-architectures even for packages without compiled code, unless
      the flag --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.)

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

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

    • R CMD INSTALL --merge-multiarch is now supported on OS X and
      other Unix-alikes using multiple sub-architectures.

    • R CMD INSTALL --libs-only now by default does a test load on
      Unix-alikes as well as on Windows: suppress with --no-test-load.

  UTILITIES:

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

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

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

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

    • There are new options for more rigorous testing by R CMD check
      selected by environment variables - see the ‘Writing R
      Extensions’ manual.

    • 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 DESCRIPTION file to compute information
      about packages, for example reverse dependencies.

    • The defaults for some of the options in R CMD check (described in
      the ‘R Internals’ manual) have changed: checks for unsafe and
      .Internal() calls and for partial matching of arguments in R
      function calls are now done by default.

    • R CMD check has more comprehensive facilities for checking
      compiled code and so gives fewer reports on entry points linked
      into .so/.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).

    • R CMD build has more options for --compact-vignettes: see R CMD
      build --help.

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

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

  DEPRECATED AND DEFUNCT:

    • R CMD Rd2dvi is now defunct: use R CMD Rd2pdf.

    • Options such --max-nsize, --max-vsize and the function
      mem.limits() are now defunct.  (Options --min-nsize and
      --min-vsize remain available.)

    • Use of library.dynam() without specifying all the first three
      arguments is now disallowed.

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

    • The internal functions .readRDS() and .saveRDS() are now defunct.

    • The off-line help() types "postscript" and "ps" are defunct.

    • Sys.putenv(), replaced and deprecated in R 2.5.0, is finally
      removed.

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

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

  INSTALLATION:

    • Building with a positive value of --with-valgrind-instrumentation
      now also instruments logical, complex and raw vectors.

  C-LEVEL FACILITIES:

    • Passing R objects other than atomic vectors, functions, lists and
      environments to .C() is now deprecated and will give a warning.
      Most cases (especially NULL) are actually coding errors.  NULL
      will be disallowed in future.

      .C() now passes a pairlist as a 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.

    • call_R and 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.

  BUG FIXES:

    • str(x, width) now obeys its width argument also for function
      headers and other objects x where deparse() is applied.

    • The convention for x %/% 0L for integer-mode x has been changed
      from 0L to NA_integer_.  (PR#14754)

    • The exportMethods directive in a 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.

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

    • 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).

    • merge() is no longer allowed (in some ways) to create a data
      frame with duplicate column names (which confused PR#14786).

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

    • getAnywhere() found S3 methods as seen from the utils namespace
      and not from the environment from which it was called.

    • selectMethod(f, sig) would not return inherited group methods
      when caching was off (as it is by default).

    • dev.copy2pdf(out.type = "cairo") gave an error.  (PR#14827)

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

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

    • isGeneric() produced an error for primitives that can not have
      methods.

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

    • boxplot(x=x, at=at) with non finite elements in x and non integer
      at could not generate a warning but failed.

    • heatmap(x, symm=TRUE, RowSideColors=*) no longer draws the colors
      in reversed order.

    • predict(<ar>) was incorrect in the multivariate case, for p >= 2.

    • print(x, max=m) is now consistent when x is a "Date"; also the
      “reached ... max.print ..” messages are now consistently using
      single brackets.

    • Closed the <li> tag in pages generated by Rd2HTML(). (PR#14841)

    • Axis tick marks could go out of range when a log scale was used.
      (PR#14833)

    • Signature objects in methods were not allocated as S4 objects
      (caused a problem with trace() reported by Martin Morgan).

CHANGES IN R VERSION 2.14.2:

  NEW FEATURES:

    • The internal untar() (as used by default by R CMD INSTALL) now
      knows about some pax headers which bsdtar (e.g., the default tar
      for Mac OS >= 10.6) can incorrectly include in tar files, and
      will skip them with a warning.

    • 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 ‘large performance benefits can be
      had in many situations’.  This is supported on most but not all R
      platforms.

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

    • The included version of zlib has been updated to 1.2.6.

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

  UTILITIES:

    • R CMD check now reports by default on licenses not according to
      the description in ‘Writing R Extensions’.

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

  PACKAGE INSTALLATION:

    • R CMD INSTALL will now no longer install certain file types from
      inst/doc: these are almost certainly mistakes and for some
      packages are wasting a lot of space.  These are Makefile, files
      generated by running LaTeX, and unless the package uses a
      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.

  BUG FIXES:

    • R configured with --disable-openmp would mistakenly set
      HAVE_OPENMP (internal) and SUPPORT_OPENMP (in Rconfig.h) even
      though no OpenMP flags were populated.

    • The getS3method() implementation had an old computation to find
      an S4 default method.

    • readLines() could overflow a buffer if the last line of the file
      was not terminated.  (PR#14766)

    • R CMD check could miss undocumented S4 objects in packages which
      used S4 classes but did not Depends: methods in their DESCRIPTION
      file.

    • The HTML Help Search page had malformed links.  (PR#14769)

    • A couple of instances of lack of protection of SEXPs have been
      squashed. (PR#14772, PR#14773)

    • image(x, useRaster=TRUE) misbehaved on single-column x.
      (PR#14774)

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

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

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

    • str(*, ....., strict.width="cut") now also obeys list.len = n.
      (Reported by Sören Vogel.)

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

    • pdf(file = NULL) would produce a spurious file named NA.
      (PR#14808)

    • list2env() did not check the type of its envir argument.
      (PR#14807)

    • svg() could segfault if called with a non-existent file path.
      (PR#14790)

    • make install can install to a path containing + characters.
      (PR#14798)

    • The edit() function did not respect the options("keep.source")
      setting. (Reported by Cleridy Lennert.)

    • predict.lm(*, type="terms", terms=*, se.fit=TRUE) did not work.
      (PR#14817)

    • 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 useBytes = TRUE and when all the
      data are ASCII).

    • The C function R_ReplDLLdo1() did not call top-level handlers.

    • 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 ssh which is at
      least close to the behavior in prior OS X versions.

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

    • format.POSIXlt(x) raised an arithmetic exception when x was an
      invalid object of class "POSIXlt" and parts were empty.

    • installed.packages() has some more protection against package
      installs going on in parallel.

    • .Primitive() could be mis-used to call .Internal() entry points.

CHANGES IN R VERSION 2.14.1:

  NEW FEATURES:

    • 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 detectCores(logical = TRUE) on that platform.

    • Reference classes now keep a record of which fields are locked.
      $lock() with no arguments returns the names of the locked fields.

    • HoltWinters() reports a warning rather than an error for some
      optimization failures (where the answer might be a reasonable
      one).

    • tools::dependsOnPkg() now accepts the shorthand dependencies =
      "all".

    • parallel::clusterExport() now allows specification of an
      environment from which to export.

    • The quartz() device now does tilde expansion on its file
      argument.

    • tempfile() on a Unix-alike now takes the process ID into account.
      This is needed with multicore (and as part of 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
      tempfile() simultaneously.

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

    • filled.contour() now accepts infinite values: previously it might
      have generated invalid graphics files (e.g. containing NaN
      values).

  INSTALLATION:

    • On 64-bit Linux systems, configure now only sets LIBnn to lib64
      if /usr/lib64 exists.  This may obviate setting LIBnn explicitly
      on Debian-derived systems.

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

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

  PACKAGE INSTALLATION:

    • 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).

  UTILITIES:

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

  BUG FIXES:

    • stack() now gives an error if no vector column is selected,
      rather than returning a 1-column data frame (contrary to its
      documentation).

    • summary.mlm() did not handle objects where the formula had been
      specified by an expression.  (Reported by Helios de Rosario
      Martinez).

    • tools::deparseLatex(dropBraces=TRUE) could drop text as well as
      braces.

    • colormodel = "grey" (new in R 2.14.0)) did not always work in
      postscript() and pdf().

    • file.append() could return TRUE for failures.  (PR#14727)

    • gzcon() connections are no longer subject to garbage collection:
      it was possible for this to happen when unintended (e.g. when
      calling load()).

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

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

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

    • anyDuplicated(<array>, MARGIN=0) no longer fails.  (Reported by
      Hervé Pagès.)

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

    • There was a sign error in part of the calculations for the
      variance returned by KalmanSmooth().  (PR#14738)

    • pbinom(10, 1e6, 0.01, log.p = TRUE) was NaN thanks to the buggy
      fix to PR#14320 in R 2.11.0.  (PR#14739)

    • RweaveLatex() now emulates auto-printing rather than printing, by
      calling methods::show() when auto-printing would.

    • duplicated() ignored fromLast for a one-column data frame.
      (PR#14742)

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

    • srcfilecopy() has gained a new argument isFile and now records
      the working directory, to allow debuggers to find the original
      source file.  (PR#14826)

    • LaTeX conversion of Rd files did not correctly handle
      preformatted backslashes.  (PR#14751)

    • HTML conversion of Rd files did not handle markup within tabular
      cells properly.  (PR#14708)

    • source() on an empty file with keep.source = TRUE tried to read
      from stdin(), in R 2.14.0 only.  (PR#14753)

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

CHANGES IN R VERSION 2.14.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • 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).

    • The yLineBias of the X11() and 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
      quartz() and pdf().  (Wish of PR#14538.)

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

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

    • :: 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).

    • There is a new package parallel.

      It incorporates (slightly revised) copies of packages multicore
      and 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 parallel, and links explicitly to multicore or
      snow on help pages).

      It also contains support for multiple RNG streams following
      L'Ecuyer _et al_ (2002), with support for both mclapply and snow
      clusters.  This replaces functions like clusterSetupRNG() from
      snow (which are not in 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 ‘R-devel’ version of R).

    • Building PDF manuals (for R itself or packages, e.g. _via_ R CMD
      check) by default requires the LaTeX package inconsolata: see the
      section on ‘Making the manuals’ in the ‘R Installation and
      Administration Manual’.

    • axTicks(*, log=TRUE) has changed in some cases to satisfy the
      documented behavior and be consistent.

  NEW FEATURES:

    • txtProgressBar() can write to an open connection instead of the
      console.

    • Non-portable package names ending in . are no longer allowed.
      Nor are single-character package names (R was already
      disallowed).

    • regexpr() and gregexpr() with perl = TRUE allows Python-style
      named captures.  (Wish and contribution of PR#14518.)

    • The placement of ‘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.)

    • sunflowerplot() now has a formula interface.  (Wish of PR#14541.)

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

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

    • Garbage-collecting an unused input text connection no longer
      gives a warning (since it ‘connects’ to nothing outside R).

    • read.table() and scan() have gained a text argument, to allow
      reading data from a (possibly literal) character string.

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

    • mosaicplot() gains a border argument.  (Wish of PR#14550.)

    • smooth.spline() gains a tol argument which controls how different
      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.)

    • gl() runs faster by avoiding calling factor().

    • The print() method for object.size() accepts B as well as b as an
      abbreviation for ‘bytes’.

    • unlink() gains a force argument to work like rm -f and if
      possible override restrictive permissions.

    • pbirthday() and qbirthday() now use exact calculations for
      coincident = 2.

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

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

    • update.packages() now accepts a character vector of package names
      for the oldPkgs argument.  (Suggestion of Tal Galili.)

    • The special reference class fields .self and .refClassDef are now
      read-only to prevent corrupting the object.

    • 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.)

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

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

    • strptime() now accepts times such as 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.

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

    • The default methods for is.finite(), is.infinite() and is.nan()
      now signal an error if their argument is not an atomic vector.

    • The formula method for plot() no longer places package stats on
      the search path (it loads the namespace instead).

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

    • The one-sided ks.test() allows exact = TRUE to be specified in
      the presence of ties (but the approximate calculation remains the
      default: the ‘exact’ computation makes assumptions known to be
      invalid in the presence of ties).

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

    • Both curve() and the plot() method for functions have a new
      argument xname to facilitate plots such as sin(t) _vs_ t.

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

    • vcov() gains methods for classes "summary.lm" and "summary.glm".

    • The plot() method for class "profile.nls" gains ylab and lty
      arguments, and passes ... on to plot.default.

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

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

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

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

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

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

    • Sys.info() gains a euser component to report the ‘effective’ user
      on OSes which have that concept.

    • The result returned by try() now contains the original error
      condition object as the "condition" attribute.

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

    • Rd markup has a new \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 par() and points().

    • The built-in httpd server now allows access to files in the
      session temporary directory tempdir(), addressed as the /session
      directory on the httpd server.

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

    • There is a new function texi2pdf() in package tools, currently a
      convenience wrapper for texi2dvi(pdf = TRUE).

    • There are two new options for typesetting PDF manuals from Rd
      files.  These are beramono and inconsolata, and used the named
      font for monospaced output. They are intended to be used in
      combination with times, and 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 R_RD4PF to one of the
      other options: see the ‘R Installation and Administration
      Manual’.

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

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

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

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

    • New items User Manuals and 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.

    • Documentation and messages have been standardized to use
      “namespace” rather than “name space”.

    • 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.)

    • Setting the environment variable _R_WARN_ON_LOCKED_BINDINGS_ will
      give a warning if an attempt is made to change a locked binding.

    • \SweaveInput is now supported when generating concordances in
      Sweave().

    • findLineNum() and setBreakpoint() now allow the environment to be
      specified indirectly; the latter gains a clear argument to allow
      it to call untrace().

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

    • The Rd2HTML() function in package tools now has a stylesheet
      argument, allowing pages to be displayed in alternate formats.

    • New function requireNamespace() analogous to require(), returning
      a logical value after attempting to load a namespace.

    • There is a new type of RNG, "L'Ecuyer-CMRG", implementing
      L'Ecuyer (1999)'s ‘combined multiple-recursive generator’
      MRG32k3a.  See the comments on ?RNG.

    • help.search() and ?? can now display vignettes and demos as well
      as help pages.  The new option "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.

    • socketConnection() now has a timeout argument.  It is now
      documented that large values (package snow used a year) do not
      work on some OSes.

    • 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).

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

    • New function psnice() in the tools package to return or change
      the ‘niceness’ of a process.  (Refers to the ‘priority class’ on
      Windows.)

    • list.dirs() gains a recursive argument.

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

    • New utility getElement() for accessing either a list component or
      a slot in an S4 object.

    • stars() gains a col.lines argument, thanks to Dustin Sallings.
      (Wish of PR#14657.)

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

    • 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 _via_
      help.start()'s ‘Packages’ menu.)

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

    • read.dcf() and write.dcf() gain a keep.white argument to indicate
      fields where whitespace should be kept as is.

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

    • readBin() can now read more than 2^31 - 1 bytes in a single call
      (the previously documented limitation).

    • New function regexec() for finding the positions of matches as
      well as all substrings corresponding to parenthesized
      subexpressions of the given regular expression.

    • New function adist() in package utils for computing ‘edit’
      (generalized Levenshtein) distances between strings.

    • Class "raster" gains an is.na method to avoid confusion from the
      misuse of the matrix method (such as PR#14618).

    • The identical() function gains an ignore.bytecode argument to
      control comparison of compiled functions.

    • pmin and pmax now warn if an argument is partially recycled (wish
      of PR#14638).

    • The default for image(useRaster=) is now taken from option
      "preferRaster": for the small print see ?image.

    • str() now displays reference class objects and their fields,
      rather than treating them as classical S4 classes.

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

    • download.file() has an extra argument to pass additional
      command-line options to the non-default methods using
      command-line utilities.

      cacheOK = FALSE is now supported for method = "curl".

    • interaction.plot(*, type = .) now also allows type "o" or "c".

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

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

  GRAPHICS DEVICES:

    • The pdf() device makes use of Flate compression: this is
      controlled by the new logical argument compress, and is enabled
      by default.

    • Devices svg(), cairo_pdf() and cairo_ps() gain a family argument.

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

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

    • The bmp(), jpeg(), png() and tiff() devices now make use of the
      antialias argument for type = "quartz".

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

    • There is a new type X11(type = "dbcairo") which updates the
      screen less frequently: see its help page.

    • The 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.)

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

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

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

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

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

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

    • postscript() with values colormodel = "rgb" and 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.

      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).

    • The postscript() device only includes the definition of the sRGB
      colorspace in the output file for the colormodels which use it.

    • The postscript() and pdf() devices now output greyscale raster
      images (and not RGB) when colormodel = "gray".

    • postscript(colormodel = "gray") now accepts non-grey colours and
      uses their luminance (as pdf() long has).

    • colormodel = "grey" is allowed as an alternative name for
      postscript() and pdf().

    • pdf() in the default sRGB colorspace outputs many fewer changes
      of colorspace, which may speed up rendering in some viewing
      applications.

    • There is a new function 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.

    • For pdf(), maxRasters is increased as needed so the argument is
      no longer used.

  SWEAVE & VIGNETTES:

    • Options keep.source = TRUE, figs.only = FALSE are now the
      default.

    • 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.

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

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

    • R CMD Sweave now supports a --driver option to select the Sweave
      driver: the default is equivalent to --driver=RweaveLatex.

    • R CMD Sweave and R CMD Stangle support options --encoding and
      --options.

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

    • There is a new option pdf.compress controlling whether PDF
      figures are generated using Flate compression (they are by
      default).

    • R CMD Sweave now has a --pdf option to produce a PDF version of
      the processed Sweave document.

    • It is no longer allowed to have two vignettes with the same
      vignette basename (e.g. vig.Rnw and vig.Snw).  (Previously one
      vignette hid the other in the vignette() function.)

  C-LEVEL FACILITIES:

    • Function R_tmpnam2 has been added to the API to allow a temporary
      filename to include a specified extension.

  PACKAGE INSTALLATION:

    • Package DESCRIPTION file field KeepSource forces the package to
      be installed with keep.source = TRUE (or FALSE).  (Suggestion of
      Greg Snow.  Note that as all packages are lazy-loaded, this is
      now only relevant at installation.)

      There are corresponding options --with-keep.source and
      --without-keep.source for R CMD INSTALL.

    • R CMD INSTALL has a new 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 ByteCompile in the DESCRIPTION file.

    • A package R code but without a NAMESPACE file will have a default
      one created at R CMD build or R CMD INSTALL time, so all packages
      will be installed with namespaces.  A consequence of this is that
      .First.lib() functions need to be copied to .onLoad() (usually)
      or .onAttach().  For the time being, if there is an
      auto-generated NAMESPACE file and no .onLoad() nor .onAttach()
      function is found but .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).

    • 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 _pro tem_ some
      exceptions to the warning.)

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

    • installed.packages() now hashes the names of its cache files to
      avoid very rare problems with excessively long path names.
      (PR#14669)

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

  UTILITIES:

    • 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.

    • R CMD check now unpacks tarballs in the same way as R CMD
      INSTALL, including making use of the environment variable
      R_INSTALL_TAR to override the default behaviour.

    • 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.

    • R CMD check now also checks compiled code for symbols
      corresponding to functions which might terminate R or write to
      stdout/stderr instead of the console.

    • R CMD check now uses a pdf() device when checking examples
      (rather than postscript()).

    • R CMD check now checks line-endings of makefiles and
      C/C++/Fortran sources in subdirectories of src as well as in src
      itself.

    • 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 \method markup.  In the
      other rare cases the recommended form is to use a function such
      as coefHclust which would not get confused with a method,
      document that and register it in the NAMESPACE file by
      s3method(coef, hclust, coefHclust).

    • The default for the environment variable _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).

    • Reference output for a vignette can be supplied when checking a
      package by R CMD check: see ‘Writing R Extensions’.

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

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

    • 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.)

  DEPRECATED AND DEFUNCT:

    • require() no longer has a save argument.

    • The gamma argument to hsv(), rainbow(), and rgb2hsv() has been
      removed.

    • The --no-docs option for R CMD build --binary is defunct: use
      --install-args instead.

    • The option --unsafe to R CMD INSTALL is defunct: use the
      identical option --no-lock instead.

    • The entry point pythag formerly in Rmath.h is defunct: use
      instead the C99 function hypot.

    • R CMD build --binary is formally defunct: R CMD INSTALL --build
      has long been the preferred alternative.

    • zip.file.extract() is now defunct: use unzip() or unz() instead.

    • R CMD Rd2dvi without the --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 R CMD Rd2pdf
      will be available.

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

    • Forms like binomial(link = "link") for GLM families deprecated
      since R 2.4.0 are now defunct.

    • The declarativeOnly argument to loadNamespace() (not relevant
      since R 2.13.0) has been removed.

    • Use of 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 chname in library.dynam() with the extension .so or .dll
      (which is clearly not allowed according to the help page) is
      deprecated.  This also applies to library.dynam.unload() and
      useDynLib directives in NAMESPACE files.

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

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

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

    • Using a false value for the DESCRIPTION field LazyLoad is
      deprecated.

  INSTALLATION:

    • The base and recommended packages are now byte-compiled
      (equivalent to make bytecode in R 2.13.x).

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

    • The 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.)

    • The .afm files in package grDevices are now installed as
      compressed files (as long done on Windows), saving ca 2MB on the
      installed size.

    • 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 --without-x.)

    • Configure will try to use -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.)

    • The system call times is required.

    • The C99 functions acosh, asinh, atanh, snprintf and vsnprintf are
      now required.

    • There is no longer support for making DVI manuals _via_ make dvi,
      make install-dvi and similar.  Only PDF manuals are supported (to
      allow the use of fonts which are only available for PDF.)

    • The configure arguments used during configuration of R are
      included as a comment in 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.

    • Framework installation now supports DESTDIR (Mac OS X only).

    • Java detection (R CMD javareconf) works around bogus
      java.library.path property in recent Oracle Java binaries.

  BUG FIXES:

    • The locale category LC_MONETARY was only being set on startup on
      Windows: that is now done on Unix-alikes where supported.

    • 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.

    • The formula methods for lines(), points() and text() now work
      even if package stats is not on the search path.

    • 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 className() and multipleClasses() are
      related tools for programming.

    • Work around an issue in Linux (a system select call resetting tv)
      which prevented internet operations from timing out properly.

    • Several stack trampling and overflow issues have been fixed in
      TRE, triggered by agrep and friends with long patterns.
      (PR#14627)

    • (“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.

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

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

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

    • The X11() device's cairo back-end produced incorrect capture
      snapshot images on big-endian machines.

    • loglin() gave a spurious error when argument margin consisted of
      a single element of length one.  (PR#14690)

    • loess() is better protected against misuse, e.g. zero-length
      span.  (PR#14691)

    • HoltWinters() checks that the optimization succeeded. (PR#14694)

    • 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.

    • round(x, -Inf) now does something sensible (return zero rather
      than NA).

    • signif(x, -Inf) now behaves as documented (signif(x, 1)) rather
      than giving zero.

    • The "table" method for Axis() hardcoded side = 1, hence calls to
      plot(<vector>, <table>) labelled the wrong axis. (PR#14699)

    • Creating a connection might fail under gctorture(TRUE).

    • stack() and unstack() converted character columns to factors.

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

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

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

    • 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. spaces and slashes.

    • A late change in R 2.13.2 broke \Sexpr expressions in Rd files.

    • The creation of ticks on log axes (including by 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 axTicks(), where with axis limits c(0.2, 88)
      the tick for 0.2 was sometimes omitted.

    • qgamma() for small shape underflows to 0 rather than sometimes
      giving NaN.  (PR#8528, PR#14710)

    • mapply() now gives an explicit error message (rather than an
      obscure one) if inputs of zero and positive length are mixed.

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

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

CHANGES IN R VERSION 2.13.2:

  NEW FEATURES:

    • mem.limits() now reports values larger than the maximum integer
      (previously documented to be reported as NA), and allows larger
      values to be set, including Inf to remove the limit.

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

    • untar2() now works around errors generated with tar files that
      use more than the standard 6 digits for the checksum. (PR#14654)

    • install.packages() with Ncpus > 1 guards against simultaneous
      installation of indirect dependencies as well as direct ones.

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

    • 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 colormodel ="rgb".

    • The default for pdf(maxRasters=) has been increased from 64 to
      1000.

    • readBin() now warns if signed = FALSE is used inappropriately
      (rather than being silently ignored).

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

    • 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.

  INSTALLATION:

    • It is possible to build in src/extra/xdr on more platforms.
      (Needed since glibc 2.14 hides its RPC implementation.)

    • configure will find the Sun TI-RPC implementation of xdr (in
      libtirpc) provided its header files are in the search path: see
      the ‘R Installation and Administration Manual’.

  PACKAGE INSTALLATION:

    • Using a broad exportPattern directive in a NAMESPACE file is no
      longer allowed to export internal objects such as .onLoad and
      .__S3MethodsTable__. .

      These are also excluded from imports, along with .First.lib.

  BUG FIXES:

    • 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).

    • 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.

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

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

    • Plotting pch = '.' now guarantees at least a one-pixel dot if cex
      > 0.

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

    • The HTML generated by Rd2HTML() comes closer to being standards
      compliant.

    • filter(x, recursive = TRUE) gave incorrect results on a series
      containing NAs.  (Spotted by Bill Dunlap.)

    • Profiling stats::mle() fits with a fixed parameter was not
      supported.  (PR#14646)

    • retracemem() was still using positional matching.  (PR#14650)

    • The quantile method for "ecdf" objects now works and is
      documented.

    • xtabs(~ .., ..., sparse=TRUE) now also works together with an
      exclude = .. specification.

    • decompose() computed an incorrect seasonal component for time
      series with odd frequencies.

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

    • .hasSlot() wrongly gave FALSE in some cases.

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

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

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

    • In rare cases ks.test() could return a p-value very slightly less
      than 0 by rounding error.  (PR#14671)

    • If trunc() was called on a "POSIXlt" vector and the result was
      subsetted, all but the first element was converted to NA.
      (PR#14679)

    • cbind() and rbind() could cause memory corruption when used on a
      combination of raw and logical/integer vectors.

CHANGES IN R VERSION 2.13.1:

  NEW FEATURES:

    • iconv() no longer translates NA strings as "NA".

    • 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)

    • RShowDoc() can now display the licences shipped with R, e.g.
      RShowDoc("GPL-3").

    • New wrapper function showNonASCIIfile() in package tools.

    • nobs() now has a "mle" method in package stats4.

    • trace() now deals correctly with S4 reference classes and
      corresponding reference methods (e.g., $trace()) have been added.

    • xz has been updated to 5.0.3 (very minor bugfix release).

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

    • cairo_ps(onefile = TRUE) generates encapsulated EPS on platforms
      with cairo >= 1.6.

    • Binary reads (e.g. by readChar() and readBin()) are now supported
      on clipboard connections.  (Wish of PR#14593.)

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

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

  INSTALLATION:

    • Building the vignette PDFs in packages grid and utils is now part
      of running make from an SVN checkout on a Unix-alike: a separate
      make vignettes step is no longer required.

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

    • make install-strip failed under some configuration options.

    • Packages can customize non-standard installation of compiled code
      via a 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.

  SWEAVE & VIGNETTES:

    • Sweave() and Stangle() gain an encoding argument to specify the
      encoding of the vignette sources if the latter do not contain a
      \usepackage[]{inputenc} statement specifying a single input
      encoding.

    • There is a new Sweave option 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.

    • Sweave custom graphics devices can have a custom function
      foo.off() to shut them down.

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

    • The Rtangle() driver has a new option 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).

    • 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 .R file.

  LICENCE:

    • No parts of R are now licensed solely under GPL-2.  The licences
      for packages rpart and survival have been changed, which means
      that the licence terms for R as distributed are GPL-2 | GPL-3.

  DEPRECATED AND DEFUNCT:

    • The internal functions .readRDS() and .saveRDS() are now
      deprecated in favour of the public functions readRDS() and
      saveRDS() introduced in R 2.13.0.

    • Switching off lazy-loading of code _via_ the LazyLoad field of
      the DESCRIPTION file is now deprecated.  In future all packages
      will be lazy-loaded.

    • The off-line help() types "postscript" and "ps" are deprecated.

  UTILITIES:

    • R CMD check on a multi-architecture installation now skips the
      user's .Renviron file for the architecture-specific tests (which
      do read the architecture-specific Renviron.site files).  This is
      consistent with single-architecture checks, which use
      --no-environ.

    • R CMD build now looks for DESCRIPTION fields BuildResaveData and
      BuildKeepEmpty for per-package overrides.  See ‘Writing R
      Extensions’.

  BUG FIXES:

    • 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)

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

    • dataframe[[row,col]] now dispatches on [[ methods for the
      selected column.  (Spotted by Bill Dunlap).

    • sort.int() would strip the class of an object, but leave its
      object bit set.  (Reported by Bill Dunlap.)

    • pbirthday() and qbirthday() did not implement the algorithm
      exactly as given in their reference and so were unnecessarily
      inaccurate.

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

      The description of the problem was inaccurate: the probability is
      a tail probability (‘2 _or more_ people share a birthday’)

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

    • seek(origin = "current") incorrectly reported it was not
      implemented for a gzfile() connection.

    • c(), unlist(), cbind() and rbind() could silently overflow the
      maximum vector length and cause a segfault.  (PR#14571)

    • The fonts argument to X11(type = "Xlib") was being ignored.

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

    • Parsed text containing embedded newlines was printed incorrectly
      by as.character.srcref().  (Reported by Hadley Wickham.)

    • 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.)

    • fields = list() failed for setRefClass().  (Reported by Michael
      Lawrence.)

    • Reference classes could not redefine an inherited field which had
      class "ANY". (Reported by Janko Thyson.)

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

    • addmargins() called numeric(apos) rather than
      numeric(length(apos)).

    • The HTML help search sometimes produced bad links.  (PR#14608)

    • Command completion will no longer be broken if tail.default() is
      redefined by the user. (Problem reported by Henrik Bengtsson.)

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

    • isClass() used its own namespace as the default of the where
      argument inadvertently.

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

    • 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.

CHANGES IN R VERSION 2.13.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • replicate() (by default) and 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.

    • 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 “scientific” entry below.)  This affects
      _many_ *.Rout.save checks in packages.

  NEW FEATURES:

    • normalizePath() has been moved to the base package (from utils):
      this is so it can be used by library() and friends.

      It now does tilde expansion.

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

    • 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 model.frame).

    • reformulate() gains a intercept argument.

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

    • Names used by c(), unlist(), cbind() and rbind() are marked with
      an encoding when this can be ascertained.

    • 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.

    • system.file() gains a mustWork argument (suggestion of Bill
      Dunlap).

    • new.env(hash = TRUE) is now the default.

    • list2env(envir = NULL) defaults to hashing (with a suitably sized
      environment) for lists of more than 100 elements.

    • text() gains a formula method.

    • IQR() now has a type argument which is passed to quantile().

    • as.vector(), as.double() etc duplicate less when they leave the
      mode unchanged but remove attributes.

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

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

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

    • setRepositories() gains an addURLs argument.

    • chisq.test() now also returns a stdres component, for
      standardized residuals (which have unit variance, unlike the
      Pearson residuals).

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

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

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

    • 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).

    • options("install.lock") may be set to FALSE so that
      install.packages() defaults to --no-lock installs, or (on
      Windows) to TRUE so that binary installs implement locking.

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

    • sapply() gets a new option simplify = "array" which returns a
      “higher rank” array instead of just a matrix when FUN() returns a
      dim() length of two or more.

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

    • aperm() becomes S3 generic and gets a table method which
      preserves the class.

    • merge() and as.hclust() methods for objects of class "dendrogram"
      are now provided.

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

    • str() now has a method for class "Date" analogous to that for
      class "POSIXt".

    • New function file.link() to create hard links on those file
      systems (POSIX, NTFS but not FAT) that support them.

    • New Summary() group method for class "ordered" implements min(),
      max() and range() for ordered factors.

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

    • There is a new option "browserNLdisabled" to disable the use of
      an empty (e.g. via the ‘Return’ key) as a synonym for c in
      browser() or n under debug().  (Wish of PR#14472.)

    • example() gains optional new arguments character.only and
      give.lines enabling programmatic exploration.

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

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

      saveRDS() supports compress = "xz".

    • 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 read.dcf(), dput(), dump(), load(),
      parse(), readBin(), readChar(), readLines(), save(), writeBin(),
      writeChar(), writeLines(), .readRDS(), .saveRDS() and
      tools::parse_Rd(), as well as functions calling these.

    • Public functions find.package() and path.package() replace the
      internal dot-name versions.

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

    • 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 function(url, query, body, headers,
      ...).

    • file.edit() gains a fileEncoding argument to specify the encoding
      of the file(s).

    • 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.)

    • isSeekable() now returns FALSE on connections which have
      non-default encoding.  Although documented to record if ‘in
      principle’ the connection supports seeking, it seems safer to
      report FALSE when it may not work.

    • R CMD REMOVE and remove.packages() now remove file 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.)

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

    • There is a simple zip() function, as wrapper for an external zip
      command.

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

    • The primitive function c() is now of type BUILTIN.

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

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

    • xz has been updated to 5.0.1 (very minor bugfix release).

    • image() has gained a logical 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 FALSE.

    • list.files()/dir() gains a new argument include.dirs() to include
      directories in the listing when recursive = TRUE.

    • New function list.dirs() lists all directories, (even empty
      ones).

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

    • Sys.umask() now accepts mode = NA and returns the current umask
      value (visibly) without changing it.

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

    • as.raster() no longer fails for vectors or matrices containing
      NAs.

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

    • Package tools has a new function compactPDF() to try to reduce
      the size of PDF files _via_ qpdf or gs.

    • tar() has a new argument extra_flags.

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

    • The previously internal function create.post() is now exported
      from utils, and the documentation for bug.report() and
      help.request() now refer to that for create.post().

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

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

    • The default for options("mailer") is now "mailto" on all
      platforms.

    • unlink() now does tilde-expansion (like most other file
      functions).

    • file.rename() now allows vector arguments (of the same length).

    • The "glm" method for logLik() now returns an "nobs" attribute
      (which stats4::BIC() assumed it did).

      The "nls" method for logLik() gave incorrect results for zero
      weights.

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

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

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

    • 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 stdout).

    • The startup environment variables R_ENVIRON_USER, R_ENVIRON,
      R_PROFILE_USER and 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.)

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

    • smooth.spline() is somewhat faster.  With cv=NA it allows some
      leverage computations to be skipped,

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

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

    • Package compiler is now provided as a standard package.  See
      ?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 ‘R
      Installation and Administration Manual’ for how to compile the
      base and recommended packages.

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

    • There is an additional marked encoding "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: useBytes = TRUE
      is automatically selected in functions such as writeBin(),
      writeLines(), grep() and strsplit().

      Only a few character operations are supported (such as substr()).

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

    • The new function removeSource() removes the internally stored
      source from a function.

    • "srcref" attributes now include two additional line number
      values, recording the line numbers in the order they were parsed.

    • New functions have been added for source reference access:
      getSrcFilename(), getSrcDirectory(), getSrcLocation() and
      getSrcref().

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

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

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

    • factanal() now returns the rotation matrix if a rotation such as
      "promax" is used, and hence factor correlations are displayed.
      (Wish of PR#12754.)

    • The gctorture2() function provides a more refined interface to
      the GC torture process.  Environment variables R_GCTORTURE,
      R_GCTORTURE_WAIT, and R_GCTORTURE_INHIBIT_RELEASE can also be
      used to control the GC torture process.

    • file.copy(from, to) no longer regards it as an error to supply a
      zero-length from: it now simply does nothing.

    • rstandard.glm() gains a type argument which can be used to
      request standardized Pearson residuals.

    • A start on a Turkish translation, thanks to Murat Alkan.

    • .libPaths() calls 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.

    • download.file() can be now used with external methods even if
      there are spaces in the URL or the target filename.

    • The first formal argument of .C(), .Fortran(), .Call() and
      .External() is now referred to a .NAME rather than name: however
      actual calls should have an unnamed first argument.

  SWEAVE CHANGES:

    • Sweave() has options to produce PNG and JPEG figures, and to use
      a custom function to open a graphics device (see ?RweaveLatex).
      (Based in part on the contribution of PR#14418.)

    • The default for Sweave() is to produce only PDF figures (rather
      than both EPS and PDF).

    • Environment variable SWEAVE_OPTIONS can be used to supply
      defaults for existing or new options to be applied after the
      Sweave driver setup has been run.

    • The Sweave manual is now included as a vignette in the utils
      package.

    • Sweave() handles keep.source=TRUE much better: it could duplicate
      some lines and omit comments. (Reported by John Maindonald and
      others.)

  C-LEVEL FACILITIES:

    • Because they use a C99 interface which a C++ compiler is not
      required to support, Rvprintf and REvprintf are only defined by
      R_ext/Print.h in C++ code if the macro R_USE_C99_IN_CXX is
      defined when it is included.

    • pythag duplicated the C99 function hypot.  It is no longer
      provided, but is used as a substitute for hypot in the very
      unlikely event that the latter is not available.

    • R_inspect(obj) and R_inspect3(obj, deep, pvec) are (hidden)
      C-level entry points to the internal inspect function and can be
      used for C-level debugging (e.g., in conjunction with the p
      command in gdb).

    • Compiling R with --enable-strict-barrier now also enables
      additional checking for use of unprotected objects. In
      combination with gctorture() or gctorture2() and a C-level
      debugger this can be useful for tracking down memory protection
      issues.

  UTILITIES:

    • R CMD Rdiff is now implemented in R on Unix-alikes (as it has
      been on Windows since R 2.12.0).

    • 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 --install-args to pass arguments to R CMD
      INSTALL for --build (but not when installing to rebuild
      vignettes).

      There is new option, --resave-data, to call
      tools::resaveRdaFiles() on the data directory, to compress
      tabular files (.tab, .csv etc) and to convert .R files to .rda
      files.  The default, --resave-data=gzip, is to do so in a way
      compatible even with years-old versions of R, but better
      compression is given by --resave-data=best, requiring R >=
      2.10.0.

      It now adds a datalist file for data directories of more than
      1Mb.

      Patterns in .Rbuildignore are now also matched against all
      directory names (including those of empty directories).

      There is a new option, --compact-vignettes, to try reducing the
      size of PDF files in the inst/doc directory.  Currently this
      tries qpdf: other options may be used in future.

      When re-building vignettes and a inst/doc/Makefile file is found,
      make clean is run if the makefile has a 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 .R_cache directory.

      Empty directories are now removed unless the option
      --keep-empty-dirs is given (and a few packages do deliberately
      include empty directories).

      If there is a field BuildVignettes in the package DESCRIPTION
      file with a false value, re-building the vignettes is skipped.

    • R CMD check now also checks for filenames that are
      case-insensitive matches to Windows' reserved file names with
      extensions, such as nul.Rd, as these have caused problems on some
      Windows systems.

      It checks for inefficiently saved data/*.rda and 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
      _R_CHECK_COMPACT_DATA2_ to TRUE.

      The types of files in the data directory are now checked, as
      packages are _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 tools::checkVignettes(), it
      calls tools::buildVignettes() to see if the vignettes can be
      re-built as they would be by R CMD build.  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 00check.log file is a more complete record of what is output
      to 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).

      .tar.xz compressed tarballs are now allowed, if tar supports them
      (and setting environment variable TAR to internal ensures so on
      all platforms).

    • R CMD check now warns if it finds inst/doc/makefile, and R CMD
      build renames such a file to inst/doc/Makefile.

  INSTALLATION:

    • Installing R no longer tries to find perl, and R CMD no longer
      tries to substitute a full path for awk nor perl - this was a
      legacy from the days when they were used by R itself.  Because a
      couple of packages do use awk, it is set as the make (rather than
      environment) variable AWK.

    • make check will now fail if there are differences from the
      reference output when testing package examples and if environment
      variable R_STRICT_PACKAGE_CHECK is set to a true value.

    • The C99 double complex type is now required.

      The C99 complex trigonometric functions (such as csin) are not
      currently required (FreeBSD lacks most of them): substitutes are
      used if they are missing.

    • The C99 system call va_copy is now required.

    • If environment variable R_LD_LIBRARY_PATH is set during
      configuration (for example in config.site) it is used unchanged
      in file etc/ldpaths rather than being appended to.

    • configure looks for support for OpenMP and if found compiles R
      with appropriate flags and also makes them available for use in
      packages: see ‘Writing R Extensions’.

      This is currently experimental, and is only used in R with a
      single thread for colSums() and colMeans().  Expect it to be more
      widely used in later versions of R.

      This can be disabled by the --disable-openmp flag.

  PACKAGE INSTALLATION:

    • R CMD INSTALL --clean now removes copies of a src directory which
      are created when multiple sub-architectures are in use.
      (Following a comment from Berwin Turlach.)

    • File R.css is now installed on a per-package basis (in the
      package's 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.

    • A top-level file .Rinstignore in the package sources can list (in
      the same way as .Rbuildignore) files under 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 inst/doc,
      but they may not need to be installed.)

    • R CMD INSTALL has a new option --compact-docs to compact any PDFs
      under the inst/doc directory.  Currently this uses qpdf, which
      must be installed (see ‘Writing R Extensions’).

    • There is a new option --lock which can be used to cancel the
      effect of --no-lock or --pkglock earlier on the command line.

    • Option --pkglock can now be used with more than one package, and
      is now the default if only one package is specified.

    • Argument lock of install.packages() can now be use for Mac binary
      installs as well as for Windows ones.  The value "pkglock" is now
      accepted, as well as TRUE and FALSE (the default).

    • There is a new option --no-clean-on-error for R CMD INSTALL to
      retain a partially installed package for forensic analysis.

    • Packages with names ending in . are not portable since Windows
      does not work correctly with such directory names.  This is now
      warned about in R CMD check, and will not be allowed in R 2.14.x.

    • The vignette indices are more comprehensive (in the style of
      browseVignetttes()).

  DEPRECATED & DEFUNCT:

    • require(save = TRUE) is defunct, and use of the save argument is
      deprecated.

    • R CMD check --no-latex is defunct: use --no-manual instead.

    • R CMD Sd2Rd is defunct.

    • The gamma argument to hsv(), rainbow(), and rgb2hsv() is
      deprecated and no longer has any effect.

    • The previous options for R CMD build --binary (--auto-zip,
      --use-zip-data and --no-docs) are deprecated (or defunct): use
      the new option --install-args instead.

    • When a character value is used for the EXPR argument in switch(),
      only a single unnamed alternative value is now allowed.

    • The wrapper utils::link.html.help() is no longer available.

    • Zip-ing data sets in packages (and hence R CMD INSTALL options
      --use-zip-data and --auto-zip, as well as the ZipData: yes field
      in a 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.

    • The ‘experimental’ alternative specification of a namespace via
      .Export() etc is now defunct.

    • The option --unsafe to R CMD INSTALL is deprecated: use the
      identical option --no-lock instead.

    • The entry point pythag in Rmath.h is deprecated in favour of the
      C99 function hypot.  A wrapper for hypot is provided for R 2.13.x
      only.

    • Direct access to the "source" attribute of functions is
      deprecated; use deparse(fn, control="useSource") to access it,
      and removeSource(fn) to remove it.

    • R CMD build --binary is now formally deprecated: R CMD INSTALL
      --build has long been the preferred alternative.

    • Single-character package names are deprecated (and R is already
      disallowed to avoid confusion in Depends: fields).

  BUG FIXES:

    • drop.terms and the [ method for class "terms" no longer add back
      an intercept.  (Reported by Niels Hansen.)

    • aggregate preserves the class of a column (e.g. a date) under
      some circumstances where it discarded the class previously.

    • p.adjust() now always returns a vector result, as documented.  In
      previous versions it copied attributes (such as dimensions) from
      the p argument: now it only copies names.

    • 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.)

    • The str() method for class "POSIXt" now gives sensible output for
      0-length input.

    • The one- and two-argument complex maths functions failed to warn
      if NAs were generated (as their numeric analogues do).

    • Added .requireCachedGenerics to the dont.mind list for library()
      to avoid warnings about duplicates.

    • $<-.data.frame messed with the class attribute, breaking any S4
      subclass.  The S4 data.frame class now has its own $<- method,
      and turns dispatch on for this primitive.

    • Map() did not look up a character argument f in the correct
      frame, thanks to lazy evaluation.  (PR#14495)

    • file.copy() did not tilde-expand from and to when to was a
      directory.  (PR#14507)

    • It was possible (but very rare) for the loading test in 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.

    • plot(<formula>, data=<matrix>,..) now works in more cases;
      similarly for points(), lines() and text().

    • edit.default() contained a manual dispatch for matrices (the
      "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.

    • data.frame(check.rows = TRUE) sometimes worked when it should
      have detected an error.  (PR#14530)

    • scan(sep= , strip.white=TRUE) sometimes stripped trailing spaces
      from within quoted strings.  (The real bug in PR#14522.)

    • The rank-correlation methods for cor() and cov() with 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.

    • The perpendicular adjustment used in placing text and expressions
      in the margins of plots was not scaled by par("mex"). (Part of
      PR#14532.)

    • 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.

    • The browser (invoked by debug(), browser() or otherwise) would
      display attributes such as "wholeSrcref" that were intended for
      internal use only.

    • 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 rc.settings(files = TRUE)).

    • Inside uniroot(f, ...), -Inf function values are now replaced by
      a maximally *negative* value.

    • rowsum() could silently over/underflow on integer inputs
      (reported by Bill Dunlap).

    • as.matrix() did not handle "dist" objects with zero rows.

CHANGES IN R VERSION 2.12.2 patched:

  NEW FEATURES:

    • max() and min() work harder to ensure that NA has precedence over
      NaN, so e.g. min(NaN, NA) is NA.  (This was not previously
      documented except for within a single numeric vector, where
      compiler optimizations often defeated the code.)

  BUG FIXES:

    • A change to the C function R_tryEval had broken error messages in
      S4 method selection; the error message is now printed.

    • PDF output with a non-RGB color model used RGB for the line
      stroke color.  (PR#14511)

    • stats4::BIC() assumed without checking that an object of class
      "logLik" has an "nobs" attribute: glm() fits did not and so BIC()
      failed for them.

    • In some circumstances a one-sided mantelhaen.test() reported the
      p-value for the wrong tail.  (PR#14514)

    • Passing the invalid value lty = NULL to axis() sent an invalid
      value to the graphics device, and might cause the device to
      segfault.

    • Sweave() with concordance=TRUE could lead to invalid PDF files;
      Sweave.sty has been updated to avoid this.

    • Non-ASCII characters in the titles of help pages were not
      rendered properly in some locales, and could cause errors or
      warnings.

    • checkRd() gave a spurious error if the \href macro was used.

CHANGES IN R VERSION 2.12.2:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • Complex arithmetic (notably z^n for complex z and integer 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 gcc 4.5.x at the default -O2 optimization (but not at -O).

    • There is a workaround for crashes seen with several packages on
      systems using zlib 1.2.5: see the INSTALLATION section.

  NEW FEATURES:

    • PCRE has been updated to 8.12 (two bug-fix releases since 8.10).

    • rep(), seq(), seq.int() and seq_len() report more often when the
      first element is taken of an argument of incorrect length.

    • The Cocoa back-end for the quartz() graphics device on Mac OS X
      provides a way to disable event loop processing temporarily
      (useful, e.g., for forked instances of R).

    • kernel()'s default for m was not appropriate if coef was a set of
      coefficients.  (Reported by Pierre Chausse.)

    • bug.report() has been updated for the current R bug tracker,
      which does not accept emailed submissions.

    • R CMD check now checks for the correct use of $(LAPACK_LIBS) (as
      well as $(BLAS_LIBS)), since several CRAN recent submissions have
      ignored ‘Writing R Extensions’.

  INSTALLATION:

    • The zlib sources in the distribution are now built with all
      symbols remapped: this is intended to avoid problems seen with
      packages such as XML and rggobi which link to zlib.so.1 on
      systems using zlib 1.2.5.

    • The default for FFLAGS and FCFLAGS with gfortran on x86_64 Linux
      has been changed back to -g -O2: however, setting -g -O may still
      be needed for gfortran 4.3.x.

  PACKAGE INSTALLATION:

    • A LazyDataCompression field in the DESCRIPTION file will be used
      to set the value for the --data-compress option of R CMD INSTALL.

    • Files R/sysdata.rda of more than 1Mb are now stored in the
      lazyload database using xz compression: this for example halves
      the installed size of package Imap.

    • R CMD INSTALL now ensures that directories installed from inst
      have search permission for everyone.

      It no longer installs files inst/doc/Rplots.ps and
      inst/doc/Rplots.pdf.  These are almost certainly left-overs from
      Sweave runs, and are often large.

  DEPRECATED & DEFUNCT:

    • The ‘experimental’ alternative specification of a namespace via
      .Export() etc is now deprecated.

    • zip.file.extract() is now deprecated.

    • Zip-ing data sets in packages (and hence R CMD INSTALL
      --use-zip-data and the ZipData: yes field in a DESCRIPTION file)
      is deprecated: using efficiently compressed .rda images and
      lazy-loading of data has superseded it.

  BUG FIXES:

    • 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).

    • If the filename extension (usually .Rnw) was not included in a
      call to Sweave(), source references would not work properly and
      the keep.source option failed.  (PR#14459)

    • format.data.frame() now keeps zero character column names.

    • pretty(x) no longer raises an error when x contains solely
      non-finite values. (PR#14468)

    • The plot.TukeyHSD() function now uses a line width of 0.5 for its
      reference lines rather than lwd = 0 (which caused problems for
      some PDF and PostScript viewers).

    • The big.mark argument to prettyNum(), format(), etc. was inserted
      reversed if it was more than one character long.

    • R CMD check failed to check the filenames under man for Windows'
      reserved names.

    • The "Date" and "POSIXt" methods for seq() could overshoot when to
      was supplied and by was specified in months or years.

    • The internal method of untar() now restores hard links as file
      copies rather than symbolic links (which did not work for
      cross-directory links).

    • 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.)

    • combn(n, m) now behaves more regularly for the border case m = 0.
      (PR#14473)

    • The rendering of numbers in plotmath expressions (e.g.
      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)

    • The methods of napredict() and naresid() for 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.)

    • weighted.residuals(drop0=TRUE) returned a vector when the
      residuals were a matrix (e.g. those of class "mlm").  (Reported
      by Bill Dunlap.)

    • Package HTML index files <pkg>/html/00Index.html were generated
      with a stylesheet reference that was not correct for static
      browsing in libraries.

    • ccf(na.action = na.pass) was not implemented.

    • The parser accepted some incorrect numeric constants, e.g. 20x2.
      (Reported by Olaf Mersmann.)

    • format(*, zero.print) did not always replace the full zero parts.

    • Fixes for subsetting or subassignment of "raster" objects when
      not both i and j are specified.

    • R CMD INSTALL was not always respecting the ZipData: yes field of
      a DESCRIPTION file (although this is frequently incorrectly
      specified for packages with no data or which specify lazy-loading
      of data).

      R CMD INSTALL --use-zip-data was incorrectly implemented as
      --use-zipdata since R 2.9.0.

    • source(file, echo=TRUE) could fail if the file contained #line
      directives.  It now recovers more gracefully, but may still
      display the wrong line if the directive gives incorrect
      information.

    • atan(1i) returned NaN+Infi (rather than 0+Infi) on platforms
      without C99 complex support.

    • library() failed to cache S4 metadata (unlike loadNamespace())
      causing failures in S4-using packages without a namespace (e.g.
      those using reference classes).

    • The function qlogis(lp, log.p=TRUE) no longer prematurely
      overflows to Inf when exp(lp) is close to 1.

    • Updating S4 methods for a group generic function requires
      resetting the methods tables for the members of the group (patch
      contributed by Martin Morgan).

    • In some circumstances (including for package XML), R CMD INSTALL
      installed version-control directories from source packages.

    • Added PROTECT calls to some constructed expressions used in C
      level eval calls.

    • utils:::create.post() (used by bug.report() and help.request())
      failed to quote arguments to the mailer, and so often failed.

    • bug.report() was naive about how to extract maintainer email
      addresses from package descriptions, so would often try mailing
      to incorrect addresses.

    • debugger() could fail to read the environment of a call to a
      function with a ... argument.  (Reported by Charlie Roosen.)

    • prettyNum(c(1i, NA), drop0=TRUE) or str(NA_complex_) now work
      correctly.

CHANGES IN R VERSION 2.12.1:

  NEW FEATURES:

    • The DVI/PDF reference manual now includes the help pages for all
      the standard packages: splines, stats4 and tcltk were previously
      omitted (intentionally).

    • <URL: http://www.rforge.net> has been added to the default set of
      repositories known to setRepositories().

    • xz-utils has been updated to version 5.0.0.

    • reshape() now makes use of sep when forming names during
      reshaping to wide format.  (PR#14435)

    • legend() allows the length of lines to be set by the end user
      _via_ the new argument seg.len.

    • New S4 reference class utility methods copy(), field(),
      getRefClass() and getClass() have been added to package methods.

    • When a character value is used for the EXPR argument in switch(),
      a warning is given if more than one unnamed alternative value is
      given.  This will become an error in R 2.13.0.

    • StructTS(type = "BSM") now allows series with just two seasons.
      (Reported by Birgit Erni.)

  INSTALLATION:

    • 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.

    • Variable 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.)

  BUG FIXES:

    • seq.int() no longer sometimes evaluates arguments twice.
      (PR#14388)

    • The data.frame method of format() failed if a column name was
      longer than 256 bytes (the maximum length allowed for an R name).

    • predict(<lm object>, type ="terms", ...) failed if both terms and
      interval were specified.  (Reported by Bill Dunlap.)

      Also, if se.fit = TRUE the standard errors were reported for all
      terms, not just those selected by a non-null terms.

    • The TRE regular expressions engine could terminate R rather than
      give an error when given certain invalid regular expressions.
      (PR#14398)

    • cmdscale(eig = TRUE) was documented to return n-1 eigenvalues but
      in fact only returned k.  It now returns all n eigenvalues.

      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
      ac).

    • promptClass() in package methods now works for reference classes
      and gives a suitably specialized skeleton of documentation.

      Also, callSuper() now works via the methods() invocation as well
      as for initially specified methods.

    • download.file() could leave the destination file open if the URL
      was not able to be opened.  (PR#14414)

    • Assignment of an environment to functions or as an attribute to
      other objects now works for S4 subclasses of "environment".

    • Use of [[<- for S4 subclasses of "environment" generated an
      infinite recursion from the method.  The method has been replaced
      by internal code.

    • In a reference class S4 method, callSuper() now works in
      initialize() methods when there is no explicit superclass method.

    • ! dropped attributes such as names and dimensions from a
      length-zero argument.  (PR#14424)

    • When list2env() created an environment it was missing a PROTECT
      call and so was vulnerable to garbage collection.

    • Sweave() with keep.source=TRUE dropped comments at the start and
      end of code chunks.  It could also fail when \SweaveInput was
      combined with named chunks.

    • The Fortran code used by nls(algorithm = "port") could
      infinite-loop when compiled with high optimization on a modern
      version of gcc, and SAFE_FFLAGS is now used to make this less
      likely.  (PR#14427, seen with 32-bit Windows using gcc 4.5.0 used
      from R 2.12.0.)

    • sapply() with default simplify = TRUE and mapply() with default
      SIMPLIFY = TRUE wrongly simplified language-like results, as,
      e.g., in mapply(1:2, c(3,7), FUN = function(i,j) call(':',i,j)).

    • Backreferences to undefined patterns in [g]sub(pcre = TRUE) could
      cause a segfault.  (PR#14431)

    • The format() (and hence the print()) method for class "Date"
      rounded fractional dates towards zero: it now always rounds them
      down.

    • Reference S4 class creation could generate ambiguous inheritance
      patterns under very special circumstances.

    • [[<- turned S4 subclasses of "environment" into plain
      environments.

    • Long titles for help pages were truncated in package indices and
      a few other places.

    • Additional utilities now work correctly with S4 subclasses of
      "environment" (rm, locking tools and active bindings).

    • spec.ar() now also work for the "ols" method.  (Reported by
      Hans-Ruedi Kuensch.)

    • The initialization of objects from S4 subclasses of "environment"
      now allocates a new environment object.

    • R CMD check has more protection against (probably erroneous)
      example or test output which is invalid in the current locale.

    • qr.X() with column names and pivoting now also pivots the column
      names.  (PR#14438)

    • unit.pmax() and unit.pmin() in package grid gave incorrect
      results when all inputs were of length 1.  (PR#14443)

    • The parser for 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.)

    • Fix for subsetting of "raster" objects when only one of i or j is
      specified.

    • grid.raster() in package grid did not accept "nativeRaster"
      objects (like rasterImage() does).

    • Rendering raster images in PDF output was resetting the clipping
      region.

    • 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.

    • Several bugs fixed in read.DIF(): single column inputs caused
      errors, cells marked as "character" could be converted to other
      types, and (in Windows) copying from the clipboard failed.

CHANGES IN R VERSION 2.12.0:

  NEW FEATURES:

    • Reading a package's CITATION file now defaults to ASCII rather
      than Latin-1: a package with a non-ASCII CITATION file should
      declare an encoding in its DESCRIPTION file and use that encoding
      for the CITATION file.

    • difftime() now defaults to the "tzone" attribute of "POSIXlt"
      objects rather than to the current timezone as set by the default
      for the tz argument.  (Wish of PR#14182.)

    • pretty() is now generic, with new methods for "Date" and "POSIXt"
      classes (based on code contributed by Felix Andrews).

    • unique() and match() are now faster on character vectors where
      all elements are in the global CHARSXP cache and have unmarked
      encoding (ASCII).  Thanks to Matthew Dowle for suggesting
      improvements to the way the hash code is generated in unique.c.

    • The enquote() utility, in use internally, is exported now.

    • .C() and .Fortran() now map non-zero return values (other than
      NA_LOGICAL) for logical vectors to TRUE: it has been an implicit
      assumption that they are treated as true.

    • The print() methods for "glm" and "lm" objects now insert
      linebreaks in long calls in the same way that the print() methods
      for "summary.[g]lm" objects have long done.  This does change the
      layout of the examples for a number of packages, e.g. MASS.
      (PR#14250)

    • constrOptim() can now be used with method "SANN".  (PR#14245)

      It gains an argument hessian to be passed to optim(), which
      allows all the ... arguments to be intended for f() and grad().
      (PR#14071)

    • curve() now allows expr to be an object of mode "expression" as
      well as "call" and "function".

    • The "POSIX[cl]t" methods for Axis() have been replaced by a
      single method for "POSIXt".

      There are no longer separate plot() methods for "POSIX[cl]t" and
      "Date": the default method has been able to handle those classes
      for a long time.  This _inter alia_ allows a single date-time
      object to be supplied, the wish of PR#14016.

      The methods had a different default ("") for xlab.

    • Classes "POSIXct", "POSIXlt" and "difftime" have generators
      .POSIXct(), .POSIXlt() and .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 "POSIXt" is now
      the second class.  See the document ‘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.

    • The "POSIXct" method of as.Date() allows a timezone to be
      specified (but still defaults to UTC).

    • New list2env() utility function as an inverse of
      as.list(<environment>) and for fast multi-assign() to existing
      environment.  as.environment() is now generic and uses list2env()
      as list method.

    • There are several small changes to output which ‘zap’ small
      numbers, e.g. in printing quantiles of residuals in summaries
      from "lm" and "glm" fits, and in test statistics in
      print.anova().

    • Special names such as "dim", "names", etc, are now allowed as
      slot names of S4 classes, with "class" the only remaining
      exception.

    • File .Renviron can have architecture-specific versions such as
      .Renviron.i386 on systems with sub-architectures.

    • installed.packages() has a new argument subarch to filter on
      sub-architecture.

    • The summary() method for packageStatus() now has a separate
      print() method.

    • The default summary() method returns an object inheriting from
      class "summaryDefault" which has a separate print() method that
      calls zapsmall() for numeric/complex values.

    • The startup message now includes the platform and if used,
      sub-architecture: this is useful where different
      (sub-)architectures run on the same OS.

    • The getGraphicsEvent() mechanism now allows multiple windows to
      return graphics events, through the new functions
      setGraphicsEventHandlers(), setGraphicsEventEnv(), and
      getGraphicsEventEnv().  (Currently implemented in the windows()
      and X11() devices.)

    • tools::texi2dvi() gains an index argument, mainly for use by R
      CMD Rd2pdf.

      It avoids the use of texindy by texinfo's texi2dvi >= 1.157,
      since that does not emulate 'makeindex' well enough to avoid
      problems with special characters (such as (, {, !) in indices.

    • The ability of readLines() and 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.

    • scan() gains a fileEncoding argument to match read.table().

    • points() and lines() gain "table" methods to match plot().  (Wish
      of PR#10472.)

    • Sys.chmod() allows argument mode to be a vector, recycled along
      paths.

    • There are |, & and xor() methods for classes "octmode" and
      "hexmode", which work bitwise.

    • Environment variables R_DVIPSCMD, R_LATEXCMD, R_MAKEINDEXCMD,
      R_PDFLATEXCMD are no longer used nor set in an R session.  (With
      the move to tools::texi2dvi(), the conventional environment
      variables LATEX, MAKEINDEX and PDFLATEX will be used.
      options("dvipscmd") defaults to the value of DVIPS, then to
      "dvips".)

    • New function isatty() to see if terminal connections are
      redirected.

    • summaryRprof() returns the sampling interval in component
      sample.interval and only returns in by.self data for functions
      with non-zero self times.

    • print(x) and str(x) now indicate if an empty list x is named.

    • install.packages() and remove.packages() with lib unspecified and
      multiple libraries in .libPaths() inform the user of the library
      location used with a message rather than a warning.

    • There is limited support for multiple compressed streams on a
      file: all of [bgx]zfile() allow streams to be appended to an
      existing file, but bzfile() reads only the first stream.

    • Function person() in package 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 role argument to specify
      person roles using a controlled vocabulary (the MARC relator
      terms).

    • Package utils adds a new "bibentry" class for representing and
      manipulating bibliographic information in enhanced BibTeX style,
      unifying and enhancing the previously existing mechanisms.

    • A bibstyle() function has been added to the tools package with
      default JSS style for rendering "bibentry" objects, and a
      mechanism for registering other rendering styles.

    • Several aspects of the display of text help are now customizable
      using the new Rd2txt_options() function.
      options("help_text_width") is no longer used.

    • Added \href tag to the Rd format, to allow hyperlinks to URLs
      without displaying the full URL.

    • Added \newcommand and \renewcommand tags to the Rd format, to
      allow user-defined macros.

    • New toRd() generic in the tools package to convert objects to
      fragments of Rd code, and added "fragment" argument to Rd2txt(),
      Rd2HTML(), and Rd2latex() to support it.

    • Directory R_HOME/share/texmf now follows the TDS conventions, so
      can be set as a texmf tree (‘root directory’ in MiKTeX parlance).

    • S3 generic functions now use correct S4 inheritance when
      dispatching on an S4 object.  See ?Methods, section on “Methods
      for S3 Generic Functions” for recommendations and details.

    • format.pval() gains a ... argument to pass arguments such as
      nsmall to format().  (Wish of PR#9574)

    • legend() supports title.adj.  (Wish of PR#13415)

    • Added support for subsetting "raster" objects, plus assigning to
      a subset, conversion to a matrix (of colour strings), and
      comparisons (== and !=).

    • Added a new parseLatex() function (and related functions
      deparseLatex() and latexToUtf8()) to support conversion of
      bibliographic entries for display in R.

    • Text rendering of \itemize in help uses a Unicode bullet in UTF-8
      and most single-byte Windows locales.

    • Added support for polygons with holes to the graphics engine.
      This is implemented for the pdf(), postscript(),
      x11(type="cairo"), windows(), and quartz() devices (and
      associated raster formats), but not for x11(type="Xlib") or
      xfig() or pictex().  The user-level interface is the polypath()
      function in graphics and grid.path() in grid.

    • 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, NEWS.pdf,
      installed at the top-level of the R distribution.

    • kmeans(x, 1) now works.  Further, kmeans now returns between and
      total sum of squares.

    • arrayInd() and which() gain an argument useNames.  For arrayInd,
      the default is now false, for speed reasons.

    • As is done for closures, the default print method for the formula
      class now displays the associated environment if it is not the
      global environment.

    • 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 ?insertSource.

    • New function readRenviron to (re-)read files in the format of
      ~/.Renviron and Renviron.site.

    • require() will now return FALSE (and not fail) if loading the
      package or one of its dependencies fails.

    • aperm() now allows argument perm to be a character vector when
      the array has named dimnames (as the results of table() calls
      do).  Similarly, array() allows MARGIN to be a character vector.
      (Based on suggestions of Michael Lachmann.)

    • Package utils now exports and documents functions
      aspell_package_Rd_files() and aspell_package_vignettes() for
      spell checking package Rd files and vignettes using Aspell,
      Ispell or Hunspell.

    • Package news can now be given in Rd format, and news() prefers
      these inst/NEWS.Rd files to old-style plain text NEWS or
      inst/NEWS files.

    • New simple function packageVersion().

    • The PCRE library has been updated to version 8.10.

    • The standard Unix-alike terminal interface declares its name to
      readline as 'R', so that can be used for conditional sections in
      ~/.inputrc files.

    • ‘Writing R Extensions’ now stresses that the standard sections in
      .Rd files (other than \alias, \keyword and \note) are intended to
      be unique, and the conversion tools now drop duplicates with a
      warning.

      The .Rd conversion tools also warn about an unrecognized type in
      a \docType section.

    • ecdf() objects now have a quantile() method.

    • format() methods for date-time objects now attempt to make use of
      a "tzone" attribute with "%Z" and "%z" formats, but it is not
      always possible.  (Wish of PR#14358.)

    • tools::texi2dvi(file, clean = TRUE) now works in more cases (e.g.
      where emulation is used and when file is not in the current
      directory).

    • New function droplevels() to remove unused factor levels.

    • system(command, intern = TRUE) now gives an error on a Unix-alike
      (as well as on Windows) if command cannot be run.  It reports a
      non-success exit status from running command as a warning.

      On a Unix-alike an attempt is made to return the actual exit
      status of the command in system(intern = FALSE): previously this
      had been system-dependent but on POSIX-compliant systems the
      value return was 256 times the status.

    • system() has a new argument ignore.stdout which can be used to
      (portably) ignore standard output.

    • system(intern = TRUE) and pipe() connections are guaranteed to be
      available on all builds of R.

    • Sys.which() has been altered to return "" if the command is not
      found (even on Solaris).

    • A facility for defining reference-based S4 classes (in the OOP
      style of Java, C++, etc.) has been added experimentally to
      package methods; see ?ReferenceClasses.

    • The predict method for "loess" fits gains an na.action argument
      which defaults to na.pass rather than the previous default of
      na.omit.

      Predictions from "loess" fits are now named from the row names of
      newdata.

    • Parsing errors detected during Sweave() processing will now be
      reported referencing their original location in the source file.

    • New adjustcolor() utility, e.g., for simple translucent color
      schemes.

    • qr() now has a trivial lm method with a simple (fast) validity
      check.

    • An experimental new programming model has been added to package
      methods for reference (OOP-style) classes and methods.  See
      ?ReferenceClasses.

    • bzip2 has been updated to version 1.0.6 (bug-fix release).
      --with-system-bzlib now requires at least version 1.0.6.

    • R now provides jss.cls and jss.bst (the class and bib style file
      for the Journal of Statistical Software) as well as RJournal.bib
      and Rnews.bib, and R CMD ensures that the .bst and .bib files are
      found by BibTeX.

    • Functions using the TAR environment variable no longer quote the
      value when making system calls.  This allows values such as tar
      --force-local, but does require additional quotes in, e.g., TAR =
      "'/path with spaces/mytar'".

  DEPRECATED & DEFUNCT:

    • Supplying the parser with a character string containing both
      octal/hex and Unicode escapes is now an error.

    • File extension .C for C++ code files in packages is now defunct.

    • R CMD check no longer supports configuration files containing
      Perl configuration variables: use the environment variables
      documented in ‘R Internals’ instead.

    • The save argument of require() now defaults to FALSE and save =
      TRUE is now deprecated.  (This facility is very rarely actually
      used, and was superseded by the Depends field of the DESCRIPTION
      file long ago.)

    • R CMD check --no-latex is deprecated in favour of --no-manual.

    • R CMD Sd2Rd is formally deprecated and will be removed in R
      2.13.0.

  PACKAGE INSTALLATION:

    • install.packages() has a new argument libs_only to optionally
      pass --libs-only to R CMD INSTALL and works analogously for
      Windows binary installs (to add support for 64- or 32-bit
      Windows).

    • When sub-architectures are in use, the installed architectures
      are recorded in the Archs field of the DESCRIPTION file.  There
      is a new default filter, "subarch", in available.packages() to
      make use of this.

      Code is compiled in a copy of the src directory when a package is
      installed for more than one sub-architecture: this avoid problems
      with cleaning the sources between building sub-architectures.

    • R CMD INSTALL --libs-only no longer overrides the setting of
      locking, so a previous version of the package will be restored
      unless --no-lock is specified.

  UTILITIES:

    • R CMD Rprof|build|check are now based on R rather than Perl
      scripts.  The only remaining Perl scripts are the deprecated R
      CMD Sd2Rd and install-info.pl (used only if install-info is not
      found) as well as some maintainer-mode-only scripts.

      *NB:* because these have been completely rewritten, users should
      not expect undocumented details of previous implementations to
      have been duplicated.

      R CMD no longer manipulates the environment variables PERL5LIB
      and PERLLIB.

    • R CMD check has a new argument --extra-arch to confine tests to
      those needed to check an additional sub-architecture.

      Its check for “Subdirectory 'inst' contains no files” is more
      thorough: it looks for files, and warns if there are only empty
      directories.

      Environment variables such as R_LIBS and those used for
      customization can be set for the duration of checking _via_ a
      file ~/.R/check.Renviron (in the format used by .Renviron, and
      with sub-architecture specific versions such as
      ~/.R/check.Renviron.i386 taking precedence).

      There are new options --multiarch to check the package under all
      of the installed sub-architectures and --no-multiarch to confine
      checking to the sub-architecture under which 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 check for testing purposes is only of the current
      sub-architecture (_via_ R CMD INSTALL --no-multiarch).

      It will skip the check for non-ascii characters in code or data
      if the environment variables _R_CHECK_ASCII_CODE_ or
      _R_CHECK_ASCII_DATA_ are respectively set to FALSE.  (Suggestion
      of Vince Carey.)

    • R CMD build no longer creates an INDEX file (R CMD INSTALL does
      so), and --force removes (rather than overwrites) an existing
      INDEX file.

      It supports a file ~/.R/build.Renviron analogously to check.

      It now runs build-time \Sexpr expressions in help files.

    • R CMD Rd2dvi makes use of tools::texi2dvi() to process the
      package manual.  It is now implemented entirely in R (rather than
      partially as a shell script).

    • R CMD Rprof now uses utils::summaryRprof() rather than Perl.  It
      has new arguments to select one of the tables and to limit the
      number of entries printed.

    • R CMD Sweave now runs R with --vanilla so the environment setting
      of R_LIBS will always be used.

  C-LEVEL FACILITIES:

    • lang5() and lang6() (in addition to pre-existing lang[1-4]())
      convenience functions for easier construction of eval() calls.
      If you have your own definition, do wrap it inside #ifndef lang5
      .... #endif to keep it working with old and new R.

    • Header R.h now includes only the C headers it itself needs, hence
      no longer includes errno.h.  (This helps avoid problems when it
      is included from C++ source files.)

    • Headers Rinternals.h and R_ext/Print.h include the C++ versions
      of stdio.h and stdarg.h respectively if included from a C++
      source file.

  INSTALLATION:

    • A C99 compiler is now required, and more C99 language features
      will be used in the R sources.

    • Tcl/Tk >= 8.4 is now required (increased from 8.3).

    • System functions access, chdir and getcwd are now essential to
      configure R.  (In practice they have been required for some
      time.)

    • 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.

    • File NEWS is no longer in the sources, but generated as part of
      the installation.  The primary source for changes is now
      doc/NEWS.Rd.

    • The popen system call is now required to build R.  This ensures
      the availability of system(intern = TRUE), pipe() connections and
      printing from postscript().

    • The pkg-config file libR.pc now also works when R is installed
      using a sub-architecture.

    • 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.

  BUG FIXES:

    • Calls to selectMethod() by default no longer cache inherited
      methods.  This could previously corrupt methods used by as().

    • The densities of non-central chi-squared are now more accurate in
      some cases in the extreme tails, e.g. dchisq(2000, 2, 1000), as a
      series expansion was truncated too early.  (PR#14105)

    • pt() is more accurate in the left tail for ncp large, e.g.
      pt(-1000, 3, 200).  (PR#14069)

    • The default C function (R_binary) for binary ops now sets the S4
      bit in the result if either argument is an S4 object.  (PR#13209)

    • source(echo=TRUE) failed to echo comments that followed the last
      statement in a file.

    • S4 classes that contained one of "matrix", "array" or "ts" and
      also another class now accept superclass objects in new().  Also
      fixes failure to call validObject() for these classes.

    • Conditional inheritance defined by argument test in
      methods::setIs() will no longer be used in S4 method selection
      (caching these methods could give incorrect results).  See
      ?setIs.

    • The signature of an implicit generic is now used by setGeneric()
      when that does not use a definition nor explicitly set a
      signature.

    • A bug in callNextMethod() for some examples with "..." in the
      arguments has been fixed.  See file
      src/library/methods/tests/nextWithDots.R in the sources.

    • match(x, table) (and hence %in%) now treat "POSIXlt" consistently
      with, e.g., "POSIXct".

    • Built-in code dealing with environments (get(), assign(),
      parent.env(), is.environment() and others) now behave
      consistently to recognize S4 subclasses; is.name() also
      recognizes subclasses.

    • The abs.tol control parameter to nlminb() now defaults to 0.0 to
      avoid false declarations of convergence in objective functions
      that may go negative.

    • The standard Unix-alike termination dialog to ask whether to save
      the workspace takes a EOF response as n to avoid problems with a
      damaged terminal connection.  (PR#14332)

    • Added warn.unused argument to hist.default() to allow suppression
      of spurious warnings about graphical parameters used with
      plot=FALSE.  (PR#14341)

    • predict.lm(), summary.lm(), and indeed 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 predict() case.)

    • aperm() treated resize = NA as resize = TRUE.

    • 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.

    • Rendering of S3 and S4 methods in man pages has been corrected
      and made consistent across output formats.

    • Simple markup is now allowed in \title sections in .Rd files.

    • The behaviour of as.logical() on factors (to use the levels) was
      lost in R 2.6.0 and has been restored.

    • prompt() did not backquote some default arguments in the \usage
      section.  (Reported by Claudia Beleites.)

    • writeBin() disallows attempts to write 2GB or more in a single
      call. (PR#14362)

    • new() and getClass() will now work if Class is a subclass of
      "classRepresentation" and should also be faster in typical calls.

    • The summary() method for data frames makes a better job of names
      containing characters invalid in the current locale.

    • [[ sub-assignment for factors could create an invalid factor
      (reported by Bill Dunlap).

    • Negate(f) would not evaluate argument f until first use of
      returned function (reported by Olaf Mersmann).

    • quietly=FALSE is now also an optional argument of library(), and
      consequently, quietly is now propagated also for loading
      dependent packages, e.g., in require(*, quietly=TRUE).

    • If the loop variable in a for loop was deleted, it would be
      recreated as a global variable.  (Reported by Radford Neal; the
      fix includes his optimizations as well.)

    • Task callbacks could report the wrong expression when the task
      involved parsing new code. (PR#14368)

    • getNamespaceVersion() failed; this was an accidental change in
      2.11.0. (PR#14374)

    • identical() returned FALSE for external pointer objects even when
      the pointer addresses were the same.

    • L$a@x[] <- val did not duplicate in a case it should have.

    • 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)

    • quantile(type=6) behaved inconsistently.  (PR#14383)

    • backSpline(.) behaved incorrectly when the knot sequence was
      decreasing.  (PR#14386)

    • The reference BLAS included in R was assuming that 0*x and x*0
      were always zero (whereas they could be NA or NaN in IEC 60559
      arithmetic).  This was seen in results from tcrossprod, and for
      example that log(0) %*% 0 gave 0.

    • 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)

    • model.frame(drop.unused.levels = TRUE) did not take into account
      NA values of factors when deciding to drop levels. (PR#14393)

    • library.dynam.unload required an absolute path for libpath.
      (PR#14385)

      Both library() and loadNamespace() now record absolute paths for
      use by searchpaths() and getNamespaceInfo(ns, "path").

    • The self-starting model NLSstClosestX failed if some deviation
      was exactly zero.  (PR#14384)

    • X11(type = "cairo") (and other devices such as 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)

    • Added workaround for the font problem with X11(type = "cairo")
      and similar on Mac OS X whereby italic and bold styles were
      interchanged.  (PR#13463 amongst many other reports.)

    • source(chdir = TRUE) failed to reset the working directory if it
      could not be determined - that is now an error.

    • Fix for crash of example(rasterImage) on x11(type="Xlib").

    • Force Quartz to bring the on-screen display up-to-date
      immediately before the snapshot is taken by grid.cap() in the
      Cocoa implementation. (PR#14260)

    • model.frame had an unstated 500 byte limit on variable names.
      (Example reported by Terry Therneau.)

    • The 256-byte limit on names is now documented.

    • Subassignment by [, [[ or $ on an expression object with value
      NULL coerced the object to a list.

CHANGES IN R VERSION 2.11.1 patched:

  NEW FEATURES:

    • install.packages() has a new optional argument INSTALL_opts which
      can be used to pass options to R CMD INSTALL for source-package
      installs.

    • R CMD check now runs the package-specific tests with LANGUAGE=en
      to facilitate comparison to .Rout.save files.

    • sessionInfo() gives more detailed platform information, including
      32/64-bit and the sub-architecture if one is used.

  DEPRECATED & DEFUNCT:

    • The use of Perl configuration variables for R CMD check (as
      previously documented in ‘Writing R Extensions’) is deprecated
      and will be removed in R 2.12.0.  Use the environment variables
      documented in ‘R Internals’ instead.

  BUG FIXES:

    • R CMD Rd2dvi failed if run from a path containing space(s).  This
      also affected R CMD check, which calls Rd2dvi.

    • stripchart() could fail with an empty factor level.  (PR#14317)

    • Text help rendering of \tabular{} has been improved: under some
      circumstances leading blank columns were not rendered.

    • strsplit(x, fixed=TRUE) marked UTF-8 strings with the local
      encoding when no splits were found.

    • weighted.mean(NA, na.rm=TRUE) and similar now returns NaN again,
      as it did prior to R 2.10.0.

    • R CMD had a typo in its detection of whether the environment
      variable TEXINPUTS was set (reported by Martin Morgan).

    • The command-line parser could mistake --file=size... for one of
      the options for setting limits for Ncells or Vcells.

    • The internal strptime() could corrupt its copy of the timezone
      which would then lead to spurious warnings. (PR#14338)

    • 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.)

    • The postscript() and pdf() devices will now allow lwd values less
      than 1 (they used to force such values to be 1).

    • Fixed font face for CID fonts in pdf() graphics output.
      (PR#14326)

    • 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.

    • wilcox.test(x, y, conf.int = TRUE) failed with an unhelpful
      message if x and y were constant vectors, and similarly in the
      one-sample case.  (PR#14329)

    • Improperly calling Recall() from outside a function could cause a
      segfault.  (Reported by Robert McGehee.)

    • \Sexpr[result=rd] in an Rd file added a spurious newline, which
      was displayed as extra whitespace when rendered.

    • require(save = TRUE) recorded the names of packages it failed to
      load.

    • packageStatus() could return a data frame with duplicate row
      names which could then not be printed.

    • txtProgressBar(style = 2) did not work correctly.

      txtProgressBar(style = 3) did not display until a non-minimum
      value was set.

    • contour() did not display dashed line types properly when contour
      lines were labelled. (Reported by David B. Thompson.)

    • tools::undoc() again detects undocumented data objects.  Of
      course, this also affects R CMD check.

    • ksmooth(x,NULL) no longer segfaults.

    • approxfun(), approx(), splinefun() and spline() could be confused
      by x values that were different but so close as to print
      identically.  (PR#14377)

CHANGES IN R VERSION 2.11.1:

  NEW FEATURES:

    • R CMD INSTALL checks if dependent packages are available early on
      in the installation of source packages, thereby giving clearer
      error messages.

    • R CMD INSTALL --build now names the file in the format used for
      Mac OS X binary files on that platform.

    • BIC() in package stats4 now also works with multiple fitted
      models, analogously to AIC().

  DEPRECATED & DEFUNCT:

    • Use of file extension .C for C++ code in packages is now
      deprecated: it has caused problems for some makes on
      case-insensitive file systems (although it currently works with
      the recommended toolkits).

  INSTALLATION:

    • Command gnutar is preferred to tar when configure sets TAR.  This
      is needed on Mac OS 10.6, where the default tar, bsdtar 2.6.2,
      has been reported to produce archives with illegal extensions to
      tar (according to the POSIX standard).

  BUG FIXES:

    • The C function mkCharLenCE now no longer reads past len bytes
      (unlikely to be a problem except in user code).  (PR#14246)

    • On systems without any default LD_LIBRARY_PATH (not even
      /usr/local/lib), [DY]LIB_LIBRARY_PATH is now set without a
      trailing colon.  (PR#13637)

    • More efficient implementation of utf8ToInt() on long multi-byte
      strings with many multi-byte characters.  (PR#14262)

    • aggregate.ts() gave platform-dependent results due to rounding
      error for ndeltat != 1.

    • package.skeleton() sometimes failed to fix filenames for .R or
      .Rd files to start with an alphanumeric.  (PR#14253)

      It also failed when only an S4 class without any methods was
      defined.  (PR#14280)

    • splinefun(method = "monoH.FC") was not quite monotone in rare
      cases.  (PR#14215)

    • Rhttpd no longer crashes due to SIGPIPE when the client closes
      the connection prematurely.  (PR#14266)

    • format.POSIXlt() could cause a stack overflow and crash when used
      on very long vectors.  (PR#14267)

    • Rd2latex() incorrectly escaped special characters in \usage
      sections.

    • mcnemar.test() could alter the levels (dropping unused levels) if
      passed x and y as factors (reported by Greg Snow).

    • Rd2pdf sometimes needed a further pdflatex pass to get
      hyperlinked pages correct.

    • interaction() produced malformed results when levels were
      duplicated, causing segfaults in split().

    • cut(d, breaks = <n>) now also works for "Date" or "POSIXt"
      argument d.  (PR#14288)

    • memDecompress() could decompress incompletely rare xz-compressed
      input due to incorrect documentation of xz utils.  (Report and
      patch from Olaf Mersmann.)

    • The S4 initialize() methods for "matrix", "array", and "ts" have
      been fixed to call validObject().  (PR#14284)

    • R CMD INSTALL now behaves the same way with or without
      --no-multiarch on platforms with only one installed architecture.
      (It used to clean the src directory without --no-multiarch.)

    • [<-.data.frame was not quite careful enough in assigning (and
      potentially deleting) columns right-to-left.  (PR#14263)

    • rbeta(n, a, b) no longer occasionally returns NaN for a >> 1 > b.
      (PR#14291)

    • pnorm(x, log.p = TRUE) could return NaN not -Inf for x near
      (minus for lower.tail=TRUE) the largest representable number.

    • Compressed data files *.(txt|tab|csv).(gz|bz2|xz) were not
      recognized for the list of data topics and hence for packages
      using LazyData.  (PR#14273)

    • 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)

    • tools::Rd2txt() did not render poorly written Rd files
      consistently with other renderers.

      It computed widths of strings that would be print()ed with
      escapes incorrectly, for example in the computation of column
      width for \tabular.

    • na.action() did not extract the na.action component as
      documented.

    • do.call()ing NextMethod in erroneous ways no longer segfaults.
      (PR#13487)

CHANGES IN R VERSION 2.11.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • Packages must have been installed under R >= 2.10.0, as the
      current help system is the only one now supported.

    • A port to 64-bit Windows is now available as well as binary
      package repositories: see the ‘R Administration and Installation
      Manual’.

    • Argument matching for primitive functions is now done in the same
      way as for interpreted functions except for the deliberate
      exceptions

      
      
               call switch .C .Fortran .Call .External
             

      all of which use positional matching for their first argument,
      and also some internal-use-only primitives.

    • The default device for command-line R at the console on Mac OS X
      is now quartz() and not X11().

  NEW FEATURES:

    • The open modes for connections are now interpreted more
      consistently.  open = "r" is now equivalent to open = "rt" for
      all connections.  The default open = "" now means "rt" for all
      connections except the compressed-file connections gzfile(),
      bzfile() and xzfile() for which it means "rb".

    • R CMD INSTALL now uses the internal untar() function in package
      utils: this ensures that all platforms can install bzip2- and
      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 R_INSTALL_TAR: setting
      this to a modern external tar program will speed up unpacking of
      large (tens of Mb or more) tarballs.

    • 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).

    • R CMD check has a new option --timings to record per-example
      timings in file <pkg>.Rcheck/<pkg>-Ex.timings.

    • The TRE library has been updated to version 0.8.0 (minor
      bugfixes).

    • grep[l], [g]sub and [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 [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).

    • A new argument skipCalls has been added to browser() so that it
      can report the original context when called by other debugging
      functions.

    • More validity checking of UTF-8 and MBCS strings is done by
      agrep() and the regular-expression matching functions.

    • The undocumented restriction on gregexpr() to length(text) > 0
      has been removed.

    • Package 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.

    • 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., Cairo,
      RSvgDevice, 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).

    • R CMD check now also checks if the package and namespace can be
      unloaded: this provides a check of the .Last.lib() and
      .onUnload() hook functions (unless --install=fake).

    • prop.table(x) now accepts a one-dimensional table for x.

    • A new function 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.

    • The main HTML help page now links to a reformatted copy of this
      NEWS file.  (Suggested by Henrik Bengtsson.)  Package index files
      link to the package DESCRIPTION and NEWS files and a list of
      demos when using dynamic help.

    • The [ method for class "AsIs" allows the next method to change
      the underlying class.  (Wish of Jens Oehlschlägel.)

    • write.csv[2] no longer allow argument append to be changed: as
      ever, direct calls to write.table() give more flexibility as well
      as more room for error.

    • The index page for HTML help for a package now collapses multiple
      signatures for S4 methods into a single entry.

    • The use of .required by require() and detach() has been replaced
      by .Depends which is set from the Depends field of a package
      (even in packages with namespaces).  By default detach() prevents
      such dependencies from being detached: this can be overridden by
      the argument force.

    • bquote() has been extended to work on function definitions.
      (Wish of PR#14031).

    • detach() when applied to an object other than a package returns
      the environment that has been detached, to parallel attach().

    • readline() in non-interactive use returns "" and does not attempt
      to read from the ‘terminal’.

    • New function file_ext() in package tools.

    • 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 "AsIs" and "difftime" methods, and the default
      method uses unclass(x) if is.numeric(x) is true (which will be
      faster but relies on is.numeric() having been set correctly for
      the class).

    • is.numeric(x) is now false for a "difftime" object
      (multiplication and division make no sense for such objects).

    • The default method of weighted.mean(x, w) coerces 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 NaN result.

      There is now a "difftime" method.

    • bug.report() now has arguments package and lib.loc to generate
      bug reports about packages.  When this is used, it looks for a
      BugReports field in the package 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.)

    • quantile() now has a method for the date-time class "POSIXt", and
      types 1 and 3 (which never interpolate) work for Dates and
      ordered factors.

    • 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.)

    • The readline completion backend no longer sorts possible
      completions alphabetically (e.g., function argument names) if R
      was built with readline >= 6.

    • select.list() gains a graphics argument to allow Windows/Mac
      users to choose the text interface.  This changes the behaviour
      of new.packages(ask=TRUE) to be like update.packages(ask=TRUE) on
      those platforms in using a text menu: use ask="graphics" for a
      graphical menu.

    • New function chooseBioCmirror() to set the "BioC_mirror" option.

    • The R grammar now prevents using the argument name in signatures
      of S4 methods for $ and $<-, since they will always be called
      with a character string value for name.  The implicit S4 generic
      functions have been changed to reflect this: packages which
      included name in the signature of their methods need to be
      updated and re-installed.

    • The handling of the method argument of glm() has been refined
      following suggestions by Ioannis Kosmidis and Heather Turner.

    • str() gains a new argument list.len with default 99, limiting the
      number of list() items (per level), thanks to suggestions from
      David Winsenius.

    • 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).

    • New functions enc2native() and enc2utf8() convert character
      vectors with possibly marked encodings to the current locale and
      UTF-8 respectively.

    • Unrecognized escapes and embedded nuls in character strings are
      now an error, not just a warning.  Thus option "warnEscapes" is
      no longer needed.  rawToChar() now removes trailing nuls
      silently, but other embedded nuls become errors.

    • Informational messages about masked objects displayed when a
      package is attached are now more compact, using strwrap() instead
      of one object per line.

    • print.rle() gains argument prefix.

    • download.file() gains a "curl" method, mainly for use on
      platforms which have curl but not wget, but also for some
      hard-to-access URLs.

    • In Rd, \eqn and \deqn will render in HTML (and convert to text)
      upper- and lower-case Greek letters (entered as \alpha ...),
      \ldots, ..., \ge and \le.

    • utf8ToInt() and intToUtf8() now map NA inputs to NA outputs.

    • file() has a new argument raw which may help if it is used with
      something other than a regular file, e.g. a character device.

    • New function strtoi(), a wrapper for the C function strtol.

    • as.octmode() and as.hexmode() now allow inputs of length other
      than one.

      The format() and print() methods for "octmode" now preserve names
      and dimensions (as those for "hexmode" did).

      The format() methods for classes "octmode" and "hexmode" gain a
      width argument.

    • seq.int() returns an integer result in some further cases where
      seq() does, e.g. seq.int(1L, 9L, by = 2L).

    • Added \subsection{}{} macro to Rd syntax, for subsections within
      sections.

    • n-dimensional arrays with dimension names can now be indexed by
      an n-column character matrix.  The indices are matched against
      the dimension names.  NA indices are propagated to the result.
      Unmatched values and "" are not allowed and result in an error.

    • interaction(drop=TRUE) uses less memory (related to PR#14121).

    • summary() methods have been added to the "srcref" and "srcfile"
      classes, and various encoding issues have been cleaned up.

    • If option "checkPackageLicense" is set to TRUE (not currently the
      default), users will be asked to agree to non-known-to-be-FOSS
      package licences at first use.

    • Checking setAs(a, b) methods only gives a message instead of a
      warning, when one of a or b is unknown.

    • New function norm() to compute a matrix norm.  norm() and also
      backsolve() and sample() have implicit S4 generics.

    • Files Renviron.site and Rprofile.site can have
      architecture-specific versions on systems with sub-architectures.

    • R CMD check now (by default) also checks Rd files for
      auto-generated content in need of editing, and missing argument
      descriptions.

    • 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.

    • path.expand() now propagates NA values rather than converting
      them to "NA".

    • file.show() now disallows NA values for file names, headers, and
      pager.

    • The ‘fuzz’ used by seq() and seq.int() has been reduced from 1e-7
      to 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).

    • The default value of 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 "Rhelp10" for
      those from 2010.

    • New function rasterImage() in the graphics package for drawing
      raster images.

    • stats:::extractAIC.coxph() now omits aliased terms when computing
      the degrees of freedom (suggestion of Terry Therneau).

    • cor() and cov() now test for misuse with non-numeric arguments,
      such as the non-bug report PR#14207.

    • pchisq(ncp =, log.p = TRUE) is more accurate for probabilities
      near one.  E.g. pchisq(80, 4, ncp=1, log.p=TRUE).  (Maybe what
      was meant in PR#14216.)

    • maintainer() has been added, to give convenient access to the
      name of the maintainer of a package (contributed by David Scott).

    • sample() and sample.int() allow zero items to be sampled from a
      zero-length input.  sample.int() gains a default value size=n to
      be more similar to sample().

    • switch() returned 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 EXPR is always
      matched to the first argument and there is no danger of partial
      matching to later named arguments.

    • Primitive functions UseMethod(), attr(), attr<-(), on.exit(),
      retracemem() and 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 switch(), call(), .C() ...).

    • 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.

    • base::which() uses a new .Internal function when arr.ind is FALSE
      resulting in a 10x speedup.  Thanks to Patrick Aboyoun for
      implementation suggestions.

    • Help conversion to text now uses the first part of \enc{}{}
      markup if it is representable in the current output encoding.  On
      the other hand, conversion to LaTeX with the default
      outputEncoding = "ASCII" uses the second part.

    • A new class "listOfMethods" has been introduced to represent the
      methods in a methods table, to replace the deprecated class
      "MethodsList".

    • any() and all() return early if possible.  This may speed up
      operations on long vectors.

    • strptime() now accepts "%z" (for the offset from UTC in the
      RFC822 format of +/-hhmm).

    • The PCRE library has been updated to version 8.02, a bug-fix
      release which also updates tables to Unicode 5.02.

    • Functions which may use a graphical select.list() (including
      menu() and install.packages()) now check on a Unix-alike that Tk
      can be started (and not just capabilities("tcltk") &&
      capabilities("X11")).

    • The parser no longer marks strings containing octal or hex
      escapes as being in UTF-8 when entered in a UTF-8 locale.

    • On platforms with cairo but not Pango (notably Mac OS X) the
      initial default X11() type is set to "Xlib": this avoids several
      problems with font selection when done by cairo rather than Pango
      (at least on Mac OS X).

    • New function arrayInd() such that which(x, arr.ind = TRUE) for an
      array 'x' is now equivalent to arrayInd(which(x), dim(x),
      dimnames(x)).

  DEPRECATED & DEFUNCT:

    • Bundles of packages are defunct.

    • stats::clearNames() is defunct: use unname().

    • Basic regular expressions are defunct, and strsplit(), grep(),
      grepl(), sub(), gsub(), regexpr() and gregexpr() no longer have
      an extended argument.

    • methods::trySilent() is defunct.

    • index.search() (which was deprecated in 2.10.0) is no longer
      exported and has a different argument list.

    • Use of multiple arguments to return() is now defunct.

    • The use of UseMethod() with more than two arguments is now
      defunct.

    • In the methods package, the "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.

      getMethods() is now deprecated, with its internal use replaced by
      findMethods() and other changes.  Creating objects from the
      "MethodsList" class is also deprecated.

    • Parsing strings containing both octal/hex and Unicode escapes now
      gives a warning and will become an error in R 2.12.0.

  INSTALLATION:

    • UTF-8 is now used for the reference manual and package manuals.
      This requires LaTeX ‘2005/12/01’ or later.

    • configure looks for a POSIX compliant tr, Solaris's /usr/ucb/tr
      having been found to cause Rdiff to malfunction.

    • configure is now generated with autoconf 2.65, which works better
      on recent systems and on Mac OS X.

  PACKAGE INSTALLATION:

    • 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.

    • 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 --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.

    • Package installation on Windows for a package with a src
      directory now checks if a DLL is created unless there is a
      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
      <pkg-name>.dll.)

  BUG FIXES:

    • Using with(), eval() etc with a list with some unnamed elements
      now works.  (PR#14035)

    • The "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.

    • 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 findInheritedMethods().

    • R framework installation (on Mac OS X) would not work properly if
      a rogue Resources directory was present at the top level.  Such a
      non-symlink will now be renamed to Resources.old (and anything
      previously named Resources.old removed) as part of the framework
      installation process.

    • 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 ...).  Arguments omitted from the
      method definition but conforming (per the documentation) should
      now be ignored (treated as "ANY") in dispatching.

    • The computations for S4 method evaluation when ...  was in the
      signature could fail, treating ... as an ordinary symbol.  This
      has been fixed, for the known cases.

    • Various ar() fitting methods have more protection for singular
      fits.

    • callNextMethod now works again with the drop= argument in [

    • parse() and parse_Rd() miscounted columns when multibyte UTF-8
      characters were present.

    • 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.

    • cor(A, B) where A is n x 1 and B a 1-dimensional array segfaulted
      or gave an internal error.  (The case cor(B, A) was PR#7116.)

    • cut.POSIXt() applied to a start value after the DST transition on
      a DST-change day could give the wrong time for argument breaks in
      units of days or longer.  (PR#14208)

    • do_par() UNPROTECTed too early (PR#14214)

    • Subassignment x[[....]] <- y didn't check for a zero-length right
      hand side, and inserted a rubbish value.  (PR#14217)

    • fisher.test() no longer gives a P-value *very* slightly > 1, in
      some borderline cases.

    • Internal function matchArgs() no longer modifies the general
      purpose bits of the SEXPs 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 matchArgs
      for the same function _via_ a finalizer.

    • gsub() in 2.10.x could fail from stack overflow for extremely
      long strings due to temporary data being allocated on the stack.
      Also, gsub() with fixed=TRUE is in some circumstances
      considerably faster.

    • Several primitives, including attributes(), attr<-()
      interactive(), nargs() and proc.time(), did not check that they
      were called with the correct number of arguments.

    • A potential race condition in 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.

    • mean(x, trim=, na.rm = FALSE) failed to return NA if x contained
      missing values.  (Reported by Bill Dunlap.)

    • Extreme tail behavior of, pbeta() {and hence pf()}, e.g.,
      pbeta(x, 3, 2200, lower.tail=FALSE, log.p=TRUE) now returns
      finite values instead of jumping to -Inf too early.  (PR#14230).

    • parse(text=x) misbehaved for objects x that were not coerced
      internally to character, notably symbols.  (Reported to R-devel
      by Bill Dunlap.)

    • The internal C function coerceSymbol now handles coercion to
      character, and warns if coercion fails (rather than silently
      returning NULL).  This allows a name to be given where a
      character vector is required in functions which coerce
      internally.

    • The interpretation by strptime() of "%c" was non-standard (not
      that it is ever advisable to use locale- and system-specific
      input formats).

    • capabilities("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 --with-aqua, as the CRAN builds are).

    • The 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).

    • read.fwf() misread multi-line records when n was specified.
      (PR#14241)

    • all.equal(tolerance = e) passes the numeric tolerance also to the
      comparison of the attributes.

    • pgamma(0, 0), a boundary case, now returns 0, its limit from the
      left, rather than the limit from the right.

    • Issuing POST requests to the internal web server could stall the
      request under certain circumstances.

    • gzcon( <textConnection> ), an error, no longer damages the
      connection (in a way to have it segfault).  (PR#14237)

    • All the results from hist() now use the nominal breaks not those
      adjusted by the numeric ‘fuzz’: in recent versions the nominal
      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.)

    • If xy[z].coords (used internally by many graphics functions) are
      given a list as x, they now check that the list has suitable
      names and give a more informative error message.  (PR#13936)

CHANGES IN R VERSION 2.10.1 patched:

  NEW FEATURES:

    • The handling of line textures in the postscript() and 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.

    • lchoose(a, k) is now defined as log(abs(choose(a,k))),
      analogously to lfactorial().

    • Although \eqn{} in Rd files is defined as a ‘verbatim’ macro,
      many packages expected ... and \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).

    • 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.

    • The PCRE library has been updated to version 8.01, a bug-fix
      release.

    • tools::readNEWS() now accepts a digit as the first character of a
      news section.

  BUG FIXES:

    • Using read.table(header=TRUE) on a header with an embedded new
      line would copy part of the header into the data.  (PR#14103)

    • qpois(p = 1, lambda = 0) now gives 0 as for all other p.
      (PR#14135)

    • Functions related to string comparison (e.g. unique(), 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)

    • x[ , drop=TRUE] dropped an NA level even if it was in use.

    • The dynamic HTML help system reported the wrong MIME type for the
      style sheet.

    • tools::codoc() (used by R CMD check) was missing cases where the
      function had no arguments but was documented to have some.

    • Help links containing special characters (e.g. "?") were not
      generated correctly when rendered in HTML.  (PR#14155)

    • lchoose(a, k) no longer wrongly gives NaN for negative a.

    • ks.test() could give a p-value that was off by one observation
      due to rounding error.  (PR#14145)

    • readBin()/readChar() when reading millions of character strings
      in a single call used excessive amounts of memory (which also
      slowed them down).

    • R CMD SHLIB could fail if used with paths that were not
      alphanumeric, e.g. contained +.  (PR#14168)

    • sprintf() was not re-entrant, which potentially caused problems
      if an as.character() method called it.

    • The 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.

    • p.adjust(method, n) now works correctly for the rare case n >
      length(p), also when method differs from "bonferroni" or "none",
      thanks to a patch from Gordon Smyth.

    • tools::showNonASCII() failed to detect non-ASCII characters if
      iconv() (incorrectly) converted them to different ASCII
      characters.  (Seen on Windows only.)

    • tcrossprod() wrongly failed in some cases when one of the
      arguments was a vector and the other a matrix.

    • [cr]bind(..., deparse.level=2) was not always giving names when
      documented to do so.  (Discovered whilst investigating PR#14189.)

    • match(incomparables=<non-NULL>) could in rare cases
      infinite-loop.

    • poisson.test() needed to pass argument conf.level to
      binom.test().  (PR#14195)

    • The "nls" method for df.residual() gave incorrect results for
      models fitted with na.action = na.exclude.  (PR#14194)

    • A change to options(scipen=) was only implemented when printing
      next occurred, even though it should have affected intervening
      calls to axis(), contour() and filledcontour().

    • prettyNum(drop0trailing=TRUE) did not handle signs of imaginary
      parts of complex numbers correctly (and this was used by str():
      PR#14201).

    • system.time() had the sys.child component wrong (copied
      user.child instead) on systems with HAVE_GETRUSAGE.  (PR#14210)

    • 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.

    • The suppression of auto-rotation in bitmap() and dev2bitmap()
      with the "pdfwrite" device was not working correctly.

    • plot(ecdf(), log="x") no longer gives an incorrect warning.

    • read.fwf() works again when argument file is a connection.

    • Startup files will now be found if their paths exceed 255 bytes.
      (PR#14228)

    • contrasts<- (in the stats package) no longer has an undeclared
      dependence on methods (introduced in 2.10.0).

CHANGES IN R VERSION 2.10.1:

  NEW FEATURES:

    • The PCRE library has been updated to version 8.00.

    • R CMD INSTALL has new options --no-R, --no-libs, --no-data,
      --no-help, --no-demo, --no-exec, and --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).

    • The documented line-length limit of 4095 bytes when reading from
      the console now also applies also to parse(file="") (which
      previously had a limit of around 1024 bytes).

    • A Bioconductor mirror can be set for use by setRepositories()
      _via_ the option "BioC_mirror", e.g. the European mirror can be
      selected by
      options(BioC_mirror="http://bioconductor.statistik.tu-dortmund.de").

    • Double-clicking in a tk_select.list() list box now selects the
      item and closes the list box (as happens on the Windows
      select.list() widget).

  INSTALLATION:

    • configure will be able to find a usable libtiff in some rare
      circumstances where it did not previously (where libtiff needed
      to be linked explicitly against -ljpeg).

    • Making refman.pdf works around a problem with the indexing with
      hyperref 6.79d and later.

  DEPRECATED & DEFUNCT:

    • The extended argument is deprecated in strsplit(), grep(),
      grepl(), sub(), gsub(), regexpr() and gregexpr() (not just the
      value extended = FALSE) and will be removed in R 2.11.0.

  BUG FIXES:

    • trigamma(x) and other psigamma(x, n) calls are now accurate for
      very large abs(x).  (PR#14020)

    • [g]sub(perl=FALSE, fixed=FALSE) could use excessive stack space
      when used with a very long vector containing some non-ASCII
      strings.

    • The default method of weighted.mean(na.rm = TRUE) did not omit
      weights for NA observations in 2.10.0.  (PR#14032)

    • [g]regexpr(pattern, fixed = TRUE) returned match positions in
      bytes (not characters) in an MBCS locale if pattern was a single
      byte.

      [g]sub(fixed = TRUE) with a single-byte pattern could conceivably
      have matched part of a multibyte character in a non-UTF-8 MBCS.

    • findLineNum() and setBreakpoint() would sometimes fail if the
      specified file was not in the current directory.

    • Package tcltk's demo(tkdensity) was broken in 2.9.0 when demo()
      was changed to set par(ask = TRUE).

    • gsub() with backrefs could fail on extremely long strings
      (hundreds of thousands of characters) due to integer overflow in
      a length calculation.

    • abline(untf=TRUE) now uses a better x-grid in log-scale, e.g.,
      for plot(c(1,300), c(1,300), log="xy"); abline(4,1, untf=TRUE).

    • detach()/unloadNamespace() arrange to flush the package's
      lazyload cache of R objects once the package/namespace is no
      longer needed.

    • There have been small fixes to the rendering of help, e.g.
      \command is now rendered verbatim (so e.g. -- 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.

    • available.packages() would fail when run on a repository with no
      packages meeting the filtering conditions.  (PR#14042)

    • rep(x, times, each = 2) gave invalid results when the times
      argument was a vector longer than x.  Reported by Bill Dunlap.

    • An error when unloadNamespace() attempted to run the .onUnload()
      function gave an error in the reporting function and so was not
      reported properly.

    • Text help rendering did not handle very long input lines
      properly.

    • promptMethods() generated signature documentation improperly.

    • pgamma(x, a, lower.tail=FALSE) and qgamma(...) are now
      considerably more accurate in some regions for very small a.
      qgamma() now correctly returns 0 instead of NaN in similar
      extreme cases, and qgamma() no longer warns in the case of small
      a, see (PR#12324).

    • unname() now also removes names from a zero length vector.

    • Printing results from ls.str() no longer evaluates unevaluated
      calls.

    • 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).

    • An error in nls() with a long formula could cause a segfault.
      (PR#14059)

    • qchisq(p, df, ncp, lower.tail = FALSE) with ncp >= 80 was
      inaccurate for small p (as the help page said): it is now less
      inaccurate.  (In part, PR#13999.)

      For ncp less than but close to 80, pchisq() and qchisq() are more
      accurate for probabilities very close to 1 (a series expansion
      was truncated slightly too early).

      pchisq(x, df, ncp) can no longer return values just larger than
      one for large values of ncp.

    • 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)

    • chisq.test() could fail when given argument x or y which deparsed
      to more than one line.  (Reported by Laurent Gauthier.)

    • S4 methods are uncached whenever the namespace containing them is
      unloaded (by unloadNamespace() as well as by detach(unload =
      TRUE)).

    • The internal record-keeping by dyn.load/dyn.unload was
      incomplete, which could crash R if a DLL that registered
      .External routines had earlier been unloaded.

    • bessel[JY](x, nu) with nu a negative integer (a singular case) is
      now correct, analogously to besselI(), see PR#13556.

    • tools::file_path_as_absolute() doubled the file separator when
      applied to a file such as "/vmunix" or (on Windows) "d:/afile" in
      a directory for which 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.)

    • unsplit(drop = TRUE) applied to a data frame failed to pass drop
      to the computation of row names.  (PR#14084)

    • The "difftime" method of mean() ignored its na.rm argument.

    • tcltk::tk_select.list() is now more likely to remove the widget
      immediately after selection is complete.

    • Adding/subtracting a "difftime" object to/from a "POSIXt" or
      "Date" object works again (it was broken by the addition of
      Ops.difftime).

    • Conversion to latex of an Rd file with no aliases failed.

    • wilcox.test(conf.int=TRUE) has achieved.level corrected and, for
      exact=FALSE, now returns a estimate component which does not
      depend on the alternative used.

    • help.search() failed when the package argument was specified.
      (PR#14113)

    • switch(EXPR = "A") now returns NULL, as does switch(1) (which
      used to signal an error).

CHANGES IN R VERSION 2.10.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • Package help is now converted from Rd by the R-based converters
      that were first introduced in 2.9.0.  This means

        • 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.

        • 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.)

    • HTML help is now generated dynamically using an HTTP server
      running in the R process and listening on the loopback interface.

        • Those worried about security implications of such a server
          can disable it by setting the environment variable
          R_DISABLE_HTTPD to a non-empty value.  This disables
          help.start() and HTML help (so text help is shown instead).

        • The Java/Javascript search engine has been replaced by an
          HTML interface to help.search().  help.start() no longer has
          an argument searchEngine as it is no longer needed.

        • The HTML help can now locate cross-references of the form
          \link[pkg]{foo} and \link[pkg:foo]{bar} where foo is an alias
          in the package, rather than the documented (basename of a)
          filename (since the documentation has been much ignored).

  NEW FEATURES:

    • polygon(), pdf() and postscript() now have an argument
      fillOddEven (default FALSE), which controls the mode used for
      polygon fills of self-intersecting shapes.

    • New debugonce() function; further, getOption("deparse.max.lines")
      is now observed when debugging, from a code suggestion by John
      Brzustowski.  (PR#13647/8)

    • plot() methods for "stepfun" and hence "ecdf" no longer plot
      points by default for n >= 1000.

    • [g]sub(perl=TRUE) now also supports "\E" in order to *end* "\U"
      and "\L" case changes, thanks to a patch from Bill Dunlap.

    • factor(), 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.

    • New print() (S3) method for class "function", also used for
      auto-printing.  Further, .Primitive functions now print and
      auto-print identically.  The new method is based on code
      suggestions by Romain François.

    • The print() and toLatex() methods for class "sessionInfo" now
      show the locale in a nicer format and have arguments to suppress
      locale information.

    • In addition to previously only round(), there are other Math
      group (S3) methods for "difftime", such as floor(), signif(),
      abs(), etc.

    • For completeness, old.packages() and available.packages() allow
      arguments type to be specified (you could always specify
      arguments available or contriburl).

    • available.packages() by default only returns information on the
      latest versions of packages whose version requirements are
      satisfied by the currently running R.

    • tools::write_PACKAGES() has a new argument latestOnly, which
      defaults to TRUE when only the latest versions in the repository
      will be listed in the index.

    • getOption() has a new argument default that is returned if the
      specified option is not set.  This simplifies querying a value
      and checking whether it is NULL or not.

    • parse() now warns if the requested encoding is not supported.

    • The "table" method of as.data.frame() gains a stringsAsFactors
      argument to allow the classifying factors to be returned as
      character vectors rather than the default factor type.

    • If model.frame.default() encounters a character variable where
      xlev indicates a factor, it now converts the variable to a factor
      (with a warning).

    • curve() now returns a list containing the points that w§ere
      drawn.

    • spineplot() now accepts axes = FALSE, for consistency with other
      functions called by plot.factor().

    • The Kendall and Spearman methods of cor.test() can optionally use
      continuity correction when not computing exact p-values.  (The
      Kendall case is the wish of PR#13691.)

    • R now keeps track of line numbers during execution for code
      sourced with options(keep.source = TRUE).  The source reference
      is displayed by debugging functions such as traceback(),
      browser(), recover(), and dump.frames(), and is stored as an
      attribute on each element returned by sys.calls().

    • More functions now have an implicit (S4) generic definition.

    • 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.

    • weighted.mean() is now generic and has "Date", "POSIXct" and
      "POSIXlt" methods.

    • Naming subscripts (e.g. x[i=1, j=2]) in data.frame methods for [
      and [[ 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.)

    • as.data.frame() has an "aovproj" method.  (Wish of PR#13505)

    • as.character(x) for numeric x no longer produces strings such as
      "0.30", i.e., with trailing zeros.  This change also renders
      levels construction in factor() more consistent.

    • 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 R CMD check <pkg> when the package
      defines S4 classes.

    • codoc() now also checks S4 methods for code/documentation
      mismatches.

    • for(), while(), and 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.

    • The print() method for ls.str() results now obeys an optional
      digits argument.

    • The method argument of glm() now allows user-contributed methods.

    • More general reorder.default() replaces functionality of
      reorder.factor() and reorder.character().

    • The function aspell() has been added to provide an interface to
      the Aspell spell-checker.

    • Filters RdTextFilter() and SweaveTeXFilter() have been added to
      the tools package to provide support for aspell() or other spell
      checkers.

    • xtabs() with the new argument sparse = TRUE now returns a sparse
      Matrix, using package Matrix.

    • contr.sum() etc gain an argument sparse which allows sparse
      matrices to be returned.

      contrasts() also gains a sparse argument which it passes to the
      actual contrast function if that has a formal argument sparse.

      contrasts(f, .) <- val now also works when val is a sparse
      Matrix.  It is planned that model.matrix() will work with such
      factors f in the future.

    • readNEWS() will recognize a UTF-8 byte-order mark (BOM) in the
      NEWS file.  However, it is safer to use only ASCII code there
      because not all editors recognize BOMs.

    • New utility function inheritedSlotNames() for S4 class
      programming.

    • tabulate() now allows NAs to pass through (and be ignored).

    • If debug() is called on an S3 generic function then all methods
      are debugged as well.

    • Outlier symbols drawn by boxplot() now obey the outlwd argument.
      Reported by Jurgen Kluge.

    • svd(x) and eigen(x) now behave analogously to qr(x) in accepting
      logical matrices x.

    • File NEWS is now in UTF-8, and has a BOM (often invisible) on the
      first line, and Emacs local variables set for UTF-8 at the end.
      RShowDoc("NEWS") should display this correctly, given suitable
      fonts.

    • terms.formula(simplify = TRUE) now does not deparse the LHS and
      so preserves non-standard responses such as `a: b` (requested by
      Sundar Dorai-Raj).

    • New function news() for building and querying R or package news
      information.

    • z^n for integer n and complex z is more accurate now if |n| <=
      65536.

    • factor(NULL) now returns the same as factor(character(0)) instead
      of an error, and table(NULL) consequently does analogously.

    • 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).

    • writeLines(), writeBin() and writeChar() have a new argument
      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.

    • iconv() has a new argument mark which can be used (by experts) to
      suppress the declaration of encodings.

    • DESCRIPTION file's LinkingTo specs are now recognized as
      installation dependencies, and included in package management
      computations.

    • Standardized DESCRIPTION file License specs are now available for
      package management computations.

    • "\uxxxx" and "\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).

    • New as.raw() method for "tclObj" objects (wish of PR#13758).

    • Rd.sty now makes a better job of setting email addresses,
      including using a monospaced font.

    • textConnection() gains an encoding argument to determine how
      input strings with marked encodings will be handled.

    • R CMD Rd2pdf is available as a shortcut for R CMD Rd2dvi --pdf.

    • R CMD check now checks links where a package is specified
      (\link[pkg]{file} or \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.

    • identical() gains three logical arguments, which allow for even
      more differentiation, notably -0 and 0.

    • legend() now can specify the border color of filled boxes, thanks
      to a patch from Frederic Schutz.

    • Indexing with a vector index to [[ ]] has now been extended to
      all recursive types.

    • Pairlists may now be assigned as elements of lists.  (Lists could
      always be created with pairlist elements, but [[<- didn't support
      assigning them.)

    • The parser now supports C-preprocessor-like #line directives, so
      error messages and source references may refer to the original
      file rather than an intermediate one.

    • New functions findLineNum() and setBreakpoint() work with the
      source references to find the location of source lines and set
      breakpoints (using trace()) at those lines.

    • Namespace importing is more careful about warning on masked
      generics, thanks to a patch by Yohan Chalabi.

    • detach() now has an argument character.only with the same meaning
      as for library() or require().

    • available.packages() gains a filters argument for specifying the
      filtering operations performed on the packages found in the
      repositories.  A new built-in "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.

    • In registering an S3 class by a call to 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.

    • The argument f to showMethods() can be an expression evaluating
      to a generic function, allowing methods to be shown for
      non-exported generics and other nonstandard cases.

    • sprintf() now supports %o for octal conversions.

    • New function Sys.readlink() for information about symbolic links,
      including if a file is a symbolic link.

    • Package tools has new functions checkRdaFiles() and
      resaveRdaFiles() to report on the format of .rda/.RData data
      files, and to re-save them in a different compressed format,
      including choosing the most compact format available.

      A new INSTALL option, --resave-data, makes use of this.

    • File ~/.R/config is used in preference to ~/.Rconfig, and these
      are now documented in ‘R Installation and Administration’.

    • Logic operations with complex numbers now work, as they were
      always documented to, and as in S.

    • arrows() and segments() allow one of x1 or y1 to be omitted to
      simplify the specification of vertical or horizontal lines
      (suggestion of Tim Hesterberg).

    • approxfun() is faster by avoiding repeated NA checks (diagnosis
      and patch by Karline Soetaert & Thomas Petzoldt).

    • There are the beginnings of a Nynorsk translation by Karl Ove
      Hufthammer.

    • stripchart() allows par bg to be passed in for the background
      colour for pch = 21 (wish of PR#13984).

    • New generic function .DollarNames() to enable class authors to
      customize completion after the $ extractor.

    • load(), save(), dput() and dump() now open a not-yet-open
      connection in the appropriate mode (as other functions using
      connections directly already did).

  REGULAR EXPRESSIONS:

    • 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 "^*".  Also, the interpretation of
      ranges such as [W-z] in caseless matching is no longer to map the
      range to lower case.

      This engine may in future be used in ‘literal’ mode for fixed =
      TRUE, and there is a compile-time option in src/main/grep.c to do
      so.

    • The use of repeated boundary regexps in gsub() and gregexpr() as
      warned about in the help page does not work in this engine (it
      did in the previous one since 2005).

    • Extended (and basic) regexps now support same set of options as
      for fixed = TRUE and perl = TRUE, including useBytes and support
      for UTF-8-encoded strings in non-UTF-8 locales.

    • agrep() now has full support for MBCS locales with a modest speed
      penalty.  This enables help.search() to use approximate matching
      character-wise rather than byte-wise.

    • [g]sub use a single-pass algorithm instead of matching twice and
      so is usually faster.

    • The perl = TRUE versions now work correctly in a non-UTF-8 MBCS
      locale, by translating the inputs to UTF-8.

    • useBytes = TRUE now inhibits the translation of inputs with
      marked encodings.

    • strsplit() gains a useBytes argument.

    • The algorithm used by strsplit() has been reordered to batch by
      elements of split: this can be much faster for fixed = FALSE (as
      multiple compilation of regexps is avoided).

    • The help pages, including ?regexp, have been updated and should
      be consulted for details of the new implementations.

  HELP & Rd FILE CHANGES:

    • A new dynamic HTML help system is used by default, and may be
      controlled using tools::startDynamicHelp().  With this enabled,
      HTML help pages will be generated on request, resolving links by
      searching through the current .libPaths().  The user may set
      options("help.ports") to control which IP port is used by the
      server.

    • help.start() no longer sets options(htmlhelp = TRUE) (it used to
      on Unix but not on Windows).  Nor does it on Unix reset the
      "browser" option if given an argument of that name.

      Arguments update and remote are now available on all platforms:
      the default is update = FALSE since the http server will update
      the package index at first use.

    • help() has a new argument help_type (with default set by the
      option of that name) to supersede arguments offline, htmlhelp and
      chmhelp (although for now they still work if help_type is unset).
      There is a new type, "PDF" to allow offline PDF (rather than
      PostScript).

      A function 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 utils namespace is used.

    • Plain text help is now used as the fallback for HTML help (as it
      always was for Compiled HTML help on Windows).

    • It is possible to ask for static HTML pages to be prebuilt _via_
      the configure option --enable-prebuilt-html.  This may be useful
      for those who wish to make HTML help available outside R, e.g. on
      a local web site.

    • An experimental tag \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.

    • Tags \if, \ifelse and \out have been added to allow
      format-specific (or more general, using \Sexpr) conditional text
      in man pages.

    • The 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.

    • parse_Rd() now has an argument fragment (default FALSE) to accept
      small fragments of Rd files (so that \Sexpr can output Rd code
      which is then parsed).

    • parse_Rd() now always converts its input to UTF-8.  The Rd2*
      rendering functions have a new argument, outputEncoding, which
      controls how their output is encoded.

    • parse_Rd() no longer includes the newline as part of a "%"-style
      comment.

    • There have been various bug fixes and code reorganization in the
      Rd renderers Rd2HTML, Rd2latex, Rd2txt, and 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).

    • print.Rd() now adds necessary escape characters so that printing
      and re-parsing an Rd object should produce an equivalent object.

    • parse_Rd() was incorrectly handling multiple backslashes in R
      code strings, converting 4n+3 backslashes to 2n+1 instead of
      2n+2.

    • parse_Rd() now recognizes the \var tag within a quoted string in
      R-like text.

    • parse_Rd() now treats the argument of \command as LaTeX-like,
      rather than verbatim.

  COMPRESSION:

    • New function untar() to list or unpack tar archives, possibly
      compressed.  This uses either an external tar command or an
      internal implementation.

    • New function tar() to create (possibly compressed) tar archives.

    • New functions memCompress() and memDecompress() for in-memory
      compression and decompression.

    • bzfile() has a compress argument to select the amount of effort
      put into compression when writing.

    • New function xzfile() for use with xz-compressed files.  (This
      can also read files compressed by some versions of lzma.)

    • gzfile() looks at the file header and so can now also read
      bzip2-ed files and xz-compressed files.

    • There are the new options of save(compress = "bzip2") and "xz" to
      use bzip2 or xz compression (which will be slower, but can give
      substantially smaller files).  Argument compression_level gives
      finer control over the space/time tradeoffs.

      load() can read such saves (but only as from this version of R).

    • R CMD INSTALL/check and tools::writePACKAGES accept a wider range
      of compressed tar archives.  Precisely how wide depends on the
      capabilities of the host system's tar command: they almost always
      include .tar.bz2 archives, and with modern versions of tar other
      forms of compression such as lzma and xz, and arbitrary
      extensions.

    • R CMD INSTALL has a new option --data-compress to control the
      compression used when lazy-loading data.  New possibilities are
      --data-compress=bzip2 which will give ca 15% better compression
      at the expense of slower installation times, and
      --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 survival.)

    • file() for open = "", "r" or "rt" will automagically detect
      compressed files (from gzip, bzip2 or xz).  This means that
      compressed files can be specified by file name (rather than _via_
      a gzfile() connection) to read.table(), readlines(), scan() and
      so on.

    • data() can handle compressed text files with extensions
      .{txt,tab,csv}.{gz,bz2,xz} .

  DEPRECATED & DEFUNCT:

    • png(type="cairo1") is defunct: the value is no longer recognized.

    • tools::Rd_parse() is defunct (as this version of R uses only Rd
      version 2).

    • Use of file ~/.Rconf (which was deprecated in favour of
      ~/.Rconfig in 2004) has finally been removed.

    • Bundles of packages are deprecated.  See ‘Writing R Extensions’
      for the steps needed to unbundle a bundle.

    • help() arguments offline, htmlhelp and chmhelp are deprecated in
      favour of help_type.

    • clearNames() (in package stats) is deprecated for unname().

    • Basic regular expressions (extended = FALSE) are deprecated in
      strsplit, 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 fixed =
      TRUE when using extended = FALSE.

    • methods::trySilent() is deprecated in favour of try(silent=TRUE)
      or - more efficiently and flexibly - something like
      tryCatch(error = function(e) e).

    • index.search() is deprecated: there are no longer directories of
      types other than help.

  INSTALLATION:

    • cairo >= 1.2 is now required (1.2.0 was released in July 2006)
      for cairo-based graphics devices (which remain optional).

    • A suitable iconv() is now required: support for configure option
      --without-iconv has been withdrawn (it was deprecated in R
      2.5.0).

    • Perl is no longer ‘essential’.  R can be built without it, but
      scripts R CMD build, check, Rprof and Sd2d currently require it.

    • A system glob function is now essential (a working Sys.glob() has
      been assumed since R 2.9.0 at least).

    • C99 support for MBCS is now required, and configure option
      --disable-mbcs has been withdrawn.

    • Having a version of tar capable of automagically detecting
      compressed archives is useful for utils::untar(), and so gtar (a
      common name for GNU tar) is preferred to tar: set environment
      variable TAR to specify a particular tar command.

  INTERNATIONALIZATION:

    • There is some makefile support for adding/updating translations
      in packages: see po/README and ‘Writing R Extensions’.

      There is support for the use of dngettext for C-level
      translations in packages: see ‘Writing R Extensions’.

  BUG FIXES:

    • Assigning an extra 0-length column to a data frame by DF[, "foo"]
      <- value now works in most cases (by filling with NAs) or fails.
      (It used to give a corrupt data frame.)

    • validObject() avoids an error during evaluation in the case of
      various incorrect slot definitions.

    • n:m now returns a result of type "integer" in a few more boundary
      cases.

    • The zap.ind argument to printCoefmat() did not usually work as
      other code attempted to ensure that non-zero values had a
      non-zero representation.

    • printCoefmat() formatted groups of columns together, not just the
      cs.ind group but also the zap.ind group and a residual group.  It
      now formats all columns except the cs.ind group separately (and
      zaps the zap.ind group column-by-column).  The main effect will
      be see in the output from print.anova(), as this grouped SS-like
      columns in the zap.ind group.

    • R_ReplDLLinit() initializes the top-level jump so that some
      embedded applications on Windows no longer crash on error.

    • 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.

    • methods(f) used to warn unnecessarily for an S4 generic f which
      had been created based on an existing S3 generic.

    • The check for consistent ordering of superclasses was not
      ignoring all conditional relations (the symptom was usually
      spurious warnings for classes extending "array").

    • Trying to assign into a raw vector with an index vector
      containing NAs could cause a segfault.  Reported by Hervé Pagès.

    • Rscript could segfault if (by user error) its filename argument
      was missing.  Reported by Martin Morgan.

    • getAnywhere() (and functions that use it, including argument
      completion in the console) did not handle special built-in
      functions.  Reported by Romain Francois.

    • order() was missing a PROTECT() call and so could segfault when
      called on character data under certain (rare) circumstances
      involving marked non-native encodings.

    • prettyNum(z, drop0trailing=TRUE) did not work correctly when z
      was a complex vector.  Consequently, str(z, ...) also did not.
      (PR#13985)

    • make distclean removed too many files in etc/ if builddir =
      srcdir.

    • R CMD replaced TEXINPUTS rather than appending to it (as
      documented and intended).

    • help.start() no longer fails on unix when "browser" is a
      function.

    • pbeta(x, ..., log.p = TRUE) is sometimes more accurate, e.g., for
      very small x.

    • Unserializing a pre-2.8 workspace containing pure ASCII character
      objects with a Latin-1 or UTF-8 encoding would corrupt the
      CHARSXP cache.


	**************************************************
	*						 *
	*	       2.9 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.9.2 patched


NEW FEATURES

    o	On systems using ICU for collation (including Mac OS X), using
	Sys.setlocale() to change the LC_COLLATE setting is more
	likely to change the collation provided by ICU.


BUG FIXES

    o	On systems using zipped data and help (Windows) the names of
	datasets could clash with temporary filenames used when
	running examples, causing errors.

    o	as.complex() sometimes warned about NAs on coercions and
	sometimes not (when the C function asComplex was used, e.g. on
	list elements).	 (PR#13942)

    o	cat() on an unopened connection could close it twice, and
	with file() connections segfaulted on some systems.

    o	Printing a list could segfault if the elements are nested too
	deeply.



		CHANGES IN R VERSION 2.9.2


NEW FEATURES

    o	install.packages(NULL) now lists packages only once even if they
	occur in more than one repository (as the latest compatible
	version of those available will always be downloaded).

    o	approxfun() and approx() now accept a 'rule' of length two, for
	easy specification of different interpolation rules on left and
	right.

	They no longer segfault for invalid zero-length specification
	of 'yleft, 'yright', or 'f'.

    o	seq_along(x) is now equivalent to seq_len(length(x)) even where
	length() has an S3/S4 method; previously it (intentionally)
	always used the default method for length().

    o	PCRE has been updated to version 7.9 (for bug fixes).

    o	agrep() uses 64-bit ints where available on 32-bit platforms
	and so may do a better job with complex matches.
	(E.g. PR#13789, which failed only on 32-bit systems.)


DEPRECATED & DEFUNCT

    o	R CMD Rd2txt is deprecated.  (It is just a wrapper for
	R CMD Rdconv -t txt.)

    o	tools::Rd_parse() is deprecated and will be removed in 2.10.0
	(which will use only Rd version 2).


BUG FIXES

    o	parse_Rd() still did not handle source reference encodings
	properly.

    o	The C utility function PrintValue no longer attempts to print
	attributes for CHARSXPs as those attributes are used
	internally for the CHARSXP cache.  This fixes a segfault when
	calling it on a CHARSXP from C code.

    o	PDF graphics output was producing two instances of anything
	drawn with the symbol font face. (Report from Baptiste Auguie.)

    o	length(x) <- newval and grep() could cause memory corruption.
	(PR#13837)

    o	If model.matrix() was given too large a model, it could crash
	R. (PR#13838, fix found by Olaf Mersmann.)

    o	gzcon() (used by load()) would re-open an open connection,
	leaking a file descriptor each time. (PR#13841)

    o	The checks for inconsistent inheritance reported by setClass()
	now detect inconsistent superclasses and give better warning
	messages.

    o	print.anova() failed to recognize the column labelled
	P(>|Chi|) from a Poisson/binomial GLM anova as a p-value
	column in order to format it appropriately (and as a
	consequence it gave no significance stars).

    o	A missing PROTECT caused rare segfaults during calls to
	load().	 (PR#13880, fix found by Bill Dunlap.)

    o	gsub() in a non-UTF-8 locale with a marked UTF-8 input
	could in rare circumstances overrun a buffer and so segfault.

    o	R CMD Rdconv --version was not working correctly.

    o	Missing PROTECTs in nlm() caused "random" errors. (PR#13381 by
	Adam D.I. Kramer, analysis and suggested fix by Bill Dunlap.)

    o	Some extreme cases of pbeta(log.p = TRUE) are more accurate
	(finite values < -700 rather than -Inf).  (PR#13786)

	pbeta() now reports on more cases where the asymptotic
	expansions lose accuracy (the underlying TOMS708 C code was
	ignoring some of these, including the PR#13786 example).

    o	new.env(hash = TRUE, size = NA)	now works the way it has been
	documented to for a long time.

    o	tcltk::tk_choose.files(multi = TRUE) produces better-formatted
	output with filenames containing spaces.  (PR#13875)

    o	R CMD check --use-valgrind did not run valgrind on the package tests.

    o	The tclvalue() and the print() and as.xxx methods for class
	"tclObj" crashed R with an invalid object -- seen with an
	object saved from an earlier session.

    o	R CMD BATCH garbled options -d <debugger> (useful for
	valgrind, although --debugger=valgrind always worked)

    o	INSTALL with LazyData and Encoding declared in DESCRIPTION
	might have left options("encoding") set for the rest of the
	package installation.



		CHANGES IN R VERSION 2.9.1


NEW FEATURES

    o	New function anyDuplicated(x) returns 0 (= FALSE) or the index
	of the first duplicated entry of x.

    o	matplot(), matlines() and matpoints() now also obey a 'lend'
	argument, determining line end styles. (Wish of PR#13619).

    o	bw.SJ(), bw.bcv() and bw.ucv() now gain an optional 'tol'
	argument allowing more accurate estimates.

    o	new.packages() no longer regards packages with the same name
	as a member of an installed bundle as 'new' (this is now
	consistent with the dependency checks in install.packages()).

	It no longer reports on partially installed bundles (since
	members can be updated individually if a bundle is unbundled).

    o	old.packages() and hence updates.packages() will look for
	updates to members of package bundles before updates to the
	whole bundle: this allow bundles to be split and installations
	updated.

    o	nlminb() gives better non-convergence messages in some cases.

    o	S3 method dispatch will support S4 class inheritance for S3
	methods, for primitives and via UseMethod(), if the argument
	S3methods=TRUE is given to setClass().	S4 method dispatch
	will use S3 per-object inheritance if S3Class() is set on the
	object.	 See ?Methods and the paper referenced there.

    o	R CMD INSTALL is more tolerant of (malformed) packages with a
	'man' directory but no validly named .Rd files.

    o	R CMD check now reports where options are used that cause some
	of the checks to be skipped.

    o	RSiteSearch has been updated to be consistent with the new
	layout of the search site itself, which now includes separate
	options for vignettes, views, and r-sig-mixed-models, as well
	as changed names for r-help. (Contributed by Jonathan Baron.)

    o	That R CMD check makes use of a
	<pkg>/tests/Examples/<pkg>-Ex.Rout.save file as a reference
	result is now documented in 'Writing R Extensions'.


DEPRECATED & DEFUNCT

    o	print.atomic() (defunct since 1.9.0) has been removed since it
	caused confusion for an S4 class union "atomic".

    o	png(type="cairo1") is deprecated -- it was only needed for
	platforms with 1.0 <= cairo < 1.2.


BUG FIXES

    o	The ... argument was not handled properly when ... was found
	in the enclosure of the current function, rather than in the
	function header itself.	 (This caused integrate() to fail in
	certain cases.)

    o	col2rgb("#00000080", TRUE) would return the background colour.
	(Reported by Hadley Wickham.)

    o	interaction() now ensures that the levels of the result are unique.

    o	packageDescription() and hence sessionInfo() now report the correct
	package version also for a non-attached loaded namespace of
	a version different from the default lib.loc.

    o	smoothScatter() now also works when e.g. xlim[2] < xlim[1].

    o	Invalid use of sprintf() such as sprintf("%S%") now give an error
	instead of a segmentation fault, as do very unusual cases such as
	sprintf("%s", tryCatch(stop(), error=identity)).  (It was
	always documented that misuse could crash R in
	platform-dependent ways.)

    o	parse_Rd() would mishandle braces when they occurred at
	the start of a line within an R string in an Rd file (reported
	by Alex Couture-Beil) or when they occurred in an R comment
	(reported by Mark Bravington).

    o	readNEWS() missed version numbers with more than one digit.

    o	building R --without-x no longer fails (PR#13665)

    o	printCoefmat(cbind(0,1)) now works too (PR#13677)

    o	bw.SJ(c(1:99, 1e6)) now works too.

    o	Rd2txt() could not handle empty descriptions of items in an Rd
	file (reported by Mark Bravington), and did not wrap long lists
	of arguments if they were given in a single item.

    o	stars() would do a partial plot when called with plot = FALSE;
	it now consistently returns the locations of the stars.

    o	Rd2latex() could not handle empty sections.

    o	old.packages() and hence update.packages() would fail on a
	repository which contained only one package but with multiple
	versions of that package.

    o	as.character.Rd() added extra braces when displaying two-argument
	macros.	 (Report and fix by Manuel Eugster.)

    o	unsplit() was misbehaving in the case of single-column data
	frames. (Reported by Will Gray.)

    o	as(I(1), "vector") and similar coercions from objects of
	"unregistered" S3 classes now work.

    o	srcref records produced by parse() and parse_Rd() did not record
	the encoding of the source file.  (Reported by Romain Francois.)

    o	The X11 version of View() was misbehaving in MBCS locales, and
	PgUp/PgDn now behave better, thanks to a patch from Ei-ji Nakama.

    o	R CMD check looked at the environment variable PDFLATEX, but
	as from R 2.8.1 R CMD Rd2dvi used R_PDFLATEXCMD in
	preference, and that was set by R CMD (and not PDFLATEX).  Now
	R CMD check looks at R_PDFLATEXCMD.

    o	sprintf() now signals an error when the result of single format
	specification would be longer than the limit (8192 bytes); it would
	return "somewhat random" results or segfault previously. (PR#13667)
	Further, arguments of type "language" or "symbol" are no longer
	allowed, as these, e.g., sprintf("%s", quote(list())), typically
	lead to unexpected results or hard to understand error messages.

    o	The new (in 2.9.0) 'stringsAsFactors' argument to expand.grid()
	was not working: it now does work but has default TRUE for
	backwards compatibility.

    o	tcrossprod(<1d-array>, <matrix>) now does work when the arguments
	are of compatible dimensions.

    o	qbinom() now is accurate also in (large size, small prob)
	cases.	(PR#13711)

    o	The calculation of the Spearman p-value in cor.test() is
	slightly more accurate in some cases.  (PR#13574)

    o	The digamma(), trigamma() and psigamma() functions could be
	inaccurate for values of x around 1e-15 due to cancellation.
	(PR#13714).

    o	median.default() was altered in 2.8.1 to use sum() rather
	than mean(), although it was still documented to use mean().
	This caused problems for POSIXt objects, for which mean() but
	not sum() makes sense, so the change has been reverted.

    o	Assigning an extra 0-length column to a data frame by
	DF$foo <- value gave a corrupt data frame rather than failing.
	(PR#13724)  This also happened for DF[["foo"]] <- value.

    o	R CMD INSTALL no longer gives a spurious warning about old R
	versions ignoring multiple dependencies, if the conditions are
	known to be satisfied.

    o	The test for setting dim() allowed a value with two or more
	NAs to be set on a 0-length object.  (PR#13729)	 Also, it
	allowed an even number of negative values.

    o	xtfrm(), rank(), sort() and order() did not always make use of
	custom comparison methods specific to the class of elements
	being sorted.

    o	Increase NAMED value on 'seq' value in for() loop so loop code
	cannot modify 'seq' value.

    o	Prevent rectangles of size < 0.5 pixel from disappearing in
	Quartz when using rastered backend.  (PR#13744)

    o	Printing _NA_complex_ had a low-level thinko; patch thanks to
	Bill Dunlap.

    o	CP1257 encoding for postscript/PDF has been corrected.	(PR#13736)

    o	aov() with an error term was evaluating the ... arguments in
	2.9.0 whilst checking their names, so could fail by evaluating
	them in the wrong place.  (PR#13733)

    o	The print() method for arima() failed if all coefs were fixed.

    o	R CMD INSTALL --no-latex was not implemented in 2.9.0 (only).

    o	Added a needed PROTECT call in RunFinalizers to handle cases where
	the routine is called recursively from a GC in a finalizer.

    o	Constructing error messages about unused arguments in calls to
	closures no longer evaluates the arguments.

    o	qr(x, LAPACK=TRUE) did not coerce integer x to numeric.

    o	qr.coef() misbehaved in the LAPACK case with a matrix RHS, so
	that solve(qr(x, LAPACK=TRUE)) gave wrong results. (Found by
	Avraham Adler, PR#13762 by Ravi Varadhan.)



		CHANGES IN R VERSION 2.9.0


NEW FEATURES

    o	Package 'Matrix' is now a recommended package contained in the
	basic R distribution.  It provides S4 classes and methods for
	dense and sparse matrices, often by using the numerical
	libraries Lapack and from the SuiteSparse collection CHOLMOD,
	CSparse, and SPQR among others.

    o	pdf() and postscript() gain a 'useKerning' argument to place
	strings using kerning (which had previously been ignored in
	display but not in strwidth), based in part on an idea and
	code from Ei-ji Nakama. The default is TRUE.

	Kerning involving spaces is now ignored (it was previously
	only used in the computation of string widths).

    o	seq.default() and seq.int() ensure that the result is within the
	interval [from, to] even when the last value would previously
	have been slightly out of range because of the allowance for
	rounding error in computing the number of elements.

    o	boxplot() gains a simple 'matrix' method, enabling boxplot(mat)
	instead of boxplot(data.frame(mat)).

    o	zip.file.extract() gains an optional 'dir' argument (but use
	unzip() instead).

    o	source() with 'encoding' specified (and not as "unknown") marks
	the encoding of character strings in Latin-1 and UTF-8
	locales.

    o	parse(text=z) now marks the encoding of character strings in
	Latin-1 and UTF-8 locales if 'z' is of known encoding (that is
	all elements are either ASCII or marked as Latin-1 or UTF-8).

    o	sprintf() does stricter error checking on input formats to
	avoid passing invalid formats to the OS (which have a tendency
	to crash under such inputs).

    o	expand.grid() gains a 'stringsAsFactors' argument to ask for
	automatic conversion of character vectors to factors (which
	happened for many years but was not previously documented).
	[This did not actually work prior to R 2.9.1.]

    o	bxp() now computes the 'ylim' including the outliers only if
	'outline = TRUE'.  (Wish of PR#13196)

    o	barplot() gains a 'args.legend' argument.  (Wish of PR#13265).

    o	RweaveLatexSetup() now accepts all (and not just some) options
	passed through from Sweave()

    o	cumsum(x) and cumprod(x) for double precision x now use a long
	double accumulator where available and so more closely match
	sum() and prod() in potentially being more accurate.

    o	plot() methods for "stepfun" (and hence "ecdf") gain an 'col'
	argument, allowing to set all three colors simultaneously.

    o	Iterating over a factor in a for loop now coerces to a character
	vector (rather than using the integer codes).

    o	data.frame() now recycles columns of list arguments, not just
	vectors and factors.

    o	plot.ts(plot.type="multiple") now makes use of *.lab and
	*.axis graphical parameters (wish of PR#13134 and 13135).

    o	Classes can be exported from a name space using the NAMESPACE
	file directive 'exportClassPattern' which has the same syntax
	as 'exportPattern'.

    o	strftime() now converts its first argument with as.POSIXlt()
	and so is no longer an alias for format.POSIXLt.

    o	body<-() now treats list values consistently with other
	types: they no longer need to be wrapped in a list() call.

    o	option("pdfbrowser") is now set on Windows as well as on Unix-alikes.

    o	object.size() now returns an object of class "object_size" and
	has a print() method.

    o	[col/row]Sums(), *Means() now have an additional '...' argument,
	so that they can more easily be turned into generic functions.

    o	Package 'tools' contains dependsOnPkgs() to compute reverse
	dependencies.

    o	Strict type checking is now turned on: this catches more
	internal corruptions, and some badly written contributed code.

    o	There are new functions in package 'tcltk', tk_choose.files(),
	tk_choose.dir() and tk_messageBox(), analogues of functions
	available on Windows (the last is an analogue of winDialog).

    o	Sys.glob() now does tilde expansion on all platforms.

    o	read.table() and friends gain a 'fileEncoding' argument to
	make re-encoding of input just a little bit simpler.

    o	grep() gains an 'invert' argument mimicking 'grep -v/--invert'.

    o	strwrap() now allows a separate prefix for the first line.

    o	grep() has a more efficient sibling grepl() that returns a
	logical vector.

    o	xfig() has new arguments 'defaultFont' and 'textSpecial'
	contributed by Sebastian Fischmeister.

    o	parse() and parse_Rd() now point to syntax errors in the
	reported error context, and include the filename and line and
	column numbers so smart text editors can jump to the error
	location.

    o	str(<1d-array>) now writes "[1:n(1d)]" instead of the previous
	less clear "[, 1:n]".

    o	New function testInstalledPackage() in package 'tools' allows
	the examples (and if they were installed) any package-specific
	tests to be run on an installed package.

	testInstalledPackages() can run all the examples and tests in
	the standard and/or recommended packages.  Also
	testInstalledBasic() can run the basic tests (if installed).

    o	file.copy() now has a 'recursive' argument.

    o	Errors in setOldClass() will cause a previous definition to be restored.

    o	Ambiguities in class inheritance and method selection resulting
	from duplicates in superclasses are now resolved by requiring
	(if possible) consistency with all the superclass inheritance. The
	rules for method selection have been revised to take advantage of
	the improved ordering.
	See ?Methods and the reference there related to inheritance.

    o	New function unzip() in package 'utils' to expand or list zip
	archives.

    o	Replacement functions for class() and oldClass()  will unset
	the S4 bit when the replacement can't be an S4 object;
	oldClass() will return the S3 class for S4 objects with slot
	.S3Class.

    o	clip() takes extra steps to avoid the next graphics call
	resetting the clip region.

    o	New function sample.int() to provide documented access to the
	internal part of sample() (sampling from seq_len(n)).

    o	New version of withVisible() for better handling of cases like
	withVisible(eval.parent(....)). Moved to package 'base' with a
	view to replace .Internal(eval.with.vis) in source() later.

    o	showClass() which is also used to auto-print class definitions, now
	mentions the package where the class comes from, if there is one.

    o	simulate(obj) now also works for "glm" objects and for weighted
	fits, thanks in part to contributions from Ben Bolker and
	Heather Turner.	 There is now a means to extend the methods
	available for "glm" objects, as glm families can have an
	optional 'simulate' component.

    o	S4 classes that inherit from any of the "structure" classes or
	from "vector" will turn on methods for all the "Ops" group of
	functions when the package containing the classes is
	loaded. See class?structure.

    o	A mechanism now allows S4 classes to inherit from object types
	"environment", "externalptr" and symbol ("name").  See ?setClass.

    o	demo() gains 'echo' and 'ask' arguments, with defaults similar
	to example().

    o	library() no longer checks for the packages merged during the
	re-organization of 1.9.0.

    o	New function poisson.test() in package 'stats' for exact test
	of rates and rate ratios.

    o	New function isdebugged() indicates whether its argument has the
	debug flag set or not.

    o	ls.str() [via print method] now also works when some objects in
	the environment are missing().

    o	Subsetting S4-objects (without an explicit "[" method) no longer
	preserves the class in cases like setClass("C",
	contains="list"); This reverts a "bug fix" activated in	 R 2.8.0.

    o	.packages() and .find.packages() no longer check the package
	info for installed packages with dumped metadata, since this
	was checked when the package was installed.  .packages() only
	considers such packages to be validly installed (any others
	were installed in a long-obsolete version of R).  Both changes
	speed up searches in libraries of thousands of packages.

    o	boxplot() uses butt line endings for its median line
	(suggestion of Uwe Ligges, PR#13553).

    o	S4 objects passed to a non-default S3 method will be converted
	to a valid S3 object with the S3 class.	 See the section on
	inheriting from non-S4 classes in ?Classes.

    o	A new class "nonStructure" has been defined; classes that extend
	a vector class but that should lose their slots under Math or
	Ops functions should extend this class.	 See class?nonStructure.

    o	axis.POSIXct() now plots in the timezone marked for its inputs
	(if any) rather than in the local time.	 The latter was a
	deliberate choice, but is easy to select by removing the
	'tzone' attribute.  (Suggestion of Dan Kelley.)

    o	A new function classesToAM() returns an adjacency matrix
	representing the inheritance of the classes specified.	Allows
	better human examination of the patterns, e.g. by using the
	matrix as input to one of the graph packages (see the
	documentation).

    o	X11options(antialias = "none") now works, for consistency with
	X11().

    o	sprintf() now allows zero-length arguments (with a zero-length
	result).  (Suggestion of Bill Dunlap.)

    o	unlink() is now able to remove broken symbolic links on
	Unix-alikes.

    o	New selectSuperClasses() utility in package 'methods'.

    o	HoltWinters() now allows parameters alpha and beta to be fixed
	at 0 and hence beta = FALSE and gamma = FALSE are used to
	specify restricted models.

    o	A new function smoothScatter() has been added to package
	'graphics'.  It is appropriate for very dense scatter plots
	and uses density estimation and color to reflect density of
	plotting.


DEPRECATED & DEFUNCT

    o	allGenerics() is defunct.

    o	Use of allocVector(CHARSXP ...) is defunct and gives an error.

    o	The compatibility define for graphics structure NewDevDesc in
	GraphicsDevice.h has been removed.

    o	Support for versioned installs (R CMD INSTALL --with-package-versions
	and install.packages(installWithVers = TRUE)) has been removed.
	Packages installed with versioned names will be ignored.

    o	The numeric and power(0.5) forms of argument to make.link()
	which were deprecated in 2.4.0 are now defunct: use power()
	directly.

    o	Conversion to Sd and Ssgm by R CMD Rdconv is now defunct.

    o	Support for R --gui=gnome is now defunct (and package
	gnomeGUI has been withdrwan as it used a long-obsolete version
	of GNOME).

    o	R CMD SHLIB on Windows will call the first target (not 'all') in
	Makevars[.win] in future versions: so make 'all' the first
	target if you have any.


UTILITIES

    o	R CMD build now also uses a Makevars[.win] file for cleaning
	up src/.

    o	R CMD Rd2dvi and R CMD check are now able to cope with Cyrillic
	characters in UTF-8 if environment variable _R_CYRILLIC_TEX_
	is set to a non-empty value and the latex system has suitable
	fonts (thanks to a hint from Alexey Shipunov).

    o	New function rtags() in package 'utils' that provides etags-like
	indexing capabilities for R code files.

	New front-end script R CMD rtags provides an interface to the
	rtags() function (see R CMD rtags --help for details).

    o	New environment variable R_TEXI2DVICMD to hold the path (if any)
	to 'texi2dvi' found at configure time: this now provides the
	default to option("texi2dvi").

    o	massage-Examples.pl has been replaced by the R function
	tools:::massageExamples().

    o	R CMD REMOVE now uses remove.packages() and hence removes all
	members of a bundle.

    o	R CMD SHLIB is now an R script and has a new option -n aka
	--dry-run to show what commands would be run.  The same code
	is used on Unix and Windows.

    o	R CMD Rdconv has new options --package and --version to set the
	corresponding fields in HTML conversion.

    o	R CMD check runs the package tests with a custom startup file,
	currently containing 'options(useFancyQuotes = FALSE)'.

	Those tests are run by an R script: using a tests/Makefile
	(undocumented) no longer works.

    o	R CMD config now knows about DYLIB_EXT and SHLIB_EXT, for use
	in configure files.

    o	R CMD BATCH has a new option --no-timing to suppress printing
	out the session timing.

    o	R CMD Rd2dvi can now work on an installed package.

    o	R CMD check no longer loads package 'tcltk' when checking for
	code problems, so more problems may be reported.

    o	For R CMD SHLIB on Windows the default 'all' target only makes
	the DLL, and no longer call targets 'before' and 'after'.


Rd CONVERSION

    o	Rd files have an optional \Rdversion{} section, which if
	missing defaults to 1.0.  There is support for version 1.1, a
	slightly modified version with the following changes:

	- The warnings for \code{} inside example are suppressed.

	- Whitespace between arguments in \item and \section is
	  accepted without a warning (see below).

	- $ is treated literally in text, even for latex conversions.

	- \ is only an escape before % { } \ .

	- \R, \dots and \ldots can be followed by {}, and it is
	  recommended that they when not followed by whitespace.

	- The obsolete interpretation of \Alpha etc is no longer done.

    o	Rd conversion now handles ^ ~ < > | correctly in non-code
	environments (such as \samp), and # and _ even in latex
	conversion (but $ still needs to be escaped in version 1.0).

    o	Whitespace between first and second arguments is now accepted
	for \item and \section, e.g.  \item{foo} {some value}.
	Previously arguments after whitespace were silently ignored,
	and a warning is given for version 1.0 files.

    o	The Rd files created by prompt() and friends are declared to be
	version 1.1.

    o	\alias now supports the escaping of { as well as of %, and this
	is recommended.

    o	parse_Rd(), an experimental parser for Rd files, and Rd2txt(),
	Rd2HTML(), Rd2latex() and Rd2ex(), even more experimental
	converters, have been added to package 'tools'.

    o	R CMD check runs the package's Rd files through parse_Rd() for a
	stricter syntax check.	This can be suppressed by setting
	_R_CHECK_RD_PARSE_ to FALSE.

    o	Added markup \verb, which displays like \code, but parses as
	verbatim text.	Currently only supported by parse_Rd() and
	Rd2HTML().


INSTALLATION

    o	The shell used by the 'R' script and other shell scripts
	intended to be run directly can be specified at installation
	time by setting the (precious) configure variable R_SHELL.

    o	libtool has been updated to 2.2.6a.

    o	--with-ICU is now the default: this means that ICU will be
	used for collation on Mac OS >= 10.4.

    o	make install-tests can be used to install the test files,
	to allowed an installed version of R to be tested -- see the
	R-admin manual.	 This is also supported by the function
	testInstalledPackages() in package 'tools'.

    o	'make install' using a parallel make should now work.

    o	'make check' now always re-makes and re-runs the package
	examples, which are now collated in the locale's order (and
	not ASCII order).

    o	configure will now set the default optimization level for
	gfortran on x86_64 Linux to -O as -O2 has caused problems with
	gfortran 4.3.x.


PACKAGE INSTALLATION

    o	install.packages() is able to infer that repos=NULL was
	intended from the extension on the file name specified as 'pkgs'.

	On Mac OS X it now supports local binary packages with .tar.gz
	extension. Nonetheless .tgz remains the preferred extension
	and is expected in repositories.

	It now checks >= version dependencies for dependent packages,
	and so will install a newer version of a dependency if needed
	and available on the repositories.

	The library being installed into is considered when looking
	for installed packages if it is not already part of
	.libPaths() (as INSTALL already does).

	It has a new argument 'Ncpus' to support parallel installs of
	source packages.

    o	HTML links will be resolved first to the standard packages: this
	avoids other installed packages diverting help on e.g. qr()
	and plot() to themselves. The HTML files are only "touched" if
	they have changed.

    o	A check is done that the R files can be parsed: this both
	prevents a broken package without lazy-loading from being
	installed and gives better diagnostics.

    o	install.packages() gains a 'configure.vars' argument, and both
	this and 'configure.args' get their defaults from options().

    o	There is a unified R script for INSTALL on both Unix-alike and
	Windows that takes option names used by either in the past.

	It adds --no-multiarch to disable building other than the main
	sub-architecture, and allows multiple instances of
	--configure-args and --configure-vars (which will be
	concatenated).

	New option --install-tests will install any package-specific
	tests.

    o	Times in the Packaged: and Built: fields are now recorded in
	UTC, and in most cases in ISO 8601 format.


C-LEVEL FACILITIES

    o	A helper function, asCharacterFactor, converts from factors to
	character vectors.


BUG FIXES

    o	The postscript() output for setting text is faster and smaller.

    o	Subsetting a data frame with duplicate column names without
	selecting columns (e.g. z[i,]) no longer makes the column
	names unique.  This was never documented, but some packages
	have assumed it.

    o	data.frame() no longer ignores row names on objects if the
	first name is empty.  (PR#13230: this has been the behaviour
	for a long time, but apparently undocumented.)

    o	deparse(control="S_compatible") now never uses backticks.

    o	X-spline drawing is improved for cases where the control
	points are located well off the edges of the device.

	The symptom of this problem is the error "reached MAXNUMPTS".

    o	exists() with mode= "any" will no longer run an active binding's
	function.

    o	format(c(1 + 2i, NA)) no longer has extraneous space in "  NA".

    o	mood.test() could fail in 2.8.x on large samples because of
	integer overflow.

    o	heatmap() without a dendrogram could fail. (PR#13512)

    o	Checks for missing values will no longer occasionally result in
	an infinite loop or stack overflow error, depending on the
	compiler.  Active bindings are now always considered to be
	non-missing.

    o	Rd conversion was not accepting \p (as in \pkg} or (when using
	Perl 5.10.x) \k (as in \kbd) in any preamble text in a
	\value{} section, since those are nowadays interpreted by
	Perl.  (PR#13575)

    o	if(as.raw(1)) TRUE  now works as expected. (PR#13630)
	Also,  c(as.raw(12), TRUE) or c(raw(3), pi) do.

    o	duplicated(<data frame>, incomparables = NA) now gives the
	intended error message. (PR#13632)

    o	name handling of as.data.frame() has been sanitized somewhat

    o	Evaluating an assignment expression with a string on the left
	hand side no longer destructively changes the string to a symbol
	in the expression.



	**************************************************
	*						 *
	*	       2.8 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.8.1 patched


NEW FEATURES

    o	R CMD check has a new argument '--install-args' to pass
	command-line arguments to INSTALL.
	E.g. --install-args="--docs=normal" on Windows if the HTML
	Help Workshop is not installed.

    o	R-Forge has been added to R_HOME/etc/repositories, so it will
	be available interactively in setRepositories().

    o	The compiled loess() code has been updated to the current
	version of dloess from Netlib.	This includes patches from Ben
	Tyner which correct some errors when degree = 0 and hence
	solve PR#13570.


INSTALLATION

    o	--with-ICU is now supported (and recommended) on Mac OS X using
	Apple's supplied port.	Note however that the locale category
	LC_COLLATE cannot be changed whilst R is running on Apple's
	version of ICU.

	Configure supports a wider range of ICU versions on other
	OSes: version 3.0 should suffice, and 3.2, 3.8 and 4.0 have
	been tested.


BUG FIXES

    o	grid-based plots no longer reset the base text size to the
	default 96dpi in cairo-based bitmap devices.

    o	Rd conversion was incorrectly parsing \\\* and \\\{ (and other
	cases with an odd number of backslashes greater than one).

	Text conversion of \code{\ etc} was incorrect (a single
	backslash stands for itself inside \code).

	\code{} inside \examples{} is now fixed up (but the warning
	remains, since it will be handled incorrectly in earlier
	versions of R).

    o	as.matrix.data.frame() could fail if coercion changed the
	dimension of one of the columns (as e.g. the coercion of a "Surv"
	object to a character vector does).

    o	When extracting part of a complex list structure using [[]]
	with a vector index, the extracted part was not marked for
	duplication on change. (PR#13411)

    o	Assigning an additional element to a pairlist/language element
	by x[["foo"]] <- value did not name the additional element.

    o	.Call() and .External() were not accepting "NativeSymbolInfo"
	and "NativeSymbol" objects as claimed.	(Patch from Olaf
	Mersmann.)

    o	codoc() was missing some default value mismatches with
	unescaped backslashes, e.g. final="\\" needs to be written as
	final="\\\\" in the Rd file.

	The reports on values now give strings in the original quoted
	format (with \ and " escaped).

    o	The $<- method for pairlists (including language objects)
	failed to duplicate if NAMED was 2.

    o	read.table(blank.lines.skip = FALSE) gave a final empty row on
	files with less than 5 lines (PR#13433).

    o	Workaround for a bug in some versions of iconv that was seen
	with output lines of more than 10,000 bytes and with
	re-encoding requested on an output connection.

    o	The fullrefman.{dvi,pdf} duplicated part I in part II (at
	least on some systems).

    o	cbind() could crash with a zero-length input and a list result.

    o	pdf(colormodel = "gray") was setting the stroke colour for fills.

    o	file.show() with multiple files would only show multiple
	copies of the first one. (PR#13469)

    o	formatC(mode = "character") was documented to work, but
	did not. (PR#13474)

    o	besselI(x,.., expon.scaled=TRUE) now gives accurate results for
	x < 1e5 whereas it previously underflowed for x >~= 1500.
	Further, besselJ(x,..) also computes up to 1e5 (instead of 1e4).

    o	str() was incorrectly warning about its option component
	'formatNum' set by strOptions().

    o	nls(algorithm = "port") did not accept the [factor] notation.
	(PR#13650)

    o	The relational (aka "comparison") operators are now binary, also in
	a lower level sense, and an expression as  "<"(1)  is now erronous.

    o	The 'offset' argument for lm() and glm() is not longer
	documented to be allowed to be of length 1: this has not been
	true for a long time.

    o	format.info(x) is now also correct when x has no finite content.

    o	predict.lm() now works correctly when the fit had more than
	one offset (possibly specified both in the formula and as an
	argument).  This function is called by predict.glm(), so the
	same isses are corrected there.

    o	besselI(x, nu) with nu a negative integer (a singular case) is now
	correct. (PR#13556)



		CHANGES IN R VERSION 2.8.1


NEW FEATURES

    o	sum() now has a method for "difftime" objects (via the Summary
	group).

	max(), min() and range() applied to "difftime" object(s) now
	return a result in the common units of the objects, if there
	is one.

    o	installed.packages() is now tolerant of malformed DESCRIPTION
	files in installed packages (it ignores them, with a warning).

    o	qt() now works for 0 < df < 1.

    o	For consistency with matrix() and array(), dimnames(x) <-
	list() removes the dimnames (as assigning NULL would do).
	It was previously an error.

    o	nlminb() copies names from 'start' to the parameter vector
	used (for consistency with optim()).

    o	legend() gains a 'title.col' argument: the title colour was
	previously set from the first element of 'text.col' (which
	remains the default).

    o	In an Rd file, use of top-level \itemize{} inside a \value{}
	block is unnecessary and almost always gave a faulty
	conversion.  Most cases are now detected and corrected, but
	give a warning as such code will not work correctly in earlier
	versins of R.

	Also, use of \code{} inside a code block such as \examples{}
	will give a erroneous conversion that is now detected and
	warned against.

    o	Autoflushing of stdout is turned on when Rd processing, so
	warnings/error are likely to appear in the right place in
	redirected output (such as that from R CMD check).


UTILITIES

    o	R_PDFLATEXCMD is added to the environment variables set by
	'R CMD' and is used by R CMD Rd2dvi.

	R_LATEXCMD, R_PDFLATEXCMD, R_MAKEINDEXCMD and R_DVIPSCMD
	default to 'latex', 'pdflatex', 'makeindex' and 'dvips'
	respectively if no suitable executable was found at configure
	time (since they might well be available at run time,
	particularly for binary installations of R).  This affects
	R CMD Rd2dvi and help(offline=TRUE).

	R CMD Rd2dvi now gives an explicit error message if latex (or
	pdflatex) fails.

	R CMD Rd2dvi gains a --no-index argument: processing some
	special characters on PDF indices gave errors which used to be
	ignored.


DEPRECATED & DEFUNCT

    o	R CMD INSTALL --with-package-versions is deprecated (and
	support has always been incomplete on Windows).

	So is install.packages(installWithVers = TRUE).

    o	Rd conversion to Sd and Ssgm is now deprecated as we no longer
	have any means to check the results (and Sd is long obsolete).


BUG FIXES

    o	add1.glm() no longer warns if applied to a binomial glm with a
	factor response.

    o	aggregate.data.frame() now does something sensible with a
	zero-column 'x' rather than failing with an obscure error
	message.  It gives an explicit error message if called with a
	zero-row 'x'.

    o	integrate() now accepts integer results from f(): as documented,
	but only double was accepted.

    o	contrib.url() produced an incorrect URL for the type
	"mac.binary".

    o	pairwise.wilcox.test() did not pass on the 'paired' argument
	(caught by Matthias Kohl)

    o	bmp(), jpeg(), and png() on unix with type="cairo" would segfault
	on closure if the output file could not be opened.

    o	tiff() on unix would not write the output file for the first page
	when multiple pages were plotted.

    o	str(1 + structure(1, class = "test")) no longer recurses indefinitely.

    o	pf(x, .., ncp, lower.tail=FALSE, log=TRUE) is much more accurate
	for large x now.

    o	dev2bitmap() failed in 2.8.0 if 'taa' and 'gaa' were both NA.

    o	Under rare circumstances equality tests for character strings
	could fail to report equality in 2.8.0 in the same way as
	2.7.2.	(This needed a current encoding of Latin-1 or UTF-8,
	one string whose encoding was marked as that encoding and one
	that was marked as "unknown".  In that circumstance the two
	strings are not actually known to be equal, but earlier
	versions of R assumed that "unknown" meant the current
	encoding, and this is done once again.)

    o	R CMD config could echo messages from GNU make if called from
	within a Makefile (as e.g. package Rcpp did), especially from
	within a parallel make run.

    o	Rounding error could affect window(extend=TRUE) when applied
	to monthly series.  (PR#13272)

    o	Offline help on a Unix-alike now works even if options
	"latexcmd" and "dvipscmd" contain spaces
	(e.g. "dvips -Pmy_printer").

	Informative error messages are given if running latex or dvips
	fail.

    o	Using plot.lm() on a "glm" object since 2.7.1 with which=5
	caused the Pearson rather than deviance residuals to be used
	in which=2 or 3 (including in the default case).  (Thanks to
	Effie Greathouse and Greg Snow.)

	plot.lm() did not report on omitting observations with
	leverage one if they also had residual exactly zero.  This was
	seen in example(occupationalStatus).

    o	deparse(nlines=) no longer pads short results with blank
	lines. (PR#13299)

    o	legend(xpd=) now restores 'xpd' correctly.  (PR#12756)

    o	The "formula" method for lines() now works if 'subset' is
	supplied and no 'data' argument (as that for points() did).

    o	Sweave() now takes the defaults for the options 'pdf.version'
	and 'pdf.encoding' of its RweaveLatex driver from pdf.options().

    o	prettyNum(x, drop0trailing=TRUE) treated "1.1e20" as "1.1e2"
	and hence str() did as well, in 2.8.0 only.

    o	dchisq(x, df, ncp) no longer hangs for large x and ncp > 0,
	and is more accurate in some cases (PR#13309).

    o	installed.packages(lib.loc = D, priority="NA") now also works when
	D contains a single package.  (PR#13332)

    o	legend(...., merge=TRUE) now warns and has no effect in the
	case where no line segments are drawn.	(PR#13340)

    o	transform.data.frame() works better when two or more columns are
	added.

    o	Deparsing argument lists with non-syntactic names (e.g. that for
	transform()) now uses backticks rather than double quotes to
	produce syntactically valid output.

    o	matrix() failed to check for 0-length 'dimnames': it now
	treats them as NULL (as array did).  (PR#13361)

    o	0^NA is now NA, not Inf, consistent with x^NA, x != 1.

    o	anova.mlm() did not work if T had only one row (including
	e.g. the case M = ~1).

    o	axis.POSIXct() mislabelled for some time ranges of a few hours
	(reported by Martin Becker).

    o	mantelhaen.test() with 'exact=FALSE' was not respecting
	'alternative'. It now does one-sided tests similarly to
	prop.test().

    o	anova.mlm() had trouble with some designs where near-zero rows of
	the tranformation matrix were not removed (caught by Nils Skutara).

    o	Rd conversion was handling expressions like
	'\item{foo}{see \eqn{x}}' (with one argument to \eqn
	immediately followed by a right brace) incorrectly, sometimes
	giving a spurious warning about 'missing text'.

    o	R CMD INSTALL used the C locale to install the DESCRIPTION
	file, and so escaped non-ASCII characters in packages with a
	declared encoding of "latin1" or "UTF-8".  (However, the
	installed DESCRIPTION file was rarely used since the dumped
	metadata are available.)

    o	xspline() now respects inline par settings.

	It and grid.xspline() now handle the special case of only two
	control points, and splines with control points that are
	located well outside the device (e.g., a zoomed view of a
	larger curve).	(Both cases were giving the error "reached
	MAXNUMPTS").

    o	In setClass("C", contains="list"); x <- new("C", 1:3), x[2:3] now
	remains of class "C".  So does rep(x, 2) or rep.int(x, 3).
	[NOTE: This "feature" has been reverted for R 2.9.0, see above]

    o	median.default() now also works for "numeric"-like vectors.

    o	The pdf() device can now handle the case where an image uses a
	very large number of colours with different levels of
	semi-transparency (alpha-values).  It used to segfault.
	(Also PR#13264.)

    o	window() failed to apply a fuzz to 'start' or 'end' and so
	sometimes warned incorrectly for time series with 'freq' not a
	power of two (e.g. 12 or 24).

    o	unique.default() now preserves the "tzone" attribute on
	"POSIXct" objects.

    o	If all the packages had dependency lists of equal lengths,
	occasionally install.packages() would compute an incorrect
	sort order.

    o	col(x, as.factor=TRUE) and row(x, as.factor=TRUE) would fail
	if x had no column (row) names.	 It was documented
	incorrectly, and now returns a matrix factor.

    o	setRepositories() failed if "pkgType" was set to
	"mac.binary.leopard".

    o	formals<-() changed the body of the function if this was a
	length-one list.

    o	body<-() failed if the function had no arguments.  It now
	warns if discarding elements from a 'value' of type "expression".

    o	qr.coef() failed in the complex case for non-square systems.
	(PR#13305)

    o	plot.dendrogram(horizontal=TRUE) did not not plot 'edgetext'
	at the correct locations.  (PR#13313)

    o	The starting point for plot.acf(ci.type="ma") was lag 0 when it
	should have been lag 1.	 (PR#13071)

    o	There was an obscure bug with srcrefs, which could put the
	parser into a condition giving "Error: bad value" on any input



		CHANGES IN R VERSION 2.8.0


SIGNIFICANT USER-VISIBLE CHANGES

    o	var(), cov(), cor(), sd() etc now by default (when 'use' is not
	specified) return NA in many cases where they signalled an
	error before.


NEW FEATURES

    o	abbreviate() gains an optional argument 'strict' allowing cheap
	and fast strict abbrevation.

    o	The "lm" methods of add1(), anova() and drop1() warn if they are
	mis-used on an essentially exact fit.

    o	as.array() is now generic, gains a '...' argument.

    o	New function as.hexmode() for converting integers in hex format.
	format.hexmode() and as.character.hexmode() gain an 'upper.case'
	argument.

    o	bitmap() and dev2bitmap() gain support for anti-aliasing.
	The default type has been changed to 'png16m', which supports
	anti-aliasing.

    o	Box.test() gains a 'fitdf' argument to adjust the degrees of
	freedom if applied to residuals.

    o	browseURL() has a new argument 'encodeIfNeeded' to use
	URLencode() in cases where it seems likely that would be
	helpful.  (Unfortunately, those are hard to guess.)

    o	by() gains a 'simplify' argument, passed to tapply().

    o	capabilities() gains a new argument "tiff" to report if tiff()
	is operational.

    o	chol2inv() now treats <numeric(1)> as a [1 x 1]-matrix.

    o	cov() and cor() have the option 'use = "everything"' as default,
	and so does var() with its default 'na.rm = FALSE'.  This
	returns NA instead of signalling an error for NA observations.
	Another new option is 'use = "na.or.complete"' which is the default
	for var(*, na.rm=FALSE).
	var(double(0), na.rm= L) now returns NA instead of signalling an error,
	for both L = TRUE or FALSE, as one consequence of these changes.

    o	data.matrix() now tries harder to convert non-numeric columns,
	via as.numeric() or as(, "numeric").

    o	dev.interactive() is able to recognize the standard screen
	devices if getOption("device") is a function (as well as by name).

    o	dev.new() gains a '...' argument which can be used to pass
	named arguments which will be used if appropriate to the
	device selected.

    o	dimnames(x) <- value extends 'value' if it a list and too
	short, and 'x' is an array.  This allows constructions such as
	dimnames(x)[[1]] <- 1:3 to work whether or not 'x' already has
	dimnames.

    o	format(), formatC() and prettyNum() gain a new argument
	'drop0trailing' which can be used to suppress trailing "0"s.

    o	format() now works for environments; also print(env) and str(env)
	share the same code for environments.

    o	It is now possible to create and open a text-mode gzfile()
	connection by explicitly using e.g. open="rt".

    o	New help.request() function for compiling an e-mail to R-help
	according to "the rules". It is built on the new utility,
	create.post() on which also bug.report() is based now; both
	thanks to a contribution by Heather Turner.

    o	help.search() now assumes that non-ASCII items are in latin1
	if that makes sense (all known examples on CRAN are).

    o	HoltWinters() and decompose() use a (statistically) more
	efficient computation for seasonal fits (they used to waste
	one period).

    o	intToUtf8() and intToBits() now accept numeric vectors,
	truncating them to integers.

    o	is.unsorted() gains an argument 'strictly'.  It now works for
	classed objects with a >= or > method (as incorrectly
	documented earlier).

    o	library() no longer warns about the masking objects that are
	identical(.,.) to those they mask.

    o	lockBinding(), unlockBinding(), lockEnvironment() and
	makeActiveBinding() now all return invisibly (they always
	return NULL).

    o	mood.test() now behaves better in the presence of ties.

    o	na.action() now works on fits of classes "lm", "glm", ....

    o	optim(.., method="SANN", .., trace=TRUE) is now customizable via
	the 'REPORT' control argument, thanks to code proposals by
	Thomas Petzoldt.

    o	The 'factory-fresh' defaults for options("device") have been
	changed to refer to the devices as functions in the grDevices
	namespace and not as names.  This makes it more likely that
	the incorrect (since R 2.5.0) assumption in packages that
	get(getOption("device"))() will work will catch users of those
	packages.

    o	pch=16 now has no border (for consistency with 15, 17, 18) and
	hence is now different from pch=19.

    o	pdf() has new arguments 'useDingbats' (set this to FALSE for use
	with broken viewers) and 'colormodel'.	It now only references
	the ZapfDingbats font if it is used (for small opaque circles).

	The default PDF version is now 1.4, since viewers that do not
	accept that are now rare.

	Different viewers were rendering consecutive text() calls on a
	pdf() device in different ways where translucency was
	involved.  The PDF generated has been changed to force each
	call to be rendered separately (which is the way xpdf or
	ghostscript was rendering, but Acrobat was forming a
	transparency group), which is consistent with other graphics
	devices supporting semi-transparency.

    o	plot.dendrogram() has new arguments (xlim, ylim) which allows
	zooming into a hiearchical clustering dendrogram.

    o	plot.ecdf() now defaults to pch=19 so as to better convey the
	left-closed line segments.

    o	plot.histogram() gains an 'ann' argument. (Wish from Ben Bolker.)

    o	plot(<lm_obj>) now warns when it omits points with leverage one
	from a plot.

    o	Plotmath now recognizes 'aleph' and 'nabla' (the Adobe Symbol
	'gradient' glyph) as symbol names.

    o	polyroot() no longer has a maximum degree.

    o	The alpha/alphamax argument of the 'nls' and 'mle' profile()
	methods is used to compute confidence limits for univariate
	t-statistics rather than a confidence region for all the
	parameters (and not just those being profiled).

    o	quantile.default() allows 'probs' to stray just beyond [0, 1],
	to allow for computed values.

    o	New functions rawConnection() and rawConnectionValue() allow
	raw vectors to be treated as connections.

    o	read.dcf() now consistently gives an error for malformed DCF.

    o	read.fwf() no longer passes its default for 'as.is' to
	read.table(): this allows the latter's default to be used.

    o	readBin(), writeBin(), readChar() and writeChar() now open a
	connection which was not already open in an appropriate binary
	mode rather than the default mode.

	readLines(), cat() and sink() now open a connection which was
	not already open in an appropriate text mode rather than the
	default mode.

    o	readCitationFile() (and hence citation) now reads a package's
	CITATION file in the package's declared encoding (if there is one).

    o	The behaviour of readLines() for incomplete final lines on
	binary-mode connections has been changed to be like blocking
	rather than non-blocking text-mode connections.

    o	A new reorder.character() method has been added.  This allows
	use of 'reorder(x, ...)' as a shorthand for
	'reorder(factor(x), ...)' when 'x' is a character vector.

    o	round() now computes in long doubles where possible so the
	results are more likely to be correct to representation error.

    o	rug() now uses axis()'s new arguments from 2.7.2, hence no
	longer draws an axis line.

    o	save() (optionally, but by default) checks for the existence
	of objects before opening the file/connection (wish of
	PR#12543).

    o	segments(), arrows() and rect() allow zero-length
	coordinates.  (Wish of PR#11192)

    o	set.seed(kind=NULL) now takes 'kind' from a saved seed if the
	workspace has been restored or .Random.seed has been set in
	some other way.	 Previously it took the 'currently used' value,
	which was "default" unless random numbers had been used in
	the current session.  Similarly for the values reported by
	RNGkind().  (Related to PR#12567.)

	set.seed() gains a 'normal.kind' argument.

    o	setEPS() and setPS() gain '...' to allow other arguments to be
	passed to ps.options(), including overriding 'width' and 'height'.

    o	setTimeLimit() function to set limits on the CPU
	and/or elapsed time for each top-level computation, and
	setSessionTimeLimit() to set limits for the rest of the session.

    o	splinefun() has a new method = "monoH.FC" for monotone Hermite
	spline interpolation.

    o	sprintf() optionally supports the %a/%A notation of C99 (if the
	platform does, including under Windows).

    o	str()'s default method gains a 'formatNum' function argument which
	is used for formatting numeric vectors.	 Note that this is very
	slightly not backward compatible.

    o	The summary() method for class "ecdf" now uses a print()
	method rather than printing directly.

    o	summary.manova() uses a stabler computation of the test
	statistics, and gains a 'tol' argument to allow highly
	correlated responses to be explored (with probable loss of
	accuracy).  Similar changes have been made to anova.mlm() and
	anova.mlmlist().

    o	Sweave() now writes concordance information inside a
	\Sconcordance LaTeX macro, which allows it to be inserted into
	PDF output.

    o	system.time() now uses lazy evaluation rather than
	eval/substitute, which results in more natural scoping. (PR#11169)

    o	In table(), 'exclude=NULL' now does something also for factor
	arguments. A new 'useNA' argument allows you to control
	whether to add NA levels unconditionally or only when present
	in data. A new convenience function addNA() gives similar
	functionality by adding NA levels to individual factors.

    o	unlink() tries the literal pattern if it does not match with
	wildcards interpreted -- this helps with e.g. unlink("a[b")
	which previously needed to be unlink("a\\[b").

    o	update.packages() gains an argument 'oldPkgs', where
	new.packages() and old.packages() get 'instPkgs'.  These allow
	consideration of only subsets of packages instead of all
	installed ones.

    o	which(b) is somewhat faster now, notably for named vectors, thanks
	to a suggestion by Henrik Bengtsson.

    o	New generic function xtfrm() as an auxiliary helper for
	sort(), order() and rank().  This should return a numeric
	vector that sorts in the same way as its input.	 The default
	method supports any class with ==, > and is.na() methods but
	specific methods can be much faster.

	As a side-effect, rank() will now work better on classed
	objects, although possibly rather slowly.

    o	X11() and capabilities("X11") now catch some X11 I/O errors that
	previously terminated R.  These were rare and have only be
	seen with a misconfigured X11 setup on some versions of X11.


    o	The handling of nuls in character strings has been changed --
	they are no longer allowed, and attempting to create such a
	string now gives a truncation warning (unless
	options("warnEscapes") is false).

    o	The user environment and profile files can now be specified via
	environment variables 'R_ENVIRON_USER' and 'R_PROFILE_USER',
	respectively.

    o	?pkg::topic and ?pkg:::topic now find help on 'topic' from
	package 'pkg' (and not help on :: or :::).

    o	??topic now does help.search("topic"); variations such as
	??pkg::topic or field??topic are also supported.

    o	There is support for using ICU (International Components for
	Unicode) for collation, enabled by configure option --with-ICU
	on a Unix-alike and by a setting in MkRules on Windows.
	Function icuSetCollate() allows the collation rules (including
	the locale) to be tuned.

    o	If S4 method dispatch is on and S4 objects are found as
	attributes, show() rather than print() is used to print the
	S4 attributes.

    o	Starting package tcltk without access to Tk (e.g. no available
	display) is now a warning rather than an error, as Tcl
	will still be usable.  (On most platforms it was possible to
	inhibit Tk by not having DISPLAY set, but not on Windows nor
	Mac OS X builds with --with-aqua.)

    o	Using $ on a non-subsettable object (such as a function) is
	now an error (rather than returning NULL).

    o	Hexadecimal numerical constants (such as 0xab.cdp+12) may now
	contain a decimal point.

    o	PCRE has been updated to version 7.8 (mainly bug fixes).


NEW FEATURES IN PACKAGE 'methods'

    o	S3 classes that are registered by a call to setOldClass() now
	have the S3 class as a special slot, and therefore so do
	any S4 classes that contain them.  This mechanism is used to
	support S4 classes that extend S3 classes, to the extent
	possible.  See ?Classes, ?setOldClass, and ?S3Class.

	The treatment of special pseudo-classes "matrix", "array", and
	"ts" as S4 classes has also been modified to be more
	consistent and, within limitations imposed by special
	treatment of these objects in the base code, to allow other
	classes to contain them.  See class?ts.

	A general feature added to implement "ts" and also
	"data.frame" as S4 classes is that an S4 class definition can
	be supplied to setOldClass() when the S3 class has known
	attributes of known class.

	setOldClass() now saves all the S3 inheritance, allowing the
	calls to be built up in stages, rather than including all the
	S3 classes in each call.  Also allows as(x,"S3") to generate
	valid S3 inheritance from the stored definition.  See ?S3.

    o	S4 methods may now be defined corresponding to "...", by
	creating a generic function that has "..." as its signature.
	A method will be selected and called if all the arguments
	matching "..." are from this class or a subclass.  See ?dotsMethods.

    o	New functions S3Part() and S3Class() provide access to the
	corresponding S3 object and class for S4 classes that extend
	either an S3 class or a basic R object type.

    o	show(<class definition>) now also shows the class name.


INSTALLATION

    o	If sub-architectures are used, a copy of Rscript is installed
	in ${R_HOME}/bin/exec${R_ARCH} (since that in ${R_HOME}/bin
	and /usr/bin might be overwritten in a subsequent installation).


PACKAGE INSTALLATION

    o	LazyLoad: yes is now the default, so packages wanting to avoid
	lazy loading must set 'LazyLoad: no' (or an equivalent value) in
	the DESCRIPTION file.

    o	R CMD INSTALL will now fail if it finds a non-executable
	'configure' script in the package -- this usually indicates a
	file system with insufficient permissions.  If a
	non-executable 'cleanup' script is found and either
	--clean or --preclean is used, a warning is given.


DEPRECATED & DEFUNCT

    o	Use in packages of the graphics headers Rdevices.h and
	Rgraphics.h is defunct: they are no longer installed.

    o	options("par.ask.default") is defunct in favour of
	"device.ask.default".

    o	The 'device-independent' family "symbol" is defunct: use
	font=5 (base) or fontface=5 (grid) instead.

    o	gammaCody() is defunct.

    o	par("gamma") is defunct.

    o	'methods' package functions getAccess(), getAllMethods(),
	getClassName(), getClassPackage(), getExtends(),
	getProperties(), getPrototype(), getSubclasses, getVirtual(),
	mlistMetaName(), removeMethodsObject() and seemsS4Object() are
	defunct.

    o	Use of a non-integer .Random.seed is now an error.  (R itself
	has never generated such values, but user code has, and
	R >= 2.6.0 has given a warning.)

    o	methods::allGenerics() is deprecated.

    o	In package installation, SaveImage: yes is now ignored, and
	any use of the field will give a warning.

    o	unserialize() no longer accepts character strings as input.

    o	The C macro 'allocString' has been removed -- use 'mkChar' and
	variants.

    o	Use of allocVector(CHARSXP ...) is deprecated and gives a warning.


UTILITIES

    o	The default for 'stylepath' in Sweave's (default) RweaveLatex
	driver is now FALSE rather than TRUE if
	SWEAVE_STYLEPATH_DEFAULT is unset : see ?RweaveLatex.
	To support this, tools::texi2dvi adds the R 'texmf' directory
	to the input search path.

    o	R CMD Rd2dvi now previews PDF output (as was documented) if
	R_PDFVIEWER is set (as it will normally be on a Unix-alike but
	not on Windows, where the file association is used by default).

    o	R CMD check checks for binary executable files (which should not
	appear in a source package), using a suitable 'file' if
	available, else by name.

    o	R CMD check now also uses codetools' checks on the body of S4
	methods.


C-LEVEL FACILITIES

    o	R_ReadConsole will now be called with a buffer size of 4096
	bytes (rather than 1024): maintainers of alternative
	front-ends should check that they do not have a smaller limit.

    o	Graphics structure NewDevDesc has been renamed to DevDesc.
	For now there is a compatibility define in GraphicsDevice.h,
	but it will be removed in R 2.9.0.

    o	PROTECT and UNPROTECT macros now work even with R_NO_REMAP.


BUG FIXES

    o	@ now gives an error (and not just a warning) if it is being
	applied to a non-S4 object.

    o	R CMD appends (not prepends) R's texmf path to TEXINPUTS.

    o	Objects generated by new() from S4 classes should now all
	satisfy isS4(object).  Previously, prototypes not of object
	type S4 would not be S4 objects.  new() applied to basic,
	non-S4 classes still will (and should) return non-S4 objects.

    o	Functions writing to connections such as writeLines(),
	writeBin(), writeChar(), save(), dput() and dump() now check
	more carefully that the connections are opened for writing,
	including connections that they open themselves.

	Similarly functions which read such as readLines(), scan(),
	dcf() and parse() check connections for being open for reading.

    o	Equality comparison of factors with <NA> levels now works
	correctly again.

    o	Repainting of open X11 View() windows is now done whilst an
	X11 dataentry window is in use.

    o	Indexing of data frames with NA column names and a numeric or
	logical column index works again even if columns with NA names
	are selected.

    o	on.exit() has been fixed to use lexical scope in determining
	where to evaluate the exit action when the on.exit expression
	appears in a function argument.

    o	rank() now consistently returns a double result for
	ties.method = "average" and an integer result otherwise.
	Previously the storage mode depended on 'na.last' and if any
	NAs were present.

    o	The "lm" methods of add1(), and drop1() now also work on a model
	fit with  na.action = na.exclude.

    o	median(c(x = NA_real_)) no longer has spurious names().

    o	isoreg(x, y) now returns the correct result also when x has ties,
	in all cases.

    o	What na.action() does is now correctly documented.

    o	source() with echo=TRUE now behaves like ordinary automatic
	printing, by using methods::show() for S4 objects.

    o	Several bugs fixed in `?` with topics: it previously died trying
	to construct some error messages; for S4 methods, class "ANY"
	should be used for omitted arguments and default methods.

    o	trace() should create missing traceable classes in the global
	environment, not in baseenv() where other classes will not be
	found.

    o	Class inheritance using explicit coerce= methods via setIs()
	failed	to coerce the argument in method dispatch.  With this
	fixed, a mechanism was needed to prohibit such inheritance
	when it would break the generic function (e.g.,
	initialize). See ?setIs and ?setGeneric.

    o	RSiteSearch() encodes its query (it seems this is occasionally
	needed on some platforms, but encoding other fields is harmful).

    o	'incomparables' in match() was looking up indices in the wrong
	table.

    o	write.dcf() did not escape "." according to Debian policy
	(PR#12816).

    o	col2rgb() sometimes opened a graphics device unnecessarily, and
	col2rgb(NA) did not return a transparent color, as documented.

    o	pdf(family="Japan") [and other CIDfonts] no longer seg.faults
	when writing "western" text strings.

    o	as.list() applied to an environment now forces promises and
	returns values.

    o	Promises capturing calls to sys.parent() and friends did not
	work properly when evaluated via method dispatch for internal
	S3 generics.

    o	The default "pkgType" option for non-CRAN builds of R on Mac OS X
	is now correctly "source" as documented.

    o	The default R_LIBS_USER path in AQUA builds now matches the
	Mac-specifc path used by the Mac GUI: ~/Library/R/x.y/library

    o	splinefun() with natural splines incorrectly evaluated derivatives
	to the left of the first knot. (PR#13132, fix thanks to
	Berwin Turlach)

    o	anova(glm(..., y=FALSE)) now works.  (PR#13098)

    o	cut.Date(x, "weeks") could fail if x has only one unique value
	which fell on a week boundary.	(PR#13159)




	**************************************************
	*						 *
	*	       2.7 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.7.2 patched


BUG FIXES

    o	within(<dataframe>, { ... }) now also works when '...' removes
	more than one column.

    o	Attempting to open an X11() device on a non-existent display
	when one is already open on another display now gives a
	warning rather than terminating R via a fatal X11 error.
	(PR#12628)

    o	source() did not respect the setting of options("keep.source")
	when setting source references.

    o	seek() now clears the pushback on a text-mode connection if
	used to set a new position.  (PR#12640)

    o	quartz() would segfault if asked to create a file for bitmap
	output which could not be created.  This applied also to the
	type="quartz" versions of bmp(), jpeg(), png() and tiff().

    o	dnbinom(0, size, mu = <large>) suffered from cancellation in 2.7.2
	only.



		CHANGES IN R VERSION 2.7.2


NEW FEATURES

    o	sprintf() returns elements of the result in UTF-8 when the
	format or any character input has a corresponding element
	declared as UTF-8.  Similarly for paste(), elements of the
	result are in UTF-8 when any input to that element is declared
	as UTF-8.

    o	axis() has new arguments 'col.ticks' and 'lwd.ticks' to allow
	the colour and line width of ticks to be set separately from
	that of the line (e.g. to set one or the other to transparent
	or zero width).

    o	legend() has a new argument 'box.col' to set the colour of the
	enclosing box.

    o	legend() gains a 'xpd' argument to make it easier to place a
	legend in the margins or outer margins.

    o	stripchart() now passes '...' to title() (as well as to
	plot.default() and axis()). (Wish of PR#12202)

    o	help.search() has new argument 'searchEngine' to go directly
	to the search form: this is needed by users of Firefox 3.0.x,
	for x <= 6, to workaround a bug in interpreting the search
	results pages.


BUG FIXES

    o	Plotmath computed the glyph metrics for the wrong character (and
	perhaps for a non-existent one) if this was a single-byte
	character with the top bit set.	 An example was	symbol("\300").

    o	sink() and cat() could divert output to a non-writable connection.

    o	phyper(x, 0,0,0) no longer hangs for huge x and gives 1 for x >= 0.
	(PR#11813)

    o	plnorm(x, ..., log.p=TRUE) is now correct for x <= 0. (PR#11867)

    o	<data.frame>[, ch] gives an error (again!) when ch is a string not
	exactly matching the column names, thanks to an oral bug report by
	Matthew Dowle.

    o	data.frame(x=1:2, y=3:4, row.names=c("a","NA"))[c(2,NA),] has
	correct row names c("NA","NA.1") again.

    o	The GUI data editor for dataframes did not handle escape
	characters in entries properly. (PR#11897)

    o	PCRE has been updated to 7.7 (bugfix release).

    o	package.skeleton() wrongly warned about invalid code_files names
	when these were not in the current directory.

    o	shapiro.test(c(0,0,1)) now has P value >= 0 (instead of barely
	negative).

    o	assign() now warns if given a character vector of length > 1,
	rather than silently taking the first element.

    o	rcond(<exactly singular matrix>) now gives 0 instead of an error.

    o	There was a memory leak in C function ucstoutf8 used by some
	graphics devices.

    o	Plots of profile.mle() objects (package 'stats4') were
	misbehaving when the 'which' argument had been used in their
	calculation.

    o	dnbinom(x, size, mu=*, ..) is now more accurate for very large
	'size'.	 The same applies to pnbinom() and rnbinom().

    o	axis() was ignoring par() mgp[3] if mgp was set in-line.

    o	Closing an X11 View() or dataentry window via its frame's
	close control now works better on some window managers.

    o	Calling lapply() was not handling method dispatch correctly for
	is.numeric(), is.matrix(), is.array(), log() and the Math2
	group.	This affected data.matrix() which incorrectly regarded
	"Date" and "POSIXct" objects as numeric, and has been adjusted
	to do so as exceptions.

    o	package.skeleton() was not looking for non-function objects in
	its 'environment' argument.

    o	nls() was only finding its 'weights' argument in the case when
	all the variables in the formula were of the same length and
	hence that model.frame() could be used.

	It was silently ignoring 'subset' and 'na.action' except in
	that case.  Now they are ignored only if 'data' is a list and
	variables taken from 'data' are not all of the same length,
	in which case a warning is given.

    o	The 'mle' confint() method now takes 'level' into account when
	setting 'alpha' for the profile.

    o	within() was not handling correctly expressions that produced
	NULL columns.  (PR#11131)

    o	dev.print() and dev.copy2{eps,pdf}() now ensure that the current
	device is restored as the active device even if an error
	occurs. (PR#9801)

    o	as.Date() could fail to convert character strings representing
	days on which midnight did not exist in the current timezone
	(as happened in parts of Africa on 1960-01-01).

    o	The automatic placement of legend() with 'title' and a
	reversed 'x' axis was incorrect. (PR#12019)

    o	The use of multiple packages in 'LinkingTo' works again, and
	now works when the dependent packages are in the library to be
	installed to (but not in the library path seen by R --vanilla).

    o	bxp() (and hence boxplot) now respects in-line graphical
	parameters 'xaxp'/'yaxp' as appropriate.  (PR#11463)

    o	barplot(log = "y") failed if there were NAs in the 'height'
	argument.  (PR#11585)

    o	pbeta() is more accurate in some cases with extreme values of
	'ncp'.	(PR#11277).

    o	edit.data.frame() no longer fails if called on a 0-column
	data frame and no column is created.

    o	pchisq(x, df=0) was always one even for x < 0; similarly for
	pgamma(x, alpha=0).

    o	add1() and drop1() now return a P-value of NaN in cases with
	df=0 for test="Chisq" (they gave NaN until pchisq was altered
	in R 2.6.2).

    o	The default methods of drop1() and add1() now re-evaluate in the
	object's formula environment, rather than simply in the parent
	(informal bug report by Werner Stahel).

    o	The undocumented limit of 8191 bytes on comments (from # to
	the end of the line) in R code has been removed.

    o	qgamma() warns if used with shape < 1e-10, when it may be
	unreliable.  (PR#12324)

    o	Installing a source package was not using the package's declared
	encoding (if any) as a default encoding for the help.search()
	database in Meta/hsearch.rds.  This could cause packages with
	a default encoding to have some of their entries rejected by
	help.search() in a multi-byte locale (such as a UTF-8 locale).

    o	duplicated() and unique() now handle 'incomparables' better,
	and avoid occasional segfaults (PR#12551).

    o	plot(isoreg(x, y)) now plots the points correctly when 'x'
	is unssorted.

    o	data.frame(row.names=NULL) once again behaves differently from
	the default (as documented).



		CHANGES IN R VERSION 2.7.1


NEW FEATURES

    o	tools::texi2dvi() has a new argument 'texinputs' to allow the
	TeX and bibtex input paths to be specified (even on MiKTeX).

    o	dev.copy2pdf() gains an 'out.type' argument to allow it to be
	used with cairo_pdf() or quartz(type = "pdf").

    o	poly() has additional checks against user error (as in PR#11243).

    o	The Mac OS quartz() device draws contiguous lines much faster.

    o	A field containing just a sign is no longer regarded as numeric
	(it was on all platforms in 2.7.0, but not on most in earlier
	versions of R).	 Similarly, '.' is now always non-numeric.

    o	CITATION files are now read in Latin-1: quite a few were
	failing if used in a multibyte locale such as UTF-8.

    o	The DESCRIPTION file of a package can specify an 'OS_type' field
	as either 'unix' or 'windows' to confine installation to that
	OS type.

    o	HoltWinters() now uses optimize() rather than optim for
	one-parameter problems which should be more reliable (PR#11469).

    o	axis() now respects the setting of par("xpd") when clipping.

    o	The 'factor' method of format() now preserves names, dims and
	dimnames in the same way as for character and numeric inputs.
	(PR#11512)

    o	read.DIF(*, transpose=TRUE) now allows to correctly read DIF files
	produced by some versions of Excel.


DEPRECATED & DEFUNCT

    o	The use of unserialize() on character strings is deprecated:
	that was a format used in R < 2.4.0.

    o	The use of embedded nuls in character strings is deprecated:
	They will no longer be allowed in R 2.8.0.


UTILITIES

    o	R CMD check checks for possible check directories in the
	sources -- in mid-2008 there were about 20 examples on CRAN.

    o	R CMD build tries harder to clean up the inst/doc directory
	from the remnants of earlier builds.

	It also removes any directories with extension .Rcheck, and
	files .DS_Store and ._* (created by tar on Mac OS X under some
	circumstances: it now sets environment variables to ask for
	such files not to be created by that tar.)


BUG FIXES

    o	Encoding<- on NA_character_ converted it to "NA".

    o	Adobe Symbol was missing from the encodings in
	tools::charset_to_Unicode.

    o	diag(matrix(x, 0, 0)) now returns a 0-length vector of the
	correct mode, instead of always numeric.

    o	The parser sometimes accepted invalid quoted strings in a UTF-8
	locale.

    o	plot.default(x, y) now dispatches to Axis() methods whether
	y is NULL or not.

    o	On Mac OS X, the Cocoa Quartz window could close without warning
	under certain circumstances (specific autorelease pool flush).

    o	Plotting symbols with separate border and fill colours (e.g.,
	plot(pch = 21)) now works with transparent 'col', but opaque
	or semi-transparent 'bg'.  Previously, if 'col' was
	transparent then 'bg' was ignored and nothing was drawn.

    o	file.path() did not work correctly in 2.7.0 if the components
	had different encodings.

    o	merge() failed if there were no common columns and one of the
	inputs had zero rows.

    o	expand.grid() failed if an input had length 0.

    o	match() does again truncate strings at embedded nuls (as newly
	documented in 2.7.0).

    o	Because of a typo, 'pointsize' in png(type="cairo") (and jpeg,
	bmp, tiff) devices was being interpreted in pixels not bigpoints.

    o	is() was wrong for some S3 class objects with class of length
	greater than one.

    o	undoc() / codoc() were not checking all S4 methods in some cases.

    o	Use of textConnection(NULL, mode="w") could segfault.

    o	Use of strwidth/height(units="user") (the default) is again an
	error before a user coordinate system has been set on the
	device, rather than giving nonsensical values (the effect of
	r31367).

    o	Rare string width calculations in package grid were not
	interpreting the string encoding correctly.

    o	hasMethods(f, env) {without specified 'package'} now works better.

    o	A missing PROTECT could cause segfaults on string
	comparisons.  (PR#11421)

    o	str(structure(1, classID = "Pooh")) now works fine.

    o	A missing PROTECT could cause segfaults in if() if coercion of
	the condition was required or a warning was to be given.

    o	plot(<table>) now uses a sensible default main title.

    o	validObject() called with complete=TRUE did not use inherited
	validity methods for slot classes.

    o	Several bugs fixed in as(): the initial method lookup was not
	using the table with inherited methods (so inheritance had to
	be recomputed each time); coerce() should not be called
	directly--it can insert invalid inherited methods; the
	constructed as() methods were not retaining the function's
	environment.

    o	influence.measures(<glm-object>) now computes the same
	Cook's distance approximations as cooks.distance().

    o	plot(<glm>, which=5) uses more correct Cook's distance contours;
	(fix to fix to PR#9316).

    o	pdf() and postscript() were not working correctly in 2.7.0 with
	UTF-8 encoded data in a non-UTF-8 MBCS (e.g. EUC-JP on Unix,
	CJK locales on Windows).

    o	conformMethod(), called by setMethod(), now checks better about
	argument names in wrong order.	Whereas it only warns currently,
	it is planned to become an error in the future.

    o	The predict() method for prcomp() had an incorrect check for
	the number of columns of 'newdata' if the columns were not named.

    o	The axis() function now distinguishes between setting "at" to
	NULL or a zero-length vector, treating the latter as a request
	for no ticks.  This corrects the handling of the "x" parameter
	to rug().

    o	glob2rx("*[*") now produces a correct regular expression.

    o	The canvas is no longer painted on copy or save in Cocoa Quartz.

    o	identify() in Quartz can now be terminated by either using popup
	menu equivalent (Ctrl-click or second mouse button) or by pressing
	the <Esc> key. The latter was documented but did not work.

    o	tools:::.check_package_depends() {called from 'R CMD check'} now
	also works correctly when directory-name != package-name.

    o	Source references were sometimes off by a line.

    o	The quartz() parameter 'antialias' is no longer ignored.

    o	The Quartz device is now trying hard to remove anti-aliasing
	effects for rasterized backends in plots that use adjacent,
	borderless rectangles such as image().

    o	The srcfilecopy() function now adds a timestamp to the object it
	creates.

    o	parse() would lose a token when run on stdin().

    o	socketConnection() was using internally the class "socket"
	and not "sockconn", which caused a conflict with make.socket().
	(PR#11515)

    o	Quartz is now trying harder to find the proper font for a given
	family which resolves font issues on Mac OS X 10.4. Full font
	names and PostScript names can be used interchangeably. (Note,
	however that italic/oblique font faces of Helvetica are not
	included in the Mac OS X 10.4 system).

    o	qf() no longer gives NaN when one of df1 and df2 is large and
	the other is infinite (including if both are infinite); it is more
	accurate e.g. for qf(1e-18, 2,4).

    o	qbeta(-1e10, 50, 40, log.p=TRUE) no longer hangs.

    o	Cocoa Quartz backend autodetection of display DPI was not
	correct for screens rotated by 90 or 270 degrees.

    o	selectMethod("coerce", .) now uses a correct default for
	'useInherited', and hence no longer may mess up the method cache.

    o	show() now also works on "unregistered" S3 class objects.

    o	formatC(*, format="fg", flag="#") is no longer dropping trailing
	zeros.

    o	read.table(file = stdin()) with invalid input could leave the
	connection in an invalid state and hence cause a later
	segfault.  (PR#11627)

    o	read.DIF() did not obey the default 'stringsAsFactors = TRUE'.

    o	The 'noquote' method for c() now works correctly with three or
	more arguments.

    o	symbol() in plotmath expressions works again with non-ASCII
	input on devices that use UTF-8 for the symbol font.



		CHANGES IN R VERSION 2.7.0


SIGNIFICANT USER-VISIBLE CHANGES

    o	The default graphics device in non-interactive use is now
	pdf() rather than postscript().	 [PDF viewers are now
	more widely available than PostScript viewers.]

	The default width and height for pdf() and bitmap() have been
	changed to 7 (inches) to match the screen devices.

    o	Most users of the X11() device will see a new device that has
	different fonts, anti-aliasing of lines and fonts and
	supports semi-transparent colours.

    o	Considerable efforts have been made to make the default output
	from graphics devices as similar as possible (and in
	particular close to that from postscript/pdf).	Many devices
	were misinterpreting 'pointsize' in some way, for example as
	being in device units (pixels) rather than in points.

    o	Packages which include graphics devices need to be re-installed
	for this version of R, with recently updated versions.


NEW FEATURES

    o	The apse code used by agrep() has been updated to version
	0.16, with various bug fixes.

	agrep() now supports multibyte character sets.

    o	any() and all() avoid coercing zero-length arguments (which
	used a surprising amount of memory) since they cannot affect
	the answer.

	Coercion of other than integer arguments now gives a warning
	as this is often a mistake (e.g. writing all(pr) > 0 instead
	of all(pr > 0) ).

    o	as.Date(), as.POSIXct() and as.POSIXlt() now convert numeric
	arguments (days or seconds since some epoch) provided the
	'origin' argument is specified.

    o	New function as.octmode() to create objects such as file
	permissions.

    o	as.POSIXlt() is now generic, and it and as.POSIXct() gain a
	'...' argument.	 The character/factor methods now accept a
	'format' argument (analogous to that for as.Date).

    o	New function browseVignettes() lists available vignettes in an
	HTML browser with links to PDF, Rnw, and R files.

    o	There are new capabilities "aqua" (for the AQUA GUI and quartz()
	device on Mac OS X) and "cairo" (for cairo-based graphics
	devices).

    o	New function checkNEWS() in package 'tools' that detects common
	errors in NEWS file formatting.

    o	deparse() gains a new argument 'nlines' to limit the number of
	lines of output, and this is used internally to make several
	functions more efficient.

    o	deriv() now knows the derivatives of digamma(x), trigamma(x)
	and psigamma(x, deriv) (wrt to x).

    o	dir.create() has a new argument 'mode', used on Unix-alikes
	(only) to set the permissions on the created directory.

    o	Where an array is dropped to a length-one vector by drop() or
	[, drop = TRUE], the result now has names if exactly one of
	the dimensions was named.  (This is compatible with S.)
	Previously there were no names.

    o	The 'incomparables' argument to duplicated(), unique() and
	match() is now implemented, and passed to match() from merge().

    o	dyn.load() gains a 'DLLpath' argument to specify the path for
	dependent DLLs: currently only used on Windows.

    o	The spreadsheet edit() methods (and used by fix()) for data
	frames and matrices now warn when classes are discarded.

	When editing a data frame, columns of unknown type (that is
	not numeric, logical, character or factor) are now converted
	to character (instead of numeric).

    o	file.create() has a new argument 'showWarnings' (default TRUE)
	to show an informative warning when creation fails, and
	dir.create() warns under more error conditions.

    o	New higher-order functions Find(), Negate() and Position().

    o	[dpqr]gamma(*, shape = 0) now work as limits of 'shape -> 0',
	corresponding to the point distribution with all mass at 0.

    o	An informative warning (in addition to the error message) will
	be given when the basic, extended or perl mode of grep(),
	strsplit() and friends fails to compile the pattern.

    o	More study is done of perl=TRUE patterns in grep() and friends
	when length(x) > 10: this should improve performance on long
	vectors.

    o	grep(), strsplit() and friends with fixed=TRUE or perl=TRUE
	work in UTF-8 and preserve the UTF-8 encoding for UTF-8 inputs
	where supported.

    o	help.search() now builds the database about 3x times faster.

    o	iconv() now accepts "UTF8" on all platforms (many did, but not
	e.g. libiconv as used on Windows).

    o	identity() convenience function to be used for programming.

    o	In addition to warning when 'pkgs' is not found,
	install.packages() now reports if it finds a valid package
	with only a case mismatch in the name.

    o	intToUtf8() now marks the Encoding of its output.

    o	The function is() now works with S3 inheritance; that is, with
	objects having multiple strings in the class attribute.

    o	Extensions to condition number computation for matrices, notably
	complex ones are provided, both in kappa() and the new rcond().

    o	list.files() gains a 'ignore.case' argument, to allow
	case-insensitive matching on some Windows/MacOS file systems.

    o	ls.str() and lsf.str() have slightly changed arguments and
	defaults such that ls.str() {no arguments} works when debugging.

    o	Under Unix, utils::make.packages.html() can now be used directly
	to set up linked HTML help pages, optionally without creating
	the package listing and search database (which can be much
	faster).

    o	new.packages() now knows about the front-end package gnomeGUI
	(which does not install into a library).

    o	optim(*, control = list(...)) now warns when '...' contains
	unexpected names, instead of silently ignoring them.

    o	The options "browser" and "editor" may now be set to functions,
	just as "pager" already could.

    o	packageDescription() makes use of installed metadata where
	available (for speed, e.g. in make.packages.html()).

    o	pairwise.t.test() and pairwise.wilcox.test() now more explicitly
	allow paired tests. In the former case it is now flagged as an
	error if both 'paired' and 'pool.SD' are set TRUE (formerly,
	'paired' was silently ignored), and one-sided tests are generated
	according to 'alternative' also if 'pool.SD' is TRUE.

    o	paste() and file.path() are now completely internal, for speed.
	(This speeds up make.packages.html(packages=FALSE)
	severalfold, for example.)

    o	paste() now sets the encoding on the result under some
	circumstances (see ?paste).

    o	predict.loess() now works when loess() was fitted with
	transformed explanatory variables, e.g, loess(y ~ log(x) + log(z)).

    o	print(<data.frame>)'s new argument 'row.names' allows to suppress
	printing rownames.

    o	print() and str() now also "work" for 'logLik' vectors longer than
	one.

    o	Progress-bar functions txtProgressBar(), tkProgressBar() in
	package tcltk and winProgressBar() (Windows only).

    o	readChar() gains an argument 'useBytes' to allow it to read a
	fixed number of bytes in an MBCS locale.

    o	readNEWS() has been moved to the tools package.

    o	round() and signif() now do internal argument matching if
	supplied with two arguments and at least one is named.

    o	New function showNonASCII() in package tools to aid detection
	of non-ASCII characters in .R and .Rd files.

    o	The [dpq]signrank() functions now typically use considerably
	less memory than previously, thanks to a patch from Ivo
	Ugrina.

    o	spec.ar() now uses frequency(x) when calculating the
	frequencies of the estimated spectrum, so that for monthly
	series the frequencies are now per year (as for spec.pgram)
	rather than per month as before.

    o	spline() gets an 'xout' argument, analogously to approx().

    o	sprintf() now does all the conversions needed in a first pass if
	length(fmt) == 1, and so can be many times faster if called
	with long vector arguments.

    o	[g]sub(useBytes = FALSE) now sets the encoding on changed
	elements of the result when working on an element of known
	encoding.  (This was previously done only for perl = TRUE.)

    o	New function Sys.chmod(), a wrapper for 'chmod' on platforms
	which support it.  (On Windows it handles only the read-only
	bit.)

    o	New function Sys.umask(), a wrapper for 'umask' on platforms
	which support it.

    o	New bindings ttk*() in package tcltk for the 'themed widgets'
	of Tk 8.5.  The tcltk demos make use of these widgets where
	available.

    o	write.table(d, row.names=FALSE) is faster when 'd' has millions of
	rows; in particular for a data frame with automatic row names.
	(Suggestion from Martin Morgan.)


    o	The parser limit on string size has been removed.

    o	If a NEWS file is present in the root of a source package, it
	is installed (analogously to LICENSE, LICENCE and COPYING).

    o	Rd conversion to 'example' now quotes aliases which contain
	spaces.

    o	The handling of DST on dates outside the range 1902-2037 has
	been improved.	Dates after 2037 are assumed to have the same
	DST rules as currently predicted for the 2030's (rather than
	the 1970s), and dates prior to 1902 are assumed to have no DST
	and the same offset as in 1902 (if known, otherwise as in the
	1970s).

    o	On platforms where we can detect that mktime sets errno
	(e.g. Solaris and the code used on Windows but not Linux nor
	Mac OS X), 1969-12-31 23:59:59 GMT is converted from POSIXlt
	to POSIXct as -1 and not NA.

    o	The definition of 'whitespace' used by the parser is slightly
	wider: it includes Unicode space characters on Windows and in
	UTF-8 locales on machines which use Unicode wide characters.

    o	The src/extra/intl sources have been updated to those from
	gettext 0.17.

    o	New flag --interactive on Unix-alikes forces the session to be
	interactive (as --ess does on Windows).

    o	x[<zero-length>] <- NULL is always a no-op: previously
	type-checking was done on the replacement value and so this
	failed, whereas we now assume NULL can be promoted to any
	zero-length vector-like object.

	Other cases of a zero-length index are done more efficiently.

    o	There is a new option in Rd markup of \donttest{} to mark
	example code that should be run by example() but not tested
	(e.g. because it might fail in some locales).

    o	The error handler in the parser now reports line numbers for
	more syntax errors (MBCS and Unicode encoding errors, line
	length and context stack overflows, and mis-specified argument
	lists to functions).

    o	The "MethodsList" objects originally used for method selection
	are being phased out.  New utilities provide simpler
	alternatives (see ?findMethods), and direct use of the mangled
	names for the objects is now deprecated.

    o	Creating new S4 class and method definitions in an environment
	that could not be identified (as package, namespace or global)
	previously generated an error.	It now results in creating and
	using an artificial package name from the current date/time,
	with a warning.	 See ?getPackageName.

    o	Unix-alikes now give a warning on startup if locale settings
	fail.  (The Windows port has long done so.)

    o	Parsing and scanning of numerical constants is now done by R's
	own C code.  This ensures cross-platform consistency, and
	mitigates the effects of setting LC_NUMERIC (within base R it
	only applies to output -- packages may differ).

	The format accepted is more general than before and includes
	binary exponents in hexadecimal constants: see
	?NumericConstants for details.

    o	Dependence specifications for R or packages in the Depends
	field in a DESCRIPTION file can now make use of operators
	< > == and != (in addition to <= and >=): such packages will
	not be installable nor loadable in R < 2.7.0.

	There can be multiple mentions of R or a package in the Depends
	field in a DESCRIPTION file: only the first mention will be
	used in R < 2.7.0.


GRAPHICS CHANGES

    o	The default graphics devices in interactive and
	non-interactive sessions are now configurable via environment
	variables R_INTERACTIVE_DEVICE and R_DEFAULT_DEVICE
	respectively.

    o	New function dev.new() to launch a new copy of the default
	graphics device (and taking care if it is "pdf" or
	"postscript" not to trample on the file of an already running
	copy).

    o	dev.copy2eps() uses dev.displaylist() to detect screen
	devices, rather than list them in the function.

    o	New function dev.copy2pdf(), the analogue of dev.copy2eps().

    o	dev.interactive() no longer treats a graphics device as
	interactive if it has a display list (but devices can still
	register themselves on the list of interactive devices).

    o	The X11() and windows() graphics devices have a new argument
	'title' to set the window title.

    o	X11() now has the defaults for all of its arguments set by the
	new function X11.options(), inter alia replacing options
	"gamma", "colortype" and "X11fonts".

    o	ps.options() now warns on unused option 'append'.

	xfig() no longer takes default arguments from ps.options().
	(This was not documented prior to 2.6.1 patched.)

	pdf() now takes defaults from the new function pdf.options()
	rather that from ps.options() (and the latter was not
	documented prior to 2.6.1 patched).

	The defaults for all arguments other than 'file' in
	postscript() and pdf() can now be set by ps.options() or
	pdf.options()

    o	New functions setEPS() and setPS() as wrappers to ps.options()
	to set appropriate defaults for figures for inclusion in other
	documents and for spooling to a printer respectively.

    o	The meaning of numeric 'pch' has been extended where MBCSes are
	supported.  Now negative integer values indicate Unicode
	points, integer values in 32-127 represent ASCII characters,
	and 128-255 are valid only in single-byte locales.
	(Previously what happened with negative pch values was
	undocumented: they were replaced by the current setting of
	par("pch").)

    o	Graphics devices can say if they can rotate text well
	(e.g. postscript() and pdf() can) and if so the device's
	native text becomes the default for contour labels rather than
	using Hershey fonts.

    o	The setting of the line spacing (par("cra")[2]) on the X11() and
	windows() devices is now comparable with postscript() etc, and
	roughly 20% smaller than before (it used to depend on the
	locale for X11).  (So is the pictex() device, now 20% larger.)
	This affects the margin size in plots, and should result in
	better-looking plots.

    o	There is a per-device setting for whether new frames need
	confirmation.  This is controlled by either par("ask") or
	grid.prompt() and affects all subsequent plots on the device
	using base or grid graphics.

    o	There is a new version of the X11() device based on cairo
	graphics which is selected by type "cairo" or "nbcairo", and
	is available on machines with cairo installed and preferably
	pango (which most machines with gtk+ >= 2.8 will have).	 This
	version supports translucent colours and normally does a
	better job of font selection so it has been possible to
	display (e.g.)	English, Polish, Russian and Japanese text on
	a single X11() window.	It is the default where available.

	There is a companion function, savePlot(), to save the current
	plot to a PNG file.

	On Unix-alikes, devices jpeg() and png() also accept
	type = "cairo", and with that option do not need a running
	X server.  The meaning of capabilities("jpeg") and
	capabilities("png") has changed to reflect this.  On MacOS X,
	there is a further type = "quartz".  The default type is
	selected by the new option "bitmapType", and is "quartz" or
	"cairo" where available.

	Where cairo 1.2 or later is supported, there is a svg() device
	to write SVG files, and cairo_pdf() and cairo_ps() devices to
	write (possibly bitmap) PDF and postscript files via cairo.

	Some features require cairo >= 1.2, and some which are
	nominally supported under 1.2 seem to need 1.4 to work well.

    o	There are new bmp() and tiff() devices.

    o	New function devSize() to report the size of the current
	graphics device surface (in inches or device units).  This
	gives the same information as par("din"), but independent of
	the graphics subsystem.

    o	New base graphics function clip() to set the clipping region (in
	user coordinates).

    o	New functions grconvertX() and grconvertY() to convert between
	coordinate systems in base graphics.

    o	identify() recycles its 'labels' argument if necessary.

    o	stripchart() is now a generic function, with default and
	formula methods defined.  Additional graphics parameters may
	be included in the call.  Formula handling is now
	similar to boxplot().

    o	strwidth() and strheight() gain 'font' and 'vfont' arguments and
	accept in-line pars such as 'family' in the same way as text()
	does.  (Longstanding wish of PR#776)

    o	example(ask=TRUE) now applies to grid graphics (e.g. from
	lattice) as well as to base graphics.

    o	Option "device.ask.default" replaces "par.ask.default" now it
	applies also to grid.prompt().

    o	plot.formula() only prompts between plots for interactive
	devices (it used to prompt for all devices).

    o	When plot.default() is called with y=NULL it now calls Axis()
	with the 'y' it constructs rather than use the default axis.


DEPRECATED & DEFUNCT

    o	In package installation, SaveImage: yes is defunct and
	lazyloading is attempted instead.

    o	$ on an atomic vector or S4 object is now defunct.

    o	Partial matching in [[ is now only performed if explicitly
	requested (by exact=FALSE or exact=NA).

    o	Command-line completion has been moved from package 'rcompgen'
	to package 'utils': the former no longer exists as a separate
	package in the R distribution.

    o	The S4 pseudo-classes "single" and double have been removed.
	(The S4 class for a REALSXP is "numeric": for back-compatibility
	as(x, "double") coerces to "numeric".)

    o	gpar(gamma=) in the grid package is now defunct.

    o	Several S4 class definition utilities, get*(), have been said
	to be deprecated since R 1.8.0; these are now formally deprecated.
	Ditto for removeMethodsObject().

    o	Use of the graphics headers Rgraphics.h and Rdevices.h is
	deprecated, and these will be unavailable in R 2.8.0.
	(They are hardly used except in graphics devices, for which
	there is an updated API in this version of R.)

    o	options("par.ask.default") is deprecated in favour of
	"device.ask.default".

    o	The 'device-independent' family "symbol" is deprecated as it was
	highly locale- and device-dependent (it only did something
	useful in single-byte locales on most devices) and font=5
	(base) or fontface=5 (grid) did the job it was intended to do
	more reliably.

    o	gammaCody() is now formally deprecated.

    o	Two low-level functions using MethodsList metadata objects
	(mlistMetaName() and getAllMethods()) are deprecated.

    o	Setting par(gamma=) is now deprecated, and the windows()
	device (the only known example) no longer allows it.

    o	The C macro 'allocString' will be removed in 2.8.0 -- use
	'mkChar', or 'allocVector' directly if really necessary.


INSTALLATION

    o	Tcl/Tk >= 8.3 (released in 2000) is now required to build
	package tcltk.

    o	configure first tries TCL_INCLUDE_SPEC and TK_INCLUDE_SPEC
	when looking for Tcl/Tk headers.  (The existing scheme did
	not work for the ActiveTcl package on Mac OS X.)

    o	The Windows build only supports Windows 2000 or later (XP,
	Vista, Server 2003 and Server 2008).

    o	New option --enable-R-static-lib installs libR.a which can
	be linked to a front-end via 'R CMD config --ldflags'.
	The tests/Embedding examples now work with a static R
	library.

    o	Netscape (which was discontinued in Feb 2008) is no longer
	considered when selecting a browser.

    o	xdg-open (the freedesktop.org interface to
	kfmclient/gnome-open/...) is considered as a possible browser,
	after real browsers such as firefox, mozilla and opera.

    o	The search for tclConfig.sh and tkConfig.sh now only looks in
	directories with names containing $(LIBnn) in the hope of
	finding the version for the appropriate architecture
	(e.g. x86_64 or i386).

    o	libtool has been updated to version 2.2.

    o	Use of --with-system-zlib, --with-system-bzlib or
	--with-system-pcre now requires version >= 1.2.3, 1.0.5, 7.6
	respectively, for security.


UTILITIES

    o	Rdconv now removes empty sections including alias and keyword
	entries, with a note.

    o	Keyword entries are no longer mandatory in Rd files.

    o	R CMD INSTALL now also installs tangled versions of all vignettes.

    o	R CMD check now warns if spaces or non-ASCII characters are
	used in file paths, since these are not in general portable.

    o	R CMD check (via massage-Examples.pl) now checks all examples
	with a 7 inch square device region on A4 paper, for
	locale-independence and to be similar to viewing examples on
	an on-screen device.

	If a package declares an encoding in the DESCRIPTION file,
	the examples are assumed to be in that encoding when running
	the tests. (This avoids errors in running latin1 examples in a
	UTF-8 locale.)

    o	R CMD check uses pdflatex (if available) to check the typeset
	version of the manual, producing PDF rather than DVI.  (This
	is a better check since the package reference manuals on CRAN
	are in PDF.)

    o	R CMD Rd2dvi gains a --encoding argument to be passed to
	R CMD Rdconv, to set the default encoding for conversions.
	If this is not supplied and the files are package sources and
	the DESCRIPTION file contains an Encoding field, that is used
	for the default encoding.

    o	available.packages() (and hence install.packages() etc) now
	supports subdirectories in a repository, and
	tools::write_PACKAGES() can now produce PACKAGES files
	including subdirectories.

    o	The default for 'stylepath' in Sweave's (default) RweaveLatex
	driver can be set by the environment variable
	SWEAVE_STYLEPATH_DEFAULT: see ?RweaveLatex.


C-LEVEL FACILITIES

    o	Both the Unix and Windows interfaces for embedding now make
	use of 'const char *' declarations where appropriate.

    o	Rprintf() and REprintf() now use 'const char *' for their format
	argument -- this should reduce warnings when called from C++.

    o	There is a new description of the interface for graphics
	devices in the 'R Internals' manual, and several new entry
	points.	 The API has been updated to version R_GE_version = 5,
	and graphics devices will need to be updated accordingly.

    o	Graphics devices can now select to be sent text in UTF-8, even
	if the current locale is not UTF-8 (and so enable text entered
	in UTF-8 to be plotted).  This is used by postscript(), pdf()
	and the windows() family of devices, as well as the new
	cairo-based devices.

    o	More Lapack routines are available (and declared in R_Ext/Lapack.h),
	notably for (reciprocal) condition number estimation of complex
	matrices.

    o	Experimental utility R_has_slot supplementing R_do_slot.

    o	There is a new public interface to the encoding info stored on
	CHARSXPs, getCharCE and mkCharCE using the enumeration type
	cetype_t.

    o	A new header 'R_ext/Visibility.h' contains some definitions for
	controlling the visibility of entry points, and how to control
	visibility is now documented in 'Writing R Extensions'.


BUG FIXES

    o	pt(x, df) is now even more accurate in some cases (e.g. 12 instead
	of 8 significant digits), when x^2 << df, thanks to a remark from
	Ian Smith, related to PR#9945.

    o	co[rv](use = "complete.obs") now always gives an error if there
	are no complete cases: they used to give NA if
	method = "pearson" but an error for the other two methods.
	(Note that this is pretty arbitrary, but zero-length vectors
	always give an error so it is at least consistent.)

	Since sd(na.rm=TRUE) and var(na.rm=TRUE) both call cov(use =
	"complete.obs"), this applies also to them.

	cor(use="pair") used to give diagonal 1 even if the variable
	was completely missing for the rank methods but NA for the
	Pearson method: it now gives NA in all cases.

	cor(use="pair") for the rank methods gave a matrix result with
	dimensions > 0 even if one of the inputs had 0 columns.

    o	Supplying edit.row.names = TRUE when editing a matrix without
	row names is now an error and not a segfault. (PR#10500)

    o	The error handler in the parser reported unexpected
	& as && and | as ||.

    o	ps.options(reset = TRUE) had not reset for a long time.

    o	paste() and file.path() no longer allow NA_character_ for
	their 'sep' and 'collapse' arguments.

    o	by() failed for 1-column matrices and dataframes.  (PR#10506)
	However, to preserve the old behaviour, the default method
	when operating on a vector still passes subsets of the vector
	to FUN, and this is now documented.

    o	Better behaviour of str.default() for non-default
	'strict.width' (it was calling str() rather than str.default()
	internally); also, more useful handling of options("str").

    o	wilcox.test(exact=FALSE, conf.int=TRUE) could fail in some
	extreme two-sample problems.  (Reported by Wolfgang Huber.)

    o	par(pch=) would accept a multi-byte string but only use the
	first byte.  This would lead to incorrect results in an MBCS
	locale if a non-ASCII character was supplied.

    o	There are some checks for valid C-style formats in, e.g.
	png(filename=).	 (PR#10571)

    o	vector() was misinterpreting some double 'length' values, e.g,
	NaN and NA_real_ were interpreted as zero.  Also, invalid
	types of 'length' were interpreted as -1 and hence reported as
	negative.  (length<- shared the code and hence the same
	misinterpretations.)

    o	A basic class "S4" was added to correspond to the "S4" object
	type, so that objects with this type will print, etc.  The
	class is VIRTUAL, since all actual S4 objects must have a real
	class.

    o	Classes with no slots that contain only VIRTUAL classes are now
	VIRTUAL, as was intended but confused by having an empty S4
	object as prototype. ## backed out temporarily ##

    o	format.AsIs() discarded dimnames, causing dataframes with matrix
	variables to be printed without using the column names, unlike
	what happens in S-PLUS (Tim Hesterberg, PR#10730).

    o	xspline() and grid::grid.xspline() work in device coordinates
	and now correct for anisotropy in the device coordinate
	system.

    o	grid.locator() now indicates to the graphics device that it is
	is in 'graphics input' mode (as locator() and identify()
	always have).  This means that devices can now indicate the
	'graphics input' mode by e.g. a change of cursor.

    o	Locales without encoding specification and non-UTF-8 locales
	now work properly on Mac OS X.	Note that locales without
	encoding specification always use UTF-8 encoding in Mac OS X
	(except for specials "POSIX" and "C") - this is different from
	other operating systems.

    o	iconv() now correctly handles to="" and from="" on Mac OS X.

    o	In diag()'s argument list, drop the explicit default (' = n')
	for 'ncol' which is ugly when making diag() generic.

    o	S4 classes with the same name from different packages were not
	recognized because of a bug in caching the new definition.

    o	jpeg() and png() no longer maintain a display list, as they
	are not interactive devices.

    o	Using attr(x, "names") <- value (instead of the correct
	names<-) with 'value' a pairlist (instead of the correct
	character vector) worked incorrectly.  (PR#10807)

    o	Using [<- to add a column to a data frame dropped other
	attributes whereas [[<- and $<- did not: now all preserve
	attributes.  (PR#10873)

    o	File access functions such as file.exists(), file.info(),
	dirname() and unlink() now treat an NA filename as a
	non-existent file and not the file "NA".

    o	r<foo>(), the random number generators, are now more consistent
	in warning when NA's (specifically NaN's) are generated.

    o	rnorm(n, mu = Inf) now returns rep(Inf, n) instead of NaN;
	similar changes are applied to rlnorm(), rexp(), etc.

    o	[l]choose() now warns when rounding non-integer 'k' instead of
	doing so silently.  (May help confused users such as PR#10766.)

    o	gamma() was warning incorrectly for most negative values as being
	too near a negative integer.  This also affected other
	functions making use of its C-level implementation.

    o	dumpMethod() and dumpMethods() now work again.

    o	package.skeleton() now also works for code_files with only
	metadata (e.g. S4 setClass) definitions; it handles S4 classes and
	methods, producing documentation and NAMESPACE exports if requested.

    o	Some methods package utilities (implicitGeneric(), makeGeneric())
	will be more robust in dealing with primitive functions (not a
	useful idea to call them with primitives, though)

    o	Making a MethodsList from a function with no methods table will
	return an empty list, rather than cause an error (questionably
	a bug, but caused some obscure failures).

    o	setAs() now catches 2 arguments in the method definition, if
	they do not match the arguments of coerce().

    o	S4 methods with missing arguments in the definition are handled
	correctly  when non-signature arguments exist, and check for
	conflicting local names in the method definition.

    o	qgamma() and qchisq() could be inaccurate for small p,
	e.g. qgamma(1.2e-10, shape = 19) was 2.52 rather than 2.73.

    o	dbeta(.., ncp) is now more accurate for large ncp, and typically no
	longer underflows for give.log = TRUE.

    o	coerce() is now a proper S4 object and so prints correctly.

    o	@ now checks it is being applied to an S4 object, and if not
	gives a warning (which will become an error in 2.8.0).

    o	dump() and friends now warn that all S4 objects (even those
	based on vectors) are not source()able, with a stronger wording.

    o	read.dcf(all = TRUE) was leaking connections.

    o	scan() with a non-default separator could skip nul bytes,
	including those entered as \0 with allowEscapes=TRUE.  This
	was different from the default separator.

    o	determinant(matrix(,0,0)) now returns a correct "det" result;
	also value 1 or 0 depending on 'logarithm', rather than numeric(0).

    o	Name space 'grDevices' was not unloading its DLL when the
	name space was unloaded.

    o	getNativeSymbolInfo() was unaware of non-registered Fortran
	names, because one of the C support routines ignored them.

    o	load() again reads correctly character strings with embedded nuls.
	(This was broken in 2.6.x, but worked in earlier versions.)




	**************************************************
	*						 *
	*	       2.6 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.6.2 patched


BUG FIXES

    o	src/extra/pcre has been updated to PCRE 7.6 (bugfix release).

    o	unlink(..., recursive=TRUE) no longer crashes on some platforms
	if a directory cannot be opened.

    o	Loading in 2.6.2 a saved workspace could give an unimportant
	warning in a non-UTF-8 multibyte locale (in particular a CJK
	locale on Windows) which is now suppressed.

    o	print() methods are more consistent in returning the original
	argument invisibly.

    o	Using the X11 data editor (e.g. via edit(), fix() or View())
	could crash if the 'End' key was used and all the columns
	would have fitted into the window.

    o	Creating a new page on an X11() device (by plot.new() or
	grid.newpage()) did not flush out the XClearWindow call, so
	the X11 window might not be refreshed immediately.

    o	libtool has been updated to version 1.5.26, which avoids
	many spurious configure warnings on Darwin/Mac OS X.

    o	l10n_info() now recognizes how Darwin/Mac OS X reports
	Latin-1 locales (as charset ISO8859-1 rather than ISO-8859-1).

    o	Checking examples which used grid (e.g. via lattice) without
	attaching grid no longer give errors from grid_plot_hook().

    o	kappa(m, exact=TRUE) no longer wrongly uses 'exact=FALSE' when m
	is an 'lm' or 'qr' object because the kappa.tri(x, exact=TRUE)
	now works correctly.

    o	help(topic, offline=TRUE) misbehaved when there were multiple
	matches to 'topic'.  (PR#10859)

    o	The 'multilib' changes on Linux broke the use of
	sub-architectures without a main architecture.

    o	source(echo=TRUE) would skip lines consisting entirely of the
	letter t. (PR#10923)

    o	bzip2 has been updated to 1.0.5 (security fix).



		CHANGES IN R VERSION 2.6.2


NEW FEATURES

    o	colnames(DF) is now also fast for large dataframes DF with
	automatic row.names.  Note that the correct usage is
	names(DF).  (PR#10470)

    o	tools::texi2dvi() works around the failure of 'texi2dvi --quiet'
	to be quiet in texinfo 4.11.

    o	On Linux, parallel 32/64-bit installations are supported using
	multilib.

BUG FIXES

    o	A compilation problem on one system where glob was not found
	has been corrected.  (PR#10468)

    o	The "profile.nls" method of plot() was losing the x axis labels.

    o	array() computed the total number of entries in the array before
	coercing the dimensions to integer.  (Reported by Allen McIntosh.)

    o	persp() misreported errors in the y parameter.	(Reported by Allen
	McIntosh.)

    o	source("clipboard", echo=TRUE) and file("clipboard", open="rt")
	gave spurious errors.  (Reported by Fernando Saldanha.)

    o	attributes<-() stripped any existing attributes before checking
	that all elements of the right-hand side had names.

    o	rbinom(n, size, *) gave NaN when 'size > .Machine$integer.max'.

    o	print.summary.lm() is now consistent in the capitalization of
	"R-squared".

    o	confint() misreported on some rank-deficient lm() models.
	(PR#10496)  This could also occur in the default method.

    o	\code{\var{<name>}} was not rendered correctly to latex in Rd
	files for non-alphabetic arguments <name>.

    o	In 2.6.1, curve(*, add=TRUE) used a wrong default 'xlim' when x
	coordinates were logged.

    o	The Java-based search in help.start() now only requires a
	JVM >= 1.4 (2.6.1 accidentally required >= 1.5).

    o	The default method for range() was omitting 'na.rm' for
	non-numeric objects such as those of class "Date".  (PR#10508)

    o	cut(x, breaks=<n>) misbehaved on a constant vector of negative
	values.

    o	bxp(), the plotting engine of boxplot(), no longer plots staple
	ticks multiple times.  (PR#10499)

    o	The automatic detection of the domain for message translation
	was not working correctly for messages in message(), warning()
	and stop() in packages other than 'base'.

    o	The profile.nls() function misbehaved when encountering
	non-convergence of the "port" algorithm.

    o	Under certain rare circumstances in R 2.6.x, log(), round()
	and trunc() could alter their arguments in the caller.	This
	involved passing of empty '...' arguments, and was spotted
	when using apply(x, 2, log).

    o	par() no longer warns unnecessarily when asked to set new=FALSE
	on an unused graphics device.

    o	plot.formula() was not passing on '...' when used with a
	one-sided formula.

	plot.formula() was not accepting expressions for annotations
	passed to title().  (PR#10525)

    o	pchisq(x, df=0, ncp=L) now returns the correct limit exp(-L/2) for
	x=0 and is no longer returning NaN for x > 0, L < 80.  (PR#10551)

    o	Non-ASCII characters were only working correctly in Hershey
	fonts if these were specified by the 'vfont' argument to
	text() and not if specified as a font family.

    o	There were several errors in Hershey$allowed, but the help
	page listed the allowed combinations correctly.

    o	text() no longer attempts to use 'vfont' with an expression
	for 'labels' (it was documented not to work).

    o	fisher.test(simulate.p.value = TRUE) gave incorrect answers
	in some extremely degenerate problems.	(PR#10558)

    o	src/extra/pcre has been updated to PCRE 7.5 (bugfix release).

    o	capture.output() completes an incomplete final line of
	output when file = NULL.  (PR#10534)

    o	capture.output() now returns invisibly if output is written to
	a file/connection.

    o	format.AsIs() did not remove the "AsIs" class and so could go
	into an infinite loop.

    o	summary.mlm() lost the names of the coefficients when there
	was only one.

    o	Rdconv was not marking examples files with an encoding if
	this was known from the package's DESCRIPTION file.

    o	readChar() from a raw vector was reading a number of bytes,
	not characters.

    o	slotNames() was erroneously treating classes that extend
	"character" as strings.

    o	R no longer ignores SIGPIPE signals even in processes launched
	by system().  Instead PR#1959 is handled by a simple error
	handler which will give an error message in circumstances
	where none was given before.

    o	The AIC() S4 generic in package stats4 no longer disables
	dispatch of S3 methods for AIC().

    o	The conflicts check in library() excluded all S4 generics, even
	where they were unrelated to the function masked.  It is now
	more selective (although still too generous to S4 generics).

    o	proc.time() was missing a protect and could misbehave if
	provoked by gctorture().  (PR#10600)

    o	The cut() and hist() methods for dates and datetimes are now
	more accurate for intervals of "months" and "years", thanks to
	Marc Schwarz.

    o	url()/download.file() could segfault if the HTTP interaction
	involved a redirect to an address starting with '/' on the
	same server.

    o	Memory allocations used in format() and in an internal utility
	function could be off by one byte. (PR#10635)

    o	isoreg(x, y) no longer segfaults when y has NAs.

    o	split(x, g) always returns a list as documented.  (It used to
	return NULL for a zero-length 'x'.)

    o	tapply(x, g, ...) misbehaved if the args were of zero length.
	(PR#10644)

    o	hist.POSIXt(*, xaxt = "n") no longer suppresses the y-axis.

    o	strptime() crashed under certain locales on Mac OS X.

    o	gregexpr() no longer segfaults when "" is given as the search
	pattern.  Thanks to Hervé Pagès for the bug report.

    o	matplot(x, *) with default 'pch' did not plot columns from column
	number 37 on (because the default pch was NA for those). (PR#10676)

    o	print.htest() lost output when used within sink(file, split=TRUE).

    o	Setting par(col.main=) also set par("col") to the same colour.

    o	Anonymous fifos were broken (again).



		CHANGES IN R VERSION 2.6.1


NEW FEATURES

    o	The "data.frame" and "factor" methods for [[ now support
	the 'exact' argument introduced in 2.6.0.

    o	plot.lm() gains a new argument 'cex.caption' to allow the
	size of the captions to be controlled.

    o	A series of changes make the CHARSXP cache introduced in 2.6.0
	faster (and in some cases many times faster) in sessions with
	a large number (e.g. a million) of unique character strings,
	and also if there are many empty strings.

    o	embedFonts(), bitmap() and dev2bitmap() explicitly turn off
	auto-rotation in Ghostscript when generating PDF.

    o	The canonical architecture is no longer checked when loading
	packages using a non-empty sub-architecture, since it is
	possible to (e.g.) build packages for i386-pc-linux-gnu on both
	that architecture and on x86_64-unknown-linux-gnu.

    o	Deparsing will (if option warnIncomplete is set) warn on
	strings longer than the parser limit (8192 bytes).

    o	url() now uses the UserAgent header in http transactions in
	the same way as download.file() (making use of option
	"HTTPUserAgent").


BUG FIXES

    o	iconv() is again able to translate character strings with
	embedded nuls (such as those in UCS-2).

    o	new.packages() and update.packages() failed when called on an
	empty library, since old.packages() threw an error.
	old.packages() now returns NULL (as documented) in that case.

    o	Builds on Mac OS X 10.4 or higher now allocate enough space
	in the binary headers to relocate dependent libraries into the
	framework.

    o	R CMD build now computes the exclusion list on the copy it
	makes: this avoids problems if the original sources contain
	symbolic links (which are resolved in the copy).  Thanks to
	Michael Lawrence for diagnosis and patch.

    o	object.size() had slightly too low a size for objects of type "S4".

    o	symbol() in plotmath expressions was only accepting valid
	character strings, which made it impossible to specify symbols
	such as aleph (obtained by symbol("\300")) in a UTF-8 locale.

    o	An event handling issue caused autorepeat functions to
	misbehave with tcltk (notably scrollbars).

    o	plot(sin, -5, 5) gives ylab 'sin(x)' again, where it resulted
	in 'x(x)' in 2.6.0.  Further,  plot(sin)  again plots from
	[0,1] also in cases where a previously used coordinate system
	differs.

    o	curve() with unspecified 'from', 'to' and 'xlim' now reuses the
	previous x limits, and not slightly larger ones.

    o	It was intended that R code filenames in packages should start
	with an ASCII letter or digits (and R CMD INSTALL uses that),
	but the test used in R CMD build ([A-Za-z0-9]) was
	locale-specific (and excluded t to y in Estonian, for
	example).  (PR#10351)

    o	'R CMD build' could misbehave when faced with files with CRLF
	line endings *and* no line ending on the final line of the
	file, removing the last byte of the file.

    o	DF[i, j] failed in 2.6.0 if j was a logical vector selecting a
	single column.

    o	Unix x11() would fail if a valid 'display' was specified but
	DISPLAY was unset. (PR#10379)

    o	postscript() was not always ignoring .Postscript.Options in
	the workspace (where it should not have occurred).

    o	help.search() would give an error if it found a badly
	installed package, even if 'package' was not specified.

    o	tclServiceMode() (package tcltk) now works under Unix-alikes.
	(Although documented, it used only to work under Windows.)

    o	As Mac OS X 10.5.x comes with incompatible /bin/sh shell, we
	force SHELL=/bin/bash (which is ok) in that case. [Only for
	2.6.x: another solution is used in 2.7.0.]

    o	Deliberately using malformed source attributes no longer
	causes deparsing/printing of functions to crash R. (PR#10437)

    o	R CMD check and R CMD INSTALL now work with (some) directory
	names containing spaces.

    o	choose(n, k) gave incorrect values for negative n and small k.

    o	plot.ts(x,y) could use wrong default labels; fixed thanks to
	Antonio, Fabio di Narzo.

    o	reshape() got column names out of sync with contents in some
	cases; found by Antonio Fabio Di Narzo.

    o	ar(x) for short 'x' (i.e. length <= 10) could fail because the
	default 'order.max' was >= length(x) which is non-sensical.

    o	Keyboard events in getGraphicsEvent() could cause stack
	imbalance errors. (PR#10453)



		CHANGES IN R VERSION 2.6.0


SIGNIFICANT USER-VISIBLE CHANGES

    o	integrate(), nlm(), nlminb(), optim(), optimize() and uniroot()
	now have '...' much earlier in their argument list.  This
	reduces the chances of unintentional partial matching but
	means that the later arguments must be named in full.

    o	The default type for nchar() is now "chars".  This is almost
	always what was intended, and differs from the previous default
	only for non-ASCII strings in a MBCS locale.  There is a new
	argument 'allowNA', and the default behaviour is now to throw
	an error on an invalid multibyte string if type="chars" or
	type="width".

    o	Connections will be closed if there is no R object referring to
	them.  A warning is issued if this is done, either at garbage
	collection or if all the connection slots are in use.


NEW FEATURES

    o	abs(), sign(), sqrt(), floor(), ceiling(), exp() and the gamma,
	trig and hyperbolic trig functions now only accept one
	argument even when dispatching to a Math group method (which
	may accept more than one argument for other group members).

    o	abbreviate() gains a 'method' argument with a new option
	"both.sides" which can make shorter abbreviations.

    o	aggregate.data.frame() no longer changes the group variables
	into factors, and leaves alone the levels of those which are
	factors.  (Inter alia grants the wish of PR#9666.)

    o	The default 'max.names' in all.names() and all.vars() is now
	-1 which means unlimited.  This fixes PR#9873.

    o	as.vector() and the default methods of as.character(),
	as.complex(), as.double(), as.expression(), as.integer(),
	as.logical() and as.raw() no longer duplicate in most cases
	where the object is unchanged.	(Beware: some code has been
	written that invalidly assumes that they do duplicate, often
	when using .C/.Fortran(DUP=FALSE).)

    o	as.complex(), as.double(), as.integer(), as.logical() and
	as.raw() are now primitive and internally generic for
	efficiency. They no longer dispatch on S3 methods for
	as.vector() (which was never documented).  as.real() and
	as.numeric() remain as alternative names for as.double().

	expm1(), log(), log1p(), log2(), log10(), gamma(), lgamma(),
	digamma() and trigamma() are now primitive.  (Note that logb()
	is not.)

	The Math2 and Summary groups (round, signif, all, any, max, min,
	sum, prod, range) are now primitive.

	See under METHODS PACKAGE below for some consequences for S4 methods.

    o	apropos() now sorts by name and not by position on the search
	path.

    o	attr() gains an 'exact = TRUE' argument to disable partial
	matching.

    o	bxp() now allows 'xlim' to be specified. (PR#9754)

    o	C(f, SAS) now works in the same way as C(f, treatment), etc.

    o	chol() is now generic.

    o	dev2bitmap() has a new option to go via PDF and so allow
	semi-transparent colours to be used.

    o	dev.interactive() regards devices with the displaylist enabled
	as interactive, and packages can register the names of their
	devices as interactive via deviceIsInteractive().

    o	download.packages() and available.packages() (and functions
	which use them) now support in 'repos' or 'contriburl' either
	file: plus a general path (including drives on a UNC path on
	Windows) or a file:/// URL in the same way as url().

    o	dQuote() and sQuote() are more flexible, with rendering
	controlled by the new option 'useFancyQuotes'.	This includes
	the ability to have TeX-style rendering and directional quotes
	(the so-called 'smart quotes') on Windows.  The default is to
	use directional quotes in UTF-8 locales (as before) and in the
	Rgui console on Windows (new).

    o	duplicated() and unique() and their methods in base gain an
	additional argument 'fromLast'.

    o	fifo() no longer has a default 'description' argument.

	fifo("") is now implemented, and works in the same way as file("").

    o	file.edit() and file.show() now tilde-expand file paths on all
	interfaces (they used to on some and not others).

    o	The find() argument is now named 'numeric' and not 'numeric.':
	the latter was needed to avoid warnings about name clashes
	many years ago, but partial matching was used.

    o	stats:::.getXlevels() confines attention to factors since some
	users expected R to treat unclass(<a factor>) as a numeric
	vector.

    o	grep(), strsplit() and friends now warn if incompatible sets
	of options are used, instead of silently using the documented
	priority.

    o	gsub()/sub() with perl = TRUE now preserves attributes from the
	argument x on the result.

    o	is.finite() and is.infinite() are now S3 and S4 generic.

    o	jpeg(), png(), bmp() (Windows), dev2bitmap() and bitmap() have
	a new argument 'units' to specify the units of 'width' and
	'height'.

    o	levels() is now generic (levels<- has been for a long time).

    o	Loading serialized raw objects with load() is now considerably
	faster.

    o	New primitive nzchar() as a faster alternative to
	nchar(x) > 0 (and avoids having to convert to wide chars in
	a MBCS locale and hence consider validity).

    o	The way old.packages() and hence update.packages() handle
	packages with different versions in multiple package
	repositories has been changed.	The first package encountered
	was selected, now the one with highest version number.

    o	optim(method = "L-BFGS-B") now accepts zero-length parameters,
	like the other methods.	 Also, method = "SANN" no longer
	attempts to optimize in this case.

    o	New options 'showWarnCalls' and 'showErrorCalls' to give a
	concise traceback on warnings and errors.  showErrorCalls=TRUE
	is the default for non-interactive sessions.  Option
	'showNCalls' controls how abbreviated the call sequence is.

    o	New options 'warnPartialMatchDollar', 'warnPartialMatchArgs'
	and 'warnPartialMatchAttr' to help detect the unintended use
	of partial matching in $, argument matching and attr()
	respectively.

    o	A device named as a character string in options(device =) is now
	looked for in the grDevices name space if it is not visible
	from the global environment.

    o	pmatch(x, y, duplicates.ok = TRUE) now uses hashing and so is
	much faster for large x and y when most matches are exact.

    o	qr() is now generic.

    o	It is now a warning to have an non-integer object for
	.Random.seed: this indicates a user had been playing with it,
	and it has always been documented that users should only save
	and restore it.

    o	New higher-order functions Reduce(), Filter() and Map().

    o	[g]regexpr() gain an 'ignore.case' argument for consistency with
	grep().	 (This does change the positional matching
	of arguments, but no instances of positional matching beyond
	the second were found.)

    o	relist() utility, an S3 generic with several methods, providing
	an 'inverse' for unlist(); thanks to a code proposal from
	Andrew Clausen.

    o	require() now returns invisibly.

    o	The interface to reshape() has been revised, allowing some
	simplified forms that did not work before, and somewhat
	improved error handling. A new argument 'sep' has been
	introduced to replace simple usages of 'split' (the old
	features are retained).

    o	rmultinom() uses a high-precision accumulator where available,
	and so is more likely to give the same result on different
	platforms (although it is still possible to get different
	results, and the result may differ from previous versions of R).

    o	row() and col() now work on matrix-like objects such as data
	frames, not just matrices.

    o	Rprof() allows smaller values of 'interval' on machines that
	support it: for example modern Linux systems support
	interval = 0.001.

    o	sample() now requires its first argument 'x' to be numeric
	(in the sense of is.numeric()) as well as of length 1 and >= 1
	before it is regarded as shorthand for 1:x.

    o	sessionInfo() now provides details about package name spaces
	that are loaded but not attached.  The output of sessionInfo
	has been improved to make it easier to read when it is
	inadvertently wrapped after being pasted into an email
	message.

    o	setRepositories() has a new argument 'ind' to allow selections
	to be made programmatically.

    o	sprintf() no longer has a output string length limit.

    o	storage.mode<- is now primitive, and hence makes fewer copies
	of an object (none if the mode is unchanged).  It is a little
	less general than mode<-, which remains available.  (See also
	the entry under DEFUNCT below.)

    o	sweep() gains an argument 'check.margin = TRUE' which warns
	about mismatched dimensions.

    o	The mathematical annotation facility (plotmath) now recognises
	a symbol() function which forces the font to be a symbol font.
	This allows access to all characters in the Adobe Symbol
	encoding within plotmath expressions.

    o	For OSes that cannot unset environment variables, Sys.unsetenv()
	sets the value to "", with a warning.

    o	New function Sys.which(), an interface to 'which' on
	Unix-alikes and an emulation on Windows.

    o	On Unix-alikes, system(, intern = TRUE) reports on very long
	lines that may be truncated, giving the line number of the
	content being read.

    o	termplot() has a default for 'ask' that uses dev.interactive().

	It allows 'ylim' to be set, or computed to cover all the
	plots to be made (the new default) or computed for each plot
	(the previous default).

    o	uniroot(f, *) is slightly faster for non-trivial f() because it
	computes f(lower) and f(upper) only once, and it has new optional
	arguments 'f.lower' and 'f.upper' by which the caller can pass these.

    o	unlink() is now internal, using common POSIX code on all platforms.

    o	unsplit() now works with lists of dataframes.

    o	The vcov() methods for classes "gls" and "nlme" have migrated to
	package 'nlme'.

    o	vignette() has a new argument 'all' to choose between showing
	vignettes in attached packages or in all installed packages.

    o	New function within(), which is like with(), except that it
	returns modified versions back of lists and data frames.

    o	X11(), postscript() (and hence bitmap()), xfig(), jpeg(), png()
	and the Windows devices win.print(), win.metafile() and bmp()
	now warn (once at first use) if semi-transparent colours are
	used (rather than silently treating them as fully
	transparent).

    o	New function xspline() to provide base graphics support of
	X-splines (cf grid.xspline).

    o	New function xyTable() does the 2D gridding "computations" used by
	sunflowerplot().


    o	Rd conversion to HTML and CHM now makes use of classes, which
	are set in the stylesheets.  Editing R.css will change the
	styles used for \env, \option, \pkg etc.  (CHM styles are set
	at compilation time.)

    o	The documented arguments of '%*%' have been changed to be x
	and y, to match S and the implicit S4 generic.

    o	If members of the Ops group (the arithmetic, logical and
	comparison operators) and '%*%' are called as functions,
	e.g. '>'(x, y), positional matching is always used.  (It used
	to be the case that positional matching was used for the
	default methods, but names would be matched for S3 and S4
	methods and in the case of '!' the argument name differed
	between S3 and S4 methods.)

    o	Imports environments of name spaces are named (as
	"imports:foo"), and so are known e.g. to environmentName().

    o	Package 'stats4' uses lazy-loading not SaveImage (which is now
	deprecated).

    o	Installing help for a package now parses the .Rd file only
	once, rather than once for each type.

    o	PCRE has been updated to version 7.2.

    o	bzip2 has been updated to version 1.0.4.

    o	gettext has been updated to version 0.16.1.

    o	There is now a global CHARSXP cache, R_StringHash.  CHARSXPs
	are no longer duplicated and must not be modified in place.
	Developers should strive to only use mkChar (and mkString) for
	creating new CHARSXPs and avoid use of allocString.  A new
	macro, CallocCharBuf, can be used to obtain a temporary char
	buffer for manipulating character data.	 This patch was
	written by Seth Falcon.

    o	The internal equivalents of as.complex, as.double, as.integer
	and as.logical used to handle length=1 arguments now accept
	character strings (rather than report that this is
	'unimplemented').

    o	Lazy-loading a package is now substantially more efficient (in
	memory saved and load time).

    o	Various performance improvements lead to a 45% reduction
	in the startup time without 'methods' (and one-sixth with -
	'methods' now takes 75% of the startup time of a default session).

    o	The [[ subsetting operator now has an argument 'exact' that
	allows programmers to disable partial matching (which will in
	due course become the default).	 The default value is exact=NA
	which causes a warning to be issued when partial matching
	occurs.	 When exact = TRUE, no partial matching will be
	performed.  When exact = FALSE, partial matching can occur and
	no warning will be issued.  This patch was written by Seth
	Falcon.

    o	Many of the C-level warning / error messages (e.g. from
	subscripting) have been re-worked to give more detailed
	information on either the location or the cause of the
	problem.

    o	The S3 and S4 Math groups have been harmonized.	 Functions
	log1p(), expm1(), log10() and log2() are members of the S3
	group, and sign(), log1p(), expm1(), log2(), cummax(),
	cummin(), digamma(), trigamma() and trunk() are members of the
	S4 group.  gammaCody() is no longer in the S3 Math group.
	They are now all primitive.

    o	The initialization of the random-number stream makes use of the
	sub-second part of the current time where available.

	Initialization of the 1997 Knuth TAOCP generator is now done
	in R code, avoiding some C code whose licence status has been
	questioned.

    o	The reporting of syntax errors has been made more user-
	friendly.


METHODS PACKAGE

    o	Packages using 'methods' have to have been installed in R 2.4.0
	or later (when various internal representations were changed).

    o	Internally generic primitives no longer dispatch S4 methods on
	S3 objects.

    o	load() and restoring a workspace attempt to detect and warn on
	the loading of pre-2.4.0 S4 objects.

    o	Making functions primitive changes the semantics of S4
	dispatch: these no longer dispatch on classes based on types
	but do dispatch whenever the function in the base name space is
	called.

	This applies to as.complex(), as.integer(), as.logical(),
	as.numeric(), as.raw(), expm1(), log(), log1p(), log2(),
	log10(), gamma(), lgamma(), digamma() and trigamma(), as
	well as the Math2 and Summary groups.

	Because all members of the group generics are now primitive,
	they are all S4 generic and setting an S4 group generic does
	at last apply to all members and not just those already made
	S4 generic.

	as.double() and as.real() are identical to as.numeric(), and
	now remain so even if S4 methods are set on any of them.
	Since 'as.numeric' is the traditional name used in S4,
	currently methods must be exported from a NAMESPACE for
	'as.numeric' only.

    o	The S4 generic for '!' has been changed to have signature (x)
	(was (e1)) to match the documentation and the S3 generic.
	setMethod() will fix up methods defined for (e1), with a
	warning.

    o	The "structure" S4 class now has methods that implement the
	concept of structures as described in the Blue Book--that
	element-by-element functions and operators leave structure
	intact unless they change the length.  The informal behavior
	of R for vectors with attributes was inconsistent.

    o	The implicitGeneric() function and relatives have been added to
	specify how a function in a package should look when methods are
	defined for it.	 This will be used to ensure that generic versions
	of functions in R core are consistent.	See ?implicitGeneric.

    o	Error messages generated by some of the functions in the methods
	package provide the name of the generic to provide more
	contextual information.

    o	It is now possible to use setGeneric(useAsDefault = FALSE) to
	define a new generic with the name of a primitive function
	(but having no connection with the primitive).

    o	showMethods() has a "smart" default for 'inherited' such that
	showMethods(<genfun>, incl = TRUE)  becomes a useful short cut.


DEPRECATED & DEFUNCT

    o	$ on an atomic vector now gives a warning that it is 'invalid'.
	It remains deprecated, but may be removed in R >= 2.7.0.

    o	storage.mode(x) <- "real" and storage.mode(x) <- "single" are
	defunct: use instead storage.mode(x) <- "double" and
	mode(x) <- "single".

    o	In package installation, SaveImage: yes is deprecated in
	favour of LazyLoad: yes.

    o	seemsS4Object (methods package) is deprecated in favour of isS4().

    o	It is planned that [[exact=TRUE]] will become the default in
	R 2.7.0.


UTILITIES

    o	checkS3methods() (invoked by R CMD check) now checks the
	arguments of methods for primitive members of the S3 group
	generics.

    o	R CMD check now does a recursive copy on the 'tests' directory.

    o	R CMD check now warns on non-ASCII .Rd files without an
	\encoding field, rather than just on ones that are definitely
	not from an ISO-8859 encoding.	This agrees with the
	long-standing stipulation in 'Writing R Extensions', and
	catches some packages with UTF-8 man pages.

    o	R CMD check now warns on DESCRIPTION files with a non-portable
	Encoding field, or with non-ASCII data and no Encoding field.

    o	R CMD check now loads all the 'Suggests' and 'Enhances'
	dependencies to reduce warnings about non-visible objects, and
	also emulates standard functions (such as shell()) on
	alternative R platforms.

    o	R CMD check now (by default) attempts to latex the vignettes
	rather than just weave and tangle them: this will give a NOTE
	if there are latex errors.

    o	R CMD check computations no longer ignore Rd \usage entries for
	functions for extracting or replacing parts of an object, so S3
	methods should use the appropriate \method{} markup.

    o	R CMD check now checks for CR (as well as CRLF) line endings in
	C/C++/Fortran source files, and for non-LF line endings in
	Makefile[.in] and Makevars[.in] in the package 'src'
	directory.  R CMD build will correct non-LF line endings in
	source files and in the make files mentioned.

    o	Rdconv now warns about unmatched braces rather than silently
	omitting sections containing them.  (Suggestion by Bill
	Dunlap, PR#9649)

	Rdconv now renders (rather than ignores) \var{} inside \code{}
	markup in latex conversion.

	R CMD  Rdconv gains a --encoding argument to set the default
	encoding for conversions.

    o	The list of CRAN mirrors now has a new (manually maintained)
	column "OK" which flags mirrors that seem to be OK, only those
	are used by chooseCRANmirror(). The now exported function
	getCRANmirrors() can be used to get all known mirrors or only
	the ones that are OK.

    o	R CMD SHLIB gains arguments --clean and --preclean to clean up
	intermediate files after and before building.

    o	R CMD config now knows about FC and FCFLAGS (used for F9x
	compilation).

    o	R CMD Rdconv now does a better job of rendering quotes in
	titles in HTML, and \sQuote and \dQuote into text on Windows.


C-LEVEL FACILITIES

    o	New utility function alloc3DArray similar to allocMatrix.

    o	The entry point R_seemsS4Object in Rinternals.h has not been
	needed since R 2.4.0 and has been removed.  Use IS_S4_OBJECT
	instead.

    o	Applications embedding R can use R_getEmbeddingDllInfo() to
	obtain DllInfo for registering symbols present in the
	application itself.

    o	The instructions for making and using standalone libRmath have
	been moved to the R Installation and Administration manual.

    o	CHAR() now returns (const char *) since CHARSXPs should no
	longer be modified in place.  This change allows compilers to
	warn or error about improper modification.  Thanks to Hervé
	Pagès for the suggestion.

    o	acopy_string is a (provisional) new helper function that
	copies character data and returns a pointer to memory
	allocated using R_alloc.  This can be used to create a copy of
	a string stored in a CHARSXP before passing the data on to a
	function that modifies its arguments.

    o	asLogical, asInteger, asReal and asComplex now accept STRSXP
	and CHARSXP arguments, and asChar accepts CHARSXP.

    o	New entry point R_GE_str2col listed in R_ext/GraphicsEngine.h
	for external graphics device developers.

    o	doKeybd and doMouseevent are now exported in GraphicsDevice.h.

    o	R_alloc now has first argument of type 'size_t' to support
	64-bit platforms (e.g. Win64) with a 32-bit 'long' type.

    o	The type of the last two arguments of getMatrixDimnames (non-API
	but mentioned in R-exts.texi and in Rinternals.h) has been
	changed to 'const char **' (from char **).

    o	R_FINITE now always resolves to the function call R_finite in
	packages (rather than sometimes substituting isfinite).	 This
	avoids some issues where R headers are called from C++ code
	using features tested on the C compiler.

    o	The advice to include R headers from C++ inside extern "C" {}
	has been changed.  It is nowadays better *not* to wrap the
	headers, as they include other headers which on some OSes
	should not be wrapped.

    o	Rinternals.h no longer includes a substantial set of C headers.
	All but ctype.h and errno.h are included by R.h which is supposed
	to be used before Rinternals.h.

    o	Including C system headers can be avoided by defining NO_C_HEADERS
	before including R headers.  This is intended to be used from
	C++ code, and you will need to include C++ equivalents such as
	<cmath> before the R headers.


INSTALLATION

    o	The 'test-Lapack' test is now part of 'make check'.

    o	The 'stat' system call is now required, along with 'opendir'
	(which had long been used but not tested for).	('make check'
	would have failed in earlier versions without these calls.)

    o	'evince' is now considered as a possible PDF viewer.

    o	'make install-strip' now also strips the DLLs in the standard
	packages.

    o	Perl 5.8.0 (released in July 2002) or later is now required.
	(R 2.4.0 and later have in fact required 5.6.1 or later.)

    o	The C function 'finite' is no longer used: we expect a C99
	compiler which will have 'isfinite'.  (If that is missing, we
	test separately for NaN, Inf and -Inf.)

    o	A script/executable 'texi2dvi' is now required on Unix-alikes:
	it is part of the texinfo distribution.

    o	Files texinfo.tex and txi-en.tex are no longer supplied in
	doc/manual (as the latest versions have an incompatible
	licence).  You will need to ensure that your texinfo and/or
	TeX installations supply them.

    o	wcstod is now required for MBCS support.

    o	There are some experimental provisions for building on Cygwin.


PACKAGE INSTALLATION

    o	The encoding declared in the DESCRIPTION file is now used as
	the default encoding for .Rd files.

    o	A standard for specifying package license information in the
	DESCRIPTION License field was introduced, see 'Writing R
	Extensions'.  In addition, files LICENSE or LICENCE in a package
	top-level source directory are now installed (so putting copies
	into the 'inst' subdirectory is no longer necessary).

    o	install.packages() on a Unix-alike now updates
	doc/html/packages.html only if packages are installed to
	.Library (by that exact name).

    o	R CMD INSTALL --clean now runs SHLIB --clean to do the clean
	up (unless there is a src/Makefile), and this will remove
	$(OBJECTS) (which might have been redefined in Makevars).

	R CMD INSTALL --preclean cleans up the sources after a
	previous installation (as if that had used --clean) before
	attempting to install.

	R CMD INSTALL will now run R CMD SHLIB in the 'src' directory
	if src/Makevars is present, even if there are no source files
	with known extensions.

    o	If there is a file src/Makefile, src/Makevars is now ignored
	(it could be included by src/Makefile if desired), and it is
	preceded by etc/Makeconf rather than share/make/shlib.mk.
	Thus the makefiles read are R_HOME/etc/Makeconf, src/Makefile
	in the package and then any personal Makevars files.

    o	R CMD SHLIB used to support the use of 'OBJS' in Makevars, but
	this was changed to 'OBJECTS' in 2001.	The undocumented
	alternative of 'OBJS' has finally been removed.

    o	R CMD check no longer issues a warning about no data sets
	being present if a lazyload db is found (as determined by the
	presence of Rdata.rdb, Rdata.rds, and Rdata.rdx in the 'data'
	subdirectory.


BUG FIXES

    o	charmatch() and pmatch() used to accept non-integer values for
	'nomatch' even though the return value was documented to be
	integer.  Now 'nomatch' is coerced to integer (rather than the
	result being coerced to the type of 'nomatch').

    o	match.call() no longer 'works' outside a function unless
	'definition' is supplied.  (Under some circumstances it used
	to 'work', matching itself.)

    o	The formula methods of boxplot, cdplot, pairs and spineplot
	now attach 'stats' so that model.frame() is visible where
	they evaluate it.

    o	Date-time objects are no longer regarded as numeric by
	is.numeric().

    o	methods("Math") did not work if 'methods' was not attached.

    o	readChar() read an extra empty item (or more than one) beyond
	the end of the source; in some conditions it would terminate
	early when reading an item of length 0.

    o	Added a promise evaluation stack so interrupted promise
	evaluations can be restarted.

    o	R.version[1:10] now nicely prints.

    o	In the methods package, prototypes are now inherited for the
	.Data "slot"; i.e., for classes that contain one of the basic
	data types.

    o	<data frame>[[i, j]] now works if 'i' is character.

    o	write.dcf() no longer writes NA fields (PR#9796), and works
	correctly on empty descriptions.

    o	pbeta(x, log.p = TRUE) now has improved accuracy in many cases,
	and so have functions depending on it such as pt(), pf() and
	pbinom().

    o	mle() had problems with the L-BFGS-B in the no-parameter case
	and consequentially also when profiling 1-parameter models
	(fix thanks to Ben Bolker).

    o	Two bugs fixed in methods that in involve the "..." argument in
	the generic function: previously failed to catch methods that
	just dropped the "..."; and use of callGeneric() with no arguments
	failed in some circumstances when "..." was a formal argument.

    o	sequence() now behaves more reasonably, although not
	back-compatibly for zero or negative input.

    o	nls() now allows more peculiar but reasonable ways of being called,
	e.g., with data=list(<uneven lengths>) or a model without variables.

    o	match.arg() was not behaving as documented when
	several.ok=TRUE (PR#9859), gave spurious warnings when 'arg'
	had the wrong length and was incorrectly documented (exact
	matches are returned even when there is more than one partial
	match).

    o	The data.frame method for split<-() was broken.

    o	The test for -D__NO_MATH_INLINES was badly broken and returned
	true on all non-glibc platforms and false on all glibc ones
	(whether they were broken or not).

    o	LF was missing after the last prompt when --quiet was used without
	--slave. Use --slave when no final LF is desired.

    o	Fixed bug in initialisation code in 'grid' package for
	determining the boundaries of shapes.  Problem reported
	by Hadley Wickham;  symptom was error message:
	"Polygon edge not found".

    o	str() is no longer slow for large POSIXct objects.  Its output
	is also slightly more compact for such objects; implementation
	via new optional argument 'give.head'.

    o	strsplit(*, fixed=TRUE), potentially iconv() and internal string
	formatting is now faster for large strings, thanks to report
	PR#9902 by John Brzustowski.

    o	de.restore() gave a spurious warning for matrices (Ben Bolker)

    o	plot(fn, xlim=c(a,b)) would not set "from" and "to" properly
	when plotting a function.  The argument lists to curve() and
	plot.function() have been modified slightly as part of the
	fix.

    o	julian() was documented to work with POSIXt origins, but did
	not work with POSIXlt ones.  (PR#9908)

    o	Dataset HairEyeColor has been corrected to agree with
	Friendly (2000): the change involves the breakdown of the
	Brown hair / Brown eye cell by Sex, and only totals over Sex
	are given in the original source.

    o	Trailing spaces are now consistently stripped from \alias{}
	entries in .Rd files, and this is now documented.  (PR#9915)

    o	.find.packages(), packageDescription() and sessionInfo()
	assumed that attached environments named "package:foo" were
	package environments, although misguided users could use such
	a name in attach().

    o	spline() and splinefun() with method = "periodic" could return
	incorrect results when length(x) was 2 or 3.

    o	getS3method() could fail if the method name contained a regexp
	metacharacter such as "+".

    o	help(<a character vector>) now uses the name and not the
	value of the vector unless it has length exactly one, so
	e.g. help(letters) now gives help on 'letters'.
	(Related to PR#9927)

    o	Ranges in chartr() now work better in CJK locales, thanks to
	Ei-ji Nakama.




	**************************************************
	*						 *
	*	       2.5 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.5.1 patched

INSTALLATION

    o	doc/manual now includes the texinfo support file epsf.tex which
	basic TeX installations often omit.


BUG FIXES

    o	Attempting to do in-memory serialization of an object requiring
	more than 1Gb might have failed.

    o	Using formals<- on a function whose body was NULL worked
	incorrectly.  (PR#9758)

    o	logb() is now strictly a wrapper for log(), so if S4 methods
	are set on log(), logb() will also dispatch on them.

    o	conflicts(where=) did not work correctly. (PR#9760)

    o	log(x, base) was intended to handle complex 'base' even for
	real 'x', but there was a typo in the code to do so.

    o	Syntax errors would sometimes misreport the error context.

    o	qt(p, df=1) is now also correct for very small p. (PR#9804)
	qt(p, df=2) ditto; also is more accurate for  0 < |p - 0.5| << 1.
	qt(*, log.p=TRUE) now is finite and monotone (again!) where possible.

    o	Several functions including those making use of printCoefmat(),
	layout() and sortedXyData() now work correctly with
	non-default settings of options("OutDec").

    o	S4 method dispatch for group generics (and %*%) failed to pass
	arguments to methods as promises and so in some circumstances
	methods could change their arguments.  (Seen for the 'Math'
	group with package Matrix.)

    o	The print() method for "ts" now handles quarterly and monthly
	series which do not start at the beginning of a quarter or
	month respectively.

    o	Deserializing raw objects saved using save(..., ascii=TRUE)
	now works correctly.

    o	ISOLatin7 encoding for postscript/PDF has been corrected.
	(PR#9845)

    o	rbind(x,y) and cbind(x,y) did not dispatch properly when x and
	y had multiple S3-style classes.

    o	The workaround for seeking on > 2Gb files did not work correctly
	on Unix-alike 32-bit systems.  (PR#9883)

    o	We had identical(NaN, NA_real_) != identical(NA_real_, NaN),
	spotted by Petr Savicky.



		CHANGES IN R VERSION 2.5.1


NEW FEATURES

    o	density(1:20, bw = "SJ") now works as bw.SJ() now tries a larger
	search interval than the default (lower, upper) if it does not
	find a solution within the latter.

    o	The output of library() (no arguments) is now sorted by library
	trees in the order of .libPaths() and not alphabetically.

    o	R_LIBS_USER and R_LIBS_SITE feature possible expansion of
	specifiers for R version specific information as part of the
	startup process.

    o	C-level warning calls now print a more informative context,
	as C-level errors have for a while.

    o	There is a new option "rl_word_breaks" to control the way the
	input line is tokenized in the readline-based terminal
	interface for object- and file-name completion.
	This allows it to be tuned for people who use their space bar
	vs those who do not.  The default now allows filename-completion
	with +-* in the filenames.

    o	If the srcfile argument to parse() is not NULL, it will be added
	to the result as a "srcfile" attribute.

    o	It is no longer possible to interrupt lazy-loading (which was
	only at all likely when lazy-loading environments), which
	would leave the object being loaded in an unusable state.
	This is a temporary measure: error-recovery when evaluating
	promises will be tackled more comprehensively in 2.6.0.


INSTALLATION

    o	'make check' will work with --without-iconv, to accommodate
	building on AIX where the system iconv conflicts with
	libiconv and is not compatible with R's requirements.

    o	There is support for 'DESTDIR': see the R-admin manual.

    o	The texinfo manuals are now converted to HTML with a style
	sheet: in recent versions of makeinfo the markup such as @file
	was being lost in the HTML rendering.

    o	The use of inlining has been tweaked to avoid warnings from
	gcc >= 4.2.0 when compiling in C99 mode (which is the default
	from configure).


BUG FIXES

    o	as.dendrogram() failed on objects of class "dendrogram".

    o	plot(type ="s") (or "S") with many (hundreds of thousands)
	of points could overflow the stack.  (PR#9629)

    o	Coercing an S4 classed object to "matrix" (or other basic class)
	failed to unset the S4 bit.

    o	The 'useS4' argument of print.default() had been broken by an
	unrelated change prior to 2.4.1.  This allowed print() and
	show() to bounce badly constructed S4 objects between
	themselves indefinitely.

    o	Prediction of the seasonal component in HoltWinters() was one
	step out at one point in the calculations.

	decompose() incorrectly computed the 'random' component for a
	multiplicative fit.

    o	Wildcards work again in unlink() on Unix-alikes (they did not
	in 2.5.0).

    o	When qr() used pivoting, the coefficient names in qr.coef() were
	not pivoted to match.  (PR#9623)

    o	UseMethod() could crash R if the first argument was not a
	character string.

    o	R and Rscript on Unix-alikes were not accepting spaces in -e
	arguments (even if quoted).

    o	Hexadecimal integer constants (e.g. 0x10L) were not being parsed
	correctly on platforms where the C function atof did not
	accept hexadecimal prefixes (as required by C99, but not
	implemented in MinGW as used by R on Windows).	(PR#9648)

    o	libRlapack.dylib on Mac OS X had no version information and
	sometimes an invalid identification name.

    o	Rd conversion of \usage treated '\\' as a single backslash in
	all but latex: it now acts consistently with the other
	verbatim-like environments (it was never 'verbatim' despite
	the documentation).

	\code{\.} is now rendered as '\.' in all formats, as
	documented (it was not the case for latex conversion).

	codoc() (and checkDocStyle() and checkDocUsage()) now apply
	the same transformations to \usage as Rd conversion does,
	so {, % and \\ in strings in usages will now be related
	correctly to the help files.

    o	rbind() failed if the only data frame had 0 rows. (PR#9657)

    o	<a data.frame>[i, j] could sometimes select the wrong column
	when j is numeric if there are duplicate column names.

    o	sample(x, size, replace=TRUE, prob) had a memory leak if
	10000 < size <= 100000.

    o	x <- cbind(1:2); rownames(x) <- factor(c("A",NA))  now longer
	segfaults.

    o	R CMD BATCH no longer assumes Sys.unsetenv() is supported (it
	is not on older Solaris systems).

    o	median() returned a logical result when it was 'NA': it now
	returns an NA of appropriate type (e.g. integer or double).

    o	grep(fixed = TRUE, perl = TRUE) ignored 'fixed', although it
	was documented to ignore 'perl'
	Same for [g]regexpr and [g]sub.

    o	getNamespaceExports("base") works again.

    o	runmed(c(), 1) no longer segfaults.

    o	qr.coef(QR, b) failed for an LAPACK-produced QR if b was
	integer or for an over-determined system.

	qr.solve() for an under-determined system produces a
	solution with 0 and not NA for columns which are unused.

    o	segments() was not handling full transparency correctly in PDF.
	(PR#9694)

	Nor was arrows().

    o	callGeneric() inside a method with extra arguments {and hence
	currently defined via .local()} now works.

    o	[g]sub(fixed=TRUE, useBytes=FALSE) could substitute in the
	wrong place in an MBCS locale.

	gregexpr() could give incorrect answers in MBCS locales for
	perl = TRUE or fixed = TRUE (unless useBytes = TRUE).

    o	The legacy quartz() device no longer crashes in locator()
	if the user attempts to close the window.

    o	"CGGStackRestore: gstack underflow" warning is no longer shown
	in legacy quartz() device.

    o	formatC() now limits 'digits' to 50 to avoid problems in
	C-level sprintf in some OSes.

    o	seq.int(x, y, by=z) gave 'x' (and not an error) if
	0 > (y-x)/z > -1.

    o	promptClass() now lists methods, including those for generics in
	other attached packages.

    o	Connection-related functions such as readBin() no longer crash
	when supplied with a non-connection object.

    o	as.character.srcref() didn't handle bad srcref objects cleanly.

    o	predict.nls() no longer requires 'newdata' to contain exactly
	the variable names needed to fit the model: variables used on
	the LHS only are no longer required and further variables are
	allowed.

    o	plot.hclust() had a 'out by one' error, and ignored the last
	object when computing the window region (and could overrun
	arrays).

    o	deriv() was creating results with double (and not integer) dims.

    o	The unserialize code (e.g. as called by load()) looked for a
	function findPackageEnv() to set a saved package environment.
	This was missing, but is now supplied.

    o	[cr]bind could segfault when creating a list matrix result.
	(Reported by Martin Morgan.)

    o	besselI(x, nu, exp=TRUE) and besselY(x, nu) could give wrong
	answers for nu < 0. (Reported by Hiroyuki Kawakatsu.)

    o	[g]sub could confuse a trailing byte '\' for a backreference
	in MBCSs where '\' can occur as a trailing byte (not UTF-8 nor
	EUC-JP, but SJIS and the CJK character sets used on Windows).
	(PR#9751)



		CHANGES IN R VERSION 2.5.0


USER-VISIBLE CHANGES

    o	apropos(x) and find(x) now both only work for character 'x',
	and hence drop all non-standard evaluation behaviour.

    o	Data frames can have 'automatic' row names which are not
	converted to dimnames by as.matrix().  (Consequently, e.g.,
	t(.)  for such data frames has NULL column names.)  This
	change leads to memory reductions in several places, but can
	break code which assumes character dimnames for data frames
	derived from matrices.

	No existing R object is regarded as having 'automatic' row
	names, and it may be beneficial to recreate such objects via
	read.table() or data.frame().

    o	Using $ on an atomic vector now raises a warning, as does use
	on an S4 class for which a method has not been defined.

    o	The Unix-alike readline terminal interface now does
	command-completion for R objects, incorporating the
	functionality formerly in package 'rcompletion' by Deepayan
	Sarkar.	 This can be disabled by setting the environment
	variable R_COMPLETION=FALSE when starting R (e.g. in
	~/.Renviron).  (Note that when this is enabled, filename
	completion no longer works for file paths containing R
	operators such as '+' and '-'.)


NEW FEATURES

    o	abbreviate() no longer has an 8191 byte limit on the size of
	strings it can handle.

    o	abs(x) now returns integer for integer or logical arguments.

    o	apropos() has a new argument 'ignore.case' which defaults to
	TRUE, potentially matching more than previously, thanks to a
	suggestion by Seth Falcon.

    o	args(), str() and print() now give the argument lists of primitive
	functions.

    o	as.matrix() gains the '...' argument that several packages have
	assumed it always had (and S-PLUS has).

    o	Manipulation of integers as roman numerals via as.roman() in
	package utils.

    o	attr() no longer treats name = NA_character_ as meaning
	name = "NA".

    o	binom.test() now allows a 'fuzz' for calculated integer values
	in its x and n arguments.

    o	boxplot(*, notch = TRUE) now warns when notches are outside
	hinges; related to PR#7690.

    o	New function callCC() providing a downward-only version of
	Scheme's call with current continuation.

    o	capabilities() now has a "profmem" entry indicating whether
	R has been compiled with memory profiling.

    o	colnames<-() and rownames<-() now handle data frames explicitly,
	so calling colnames<- on a data frame no longer alters the
	representation of the row names.

    o	commandArgs() has a new 'trailingOnly' argument to be used in
	conjunction with --args.

    o	contour() now passes graphical parameters in '...' to axis()
	and box().

    o	New data set 'crimtab' on Student(1908)'s 3000 criminals.

    o	cut.default() has a new argument 'ordered_result'.

    o	.deparseOpts() has two new options: "keepNA" to ensure that
	different types (logical, integer, double, character and
	complex) of NAs are distinguished, and "S_compatible" to
	suppress the use of R-specific features such as 123L and to
	deparse integer values of a double vector with a trailing
	decimal point.

	The 'keepInteger' option now uses the suffix 'L' rather than
	as.integer() where possible (unless all entries are NA or
	"S_compatible" is also set).

	Other deparse options can now be added to "all" (which has not
	for some time actually switched on all options).

	Integer sequences m:n are now deparsed in that form.

    o	deparse() and dput() now include "keepInteger" and "keepNA" in
	their defaults for the 'control' argument.

    o	detach() now takes another argument, unload, which indicates
	whether or not to unload the package and then only cleans
	up the S4 methods if the package successfully unloads.

    o	There are new constants NA_integer_, NA_real_, NA_complex_ and
	NA_character_ to denote NAs of those types, and they will be
	used in deparsing in place of as.integer(NA) etc unless
	.deparseOpts() includes "S_compatible".

    o	dev.print() now recognizes 'screen devices' as all those with
	an enabled display list, rather than a hard-coded set.

    o	Objects of class "difftime" are now handled more flexibly. The
	units of such objects can now be accessed via a units()
	function, which also has a replacement form, and there are
	conversion methods to and from numeric, which also allow the
	specification of units.	 Objects of this class can also be
	stored in data frames now.  A format() method has been added,
	and the print method was revised.

    o	New function environmentName() to give the print name of
	environments such as "namespace:base".
	This is now used by str().

    o	New function env.profile() provides R level access to summary
	statistics on environments.  In a related patch, new.env()
	now allows the user to specify an initial size for a hashed
	environment.

    o	file() can read the X11 clipboard selection as "X11_clipboard"
	on suitable X11-using systems.

    o	file("stdin") is now recognized, and refers to the process's
	'stdin' file stream whereas stdin() refers to the console.
	These may differ, for example for a GUI console, an embedded
	application of R or if --file= has been used.

    o	file_test() is now also available in package utils.
	(It is now private in package tools.)

    o	file.show() gains an 'encoding' argument.

    o	New functions formatUL() and formatOL() in package utils for
	formatting unordered (itemize) and ordered (enumerate) lists.

    o	The statistics reported when gcinfo(TRUE) are now of the amounts
	used (in Mb) and not of the amounts free (which are not really
	relevant when there are no hard limits, only gc trigger points).

    o	New function get_all_vars() to retrieve all the
	(untransformed) variables that the default method of
	model.frame() would use to create the model frame.

    o	interaction() has a new argument 'lex.order'.

    o	initialize() (in methods) now tries to be smarter about
	updating the new instance in place, thereby reducing
	copying.

    o	install.packages(dependencies = NA) is a new default, which is
	to install essential dependencies when installing from
	repositories to a single library.  As a result of this change,
	update.packages() will install any new dependencies of the
	packages it is updating (alongside the package in the same
	library tree).

	If 'lib' is not specified or is specified of length one and
	the chosen location is not a writable directory,
	install.packages() offers to create a personal library
	directory for you if one does not already exist, and to
	install there.

    o	is.atomic, is.call, is.character, is.complex, is.double (== is.real),
	is.environment, is.expression, is.function, is.integer,
	is.list, is.logical, is.null, is.object, is.pairlist,
	is.recursive, is.single and is.symbol (== is.name) are no
	longer internally S3 generic, nor can S4 methods be written
	for them.

	The "factor" methods of is.integer and is.numeric have been
	replaced by internal code.

    o	Added is.raw() for completeness.

    o	l10n_info() also reports if the current locale is Latin-1.

    o	levels<-(), names() and names<-() now dispatch internally for
	efficiency and so no longer have S3 default methods.

    o	.libPaths() now does both tilde and glob expansion.

    o	Functions lm(), glm() loess(), xtabs() and the default method
	of model.frame() coerce their 'formula'	argument (if supplied)
	to a formula.

    o	max(), min() and range() now work with character vectors.

    o	message() has a new argument 'appendLF' to handle messages
	with and without newlines.  There is a new message class
	packageStartupMessage() that can be suppressed separately.

    o	A new function, method.skeleton() writes a skeleton version of
	a call to setMethod() to a file, with correct arguments and
	format, given the name of the function and the method signature.

    o	mode<- and storage.mode<- do slightly less copying.

    o	nls.control(* , printEval = FALSE, warnOnly = FALSE) are two new
	options to help better analyze (non-)convergence of nls(),
	thanks to Kate Mullen.

	nls() and summary(nls()) now contain more information and also
	print information about convergence.

    o	options(device = ) now accepts a function object as well as
	the name of a function.

    o	pdf() supports new values for 'paper' of "US" (same as
	"letter"), "a4r" and "USr" (the latter two meaning rotated to
	landscape).  postscript() also accepts paper = "US".

    o	persp() now respects the graphical pars 'cex.axis', 'cex.lab',
	'font.axis' and 'font.lab'.

    o	New faster internal functions pmax.int() and pmin.int() for
	inputs which are atomic vectors without classes (called by
	pmax/pmin where applicable).

	pmin/pmax are now more likely to work with classed objects:
	they work with POSIXlt datetimes, for example.

    o	postscript() now by default writes grey colors (including black
	and white) via 'setgray', which gives more widely acceptable
	output.	 There are options to write pure RGB, CMYK or gray via
	the new argument 'colormodel'.

    o	rbind.data.frame() now ignores all zero-row inputs, as well as
	zero-column inputs (which it used to do, undocumented).	 This
	is because read.table() can create zero-row data frames with
	NULL columns, and those cannot be extended.

    o	readChar() and writeChar() can now work with a raw vector.

    o	read.table(), write.table() and allies have been moved to package
	utils.

    o	rgb() now accepts the red, green and blue components in a
	single matrix or data frame.

    o	New utility function RShowDoc() in package 'utils' to find and
	display manuals and other documentation files.

    o	New .row_names_info() utility function finds the number of rows
	efficiently for data frames; consequently, dim.data.frame()
	has become very fast for large data frames with 'automatic'
	row names.

    o	RSiteSearch() now also allows to search postings of the 'R-devel'
	mailing list.

    o	screeplot() is now (S3) generic with a default method, thanks
	to a patch from Gavin Simpson.

    o	Experimental 'verbose' argument for selectMethod().  Might be
	replaced later by a better interface for method selection
	inspection.

    o	Added links to source files to the parsing routines, so that
	source() can now echo the original source and comments (rather
	than deparsing).  This affects example() and Sweave() as well.

    o	stack() and unstack() have been moved to package utils.

    o	strptime() now sets the "tzone" attribute on the result if
	tz != "".

    o	str.default() typically prints fewer entries of logical vectors.

    o	The RweaveLatex driver for Sweave() now supports two new
	options: expand=FALSE, to show chunk references in the output,
	and concordance=TRUE, to output the concordance between input
	and output lines.

    o	system() now takes the same set of arguments on all platforms,
	with those which are not applicable being ignored with a
	warning.  Unix-alikes gain 'input' and 'wait', and Windows
	gains 'ignore.stderr'.

    o	system.time() and proc.time() now return an object of class
	"proc_time" with a print() method that returns a POSIX-like
	format with names.

    o	Sys.getenv() has a new argument 'unset' to allow unset and set
	to "" to be distinguished (if the OS does).  The results of
	Sys.getenv() are now sorted (by name).

    o	New function Sys.glob(), a wrapper for the POSIX.2 function
	glob(3) to do wildcard expansion (on systems which have it,
	plus an emulation on Windows).

    o	Sys.setenv() is a new (and preferred) synonym for Sys.putenv().
	The internal C code uses the POSIX-preferred 'setenv' rather
	than 'putenv' where the former is available.

    o	New function Sys.unsetenv() to remove environment variables
	(on systems where unsetenv is implemented or putenv can remove
	variables, such as on Windows).

    o	text(), mtext(), strheight(), strwidth(), legend(), axis(),
	title(), pie(), grid.text() and textGrob() all attempt to
	coerce non-language annotation objects (in the sense of is.object)
	to character vectors.  This is principally intended to cover
	factors and POSIXt and Date objects, and is done via the
	new utility function as.graphicsAnnot() in package grDevices.

    o	tcltk:tk_select.list() now chooses the width to fit the widest item.

    o	{re,un}tracemem() are now primitives for efficiency and so
	migrate from 'utils' to 'base'.

    o	union(), interect(), setdiff() and setequal() now coerce their
	arguments to be vectors (and they were documented only to
	apply to vectors).

    o	uniroot() now works if the zero occurs at one of the ends of
	the interval (suggestion of Tamas Papp).

    o	There is a new function View() for viewing matrix-like
	objects in a spreadsheet, which can be left up whilst R is
	running.

    o	New function withVisible() allows R level access to the
	visibility flag.

    o	zip.file.extract() has been moved to package utils.


    o	A few more cases of subassignment work, e.g. <raw>[] <- <list>
	and <vector>[] <- <expression>, with suitable coercion of the LHS.

    o	There is a warning if \ is used unnecessarily in a string when
	being parsed, e.g. "\." where probably "\\." was intended.
	("\." is valid, but the same as ".".)  Thanks to Bill Dunlap
	for the suggestion.

    o	Introduced the suffix L for integer literals to create
	integer rather than numeric values, e.g. 100L, 0x10L, 1e2L.

    o	Set the parser to give verbose error messages in case of
	syntax errors.

    o	The class "LinearMethodsList" has been extended and will be
	used to create list versions of methods, derived from the
	methods tables (environments).	The older recursive
	"MethodsList" class will be deprecated (by the release of
	2.5.0 if possible).

    o	There are more flexible ways to specify the default library
	search path.  In addition to R_LIBS and .Library, there are
	.Library.site (defaults to R_HOME/site-library) and
	R_LIBS_USER (defaults to a platform- and version-specific
	directory in ~/R).  See ?.libPaths for details.

    o	LAPACK has been updated to version 3.1.0.  This should cause
	only small changes to the output, but do remember that the sign
	of eigenvectors (and principal components) is indeterminate.

    o	PCRE has been updated to version 7.0.

    o	Several functions handle row names more efficiently:

	- read.table() and read.DIF() make use of integer row names
	  where appropriate, and avoid at least one copy in assigning
	  them.

	- data.frame() and the standard as.data.frame() methods avoid
	  generating long dummy row names and then discarding them.

	- expand.grid() and merge() generate compact 'automatic' row
	  names.

	- data.matrix() and as.matrix.data.frame() have a new argument
	  'rownames.force' that by default drops 'automatic' row names.

    o	<data frame>[i, j] is substantially more memory-efficient when
	only a small part of the data frame is selected, especially
	when (part of) a single column is selected.

    o	Command-line R (and Rterm.exe under Windows) accepts the options
	'-f filename', '--file=filename' and '-e expression' to follow
	other script interpreters.  These imply --no-save unless
	--save is specified.

    o	Invalid bytes in character strings in an MBCS now deparse/print
	in the form "\xc1" rather than "<c1>", which means they can be
	parsed/scanned.

    o	Printing functions (without source attributes) and expressions
	now preserves integers (using the L suffix) and NAs (using
	NA_real_ etc where necessary).

    o	The 'internal' objects .helpForCall, .tryHelp and topicName are
	no longer exported from 'utils'.

    o	The internal regex code has been upgraded to glibc 2.5 (from 2.3.6).

    o	Text help now attempts to display files which have an \encoding
	section in the specified encoding via file.show().

    o	R now attempts to keep track of character strings which are
	known to be in Latin-1 or UTF-8 and print or plot them
	appropriately in other locales.	 This is primarily intended
	to make it possible to use data in Western European languages
	in both Latin-1 and UTF-8 locales.  Currently scan(),
	read.table(), readLines(), parse() and source() allow
	encodings to be declared, and console input in suitable
	locales is also recognized.

	New function Encoding() can read or set the declared encodings
	for a character vector.

    o	There have been numerous performance improvements to the data
	editor on both Windows and X11.	 In particular, resizing the
	window works much better on X11.

    o	Packages graphics and grid no longer require grDevices, as
	they might be used only with third-party devices.


DEPRECATED & DEFUNCT

    o	symbol.C() and symbol.For() are defunct, and have been replaced
	by wrappers that give a warning.

    o	Calling a builtin function with an empty argument is now always
	an error.

    o	The autoloading of ts() is defunct.

    o	The undocumented reserved word GLOBAL.ENV has been removed.
	(It was yet another way to get the value of the symbol
	.GlobalEnv.)

    o	The deprecated behaviour of structure() in adding a class when
	specifying with "tsp" or "levels" attributes is now defunct.

    o	unix() is now finally defunct, having been deprecated for
	at least seven years.

    o	Sys.putenv() is now deprecated in favour of Sys.setenv(),
	following the POSIX recommendation.

    o	Building R with --without-iconv is deprecated.

    o	Using $ on an atomic vector is deprecated (it was previously
	valid and documented to return NULL).

    o	The use of storage.mode<- for other than standard types (and
	in particular for value "single") is deprecated: use mode<-
	instead.


INSTALLATION

    o	A suitable iconv (e.g. from glibc or GNU libiconv) is
	required.  For 2.5.x only you can build R without it by
	configuring using --without-iconv.

    o	There is support again for building on AIX (tested on 5.2 and 5.3)
	thanks to Ei-ji Nakama.

    o	Autoconf 2.60 or later is used to create 'configure'.  This
	makes a number of small changes, and incorporates the changes
	to the detection of a C99-compliant C compiler backported for
	2.4.1.

    o	Detection of a Java development environment was added such that
	packages don't need to provide their own Java detection. Newly
	added make variables are JAVAC, JAVAH, JAR and JAVA_CPPFLAGS.

	R CMD javareconf was updated to look for the corresponding
	Java tools as well.

	In addition, Java detection honors user-supplied environment
	variables JAVA_CPPFLAGS, JAVA_LIBS and JAVA_LD_LIBRARY_PATH.

    o	Added workaround for reported non-POSIX sh on OSF1.  (PR#9375)

    o	'make install-strip' now works, stripping the executables and
	also the shared libraries and modules on platforms where
	'libtool' knows how to do so.

    o	Building R as a shared library and standalone nmath now
	installs pkg-config files 'libR.pc' and 'libRmath.pc' respectively.

    o	Added test for insufficiently complete implementation of sigaction.


C-LEVEL FACILITIES

    o	Functions str2type, type2char and type2str are now available in
	Rinternals.h.

    o	Added support for Objective C in R and packages (if available).

    o	R_ParseVector() has a new 4th argument 'SEXP srcfile' allowing
	source references to be attached to the returned expression list.

    o	Added ptr_R_WriteConsoleEx callback which allows consoles to
	distinguish between regular output and errors/warnings.
	To ensure backward compatibility it is only used if
	ptr_R_WriteConsole is set to NULL.


UTILITIES

    o	Additional Sweave() internal functions are exported to help
	writing new drivers, and RweaveLatexRuncode() is now created
	using a helper function (all from a patch submitted by Seth
	Falcon).

    o	The following additional flags are accessible from R CMD config:
	OBJC, OBJCFLAGS, JAR, JAVA, JAVAC, JAVAH, JAVA_HOME, JAVA_LIBS
	and JAVA_CPPFLAGS.

    o	R CMD build now takes the package name from the DESCRIPTION
	file and not from the directory.  (PR#9266)

    o	checkS3methods() (and hence R CMD check) now checks agreement
	with primitive internal generics, and checks for additional
	arguments in methods where the generic does not have a '...'
	argument.

	codoc() now knows the argument lists of primitive functions.

    o	R CMD INSTALL and R CMD REMOVE now use as the default library
	(if -l is not specified) the first library that would be used
	if R were run in the current environment (and they run R to
	find it).

    o	There is a new front-end Rscript which can be used for #!
	scripts and similar tasks.  See help("Rscript") and 'An
	Introduction to R' for further details.

    o	R CMD BATCH (not Windows) no longer prepends
	'invisible(options(echo = TRUE))' to the input script.	This
	was the default unless --slave is specified and the latter is
	no longer overridden.

	On all OSes it makes use of the -f argument to R, so
	file("stdin") can be used from BATCH scripts.

	On all OSes it reports proc.time() at the end of the script
	unless q() is called with options to inhibit this.

    o	R CMD INSTALL now prepends the installation directory (if
	specified) to the library search path.

    o	Package installation now re-encodes R files and the NAMESPACE
	file if the DESCRIPTION file specifies an encoding, and sets
	the encoding used for reading files in preparing for
	LazyData.  This will help if a package needs to be used in
	(say) both latin1 and UTF-8 locales on different systems.

    o	R CMD check now reports on non-ASCII strings in datasets.
	(These are a portability issue, which can be alleviated by
	marking their encoding: see 'Writing R Extensions'.)

    o	Rdiff now converts CRLF endings in the target file, and
	converts UTF-8 single quotes in either to ASCII quotes.

    o	New recommended package 'codetools' by Luke Tierney provides
	code-analysis tools.  This can optionally be used by 'R CMD
	check' to detect problems, especially symbols which are not
	visible.

    o	R CMD config now knows about LIBnn .

    o	New recommended package 'rcompgen' by Deepayan Sarkar
	provides support for command-line completion under the Unix
	terminal interface (provided readline is enabled) and the
	Windows Rgui and Rterm front ends.


BUG FIXES

    o	gc() can now report quantities of 'Vcells' in excess of 16Gb on
	64-bit systems (rather than reporting NA).

    o	Assigning class "factor" to an object now requires it has
	integer (and not say double) codes.

    o	structure() ensures that objects with added class "factor" have
	integer codes.

    o	The "formula" and "outer" attributes of datasets 'ChickWeight',
	'CO2', 'DNase', 'Indometh', 'Loblolly', 'Orange' and 'Theoph'
	now have an empty environment and not the environment used to
	dump the datasets in the package.

    o	Dataset 'Seatbelts' now correctly has class c("mts", "ts").

    o	str() now labels classes on data frames more coherently.

    o	Several 'special' primitives and .Internals could return
	invisibly if the evaluation of an argument led to the
	visibility flag being turned off.  These included
	as.character(), as.vector(), call(), dim(), dimnames(),
	lapply(), rep(), seq() and seq_along().	 Others (e.g. dput()
	and print.default()) could return visibly when this was not
	intended.

    o	Several primitives such as dim() were not checking the number
	of arguments supplied before method dispatch.

    o	Tracing of primitive functions has been corrected.  It should
	now be the case that tracing either works or is not allowed
	for all primitive functions. (Problems remain if you make a
	primitive into a generic when it is being traced.  To be fixed
	later.)

    o	max.col() now omits infinite values in determining the
	relative tolerance.

    o	R CMD Sweave and R CMD Stangle now respond to --help and --version
	like other utilities.

    o	.libPaths() adds only existing directories (as it was
	documented to, but could add non-directories).

    o	setIs() and setClassUnion() failed to find some existing
	subclasses and produced spurious warnings, now fixed.

    o	data.frame() ignored 'row.names' for 0-column data frames, and
	no longer treats an explicit row.names=NULL differently from
	the default value.

    o	identical() looked at the internal structure of the
	'row.names' attribute, and not the value visible at R level.

    o	abline(reg) now also correctly works with intercept-only lm
	models, and abline() warns more when it's called illogically.

    o	warning() was truncating messages at
	getOption("warning.length") - 1 (not as documented), with no
	indication.  It now appends '[... truncated]'.

    o	Stangle/Sweave were throwing spurious warnings if options
	'result' or 'strip.white' were unset.

    o	all.equal() was ignoring 'check.attributes' for list and
	expression targets, and checking only attributes on raw vectors.
	Logical vectors were being compared as if they were numeric,
	(with a mean difference being quoted).

    o	Calculating the number of significant digits in a number was
	itself subject to rounding errors for digits >= 16.  The
	calculation has been changed to err on the side of slightly
	too few significant digits (but still at least 15) rather than
	far too many.  (An example is print(1.001, digits=16).)

    o	unlink() on Unix-alikes failed for paths containing spaces.

    o	substr() and friends treated NA 'start' or 'stop' incorrectly.

    o	merge(x, y, all.y = TRUE) would sometimes incorrectly return
	logical columns for columns only in y when there were no
	common rows.

    o	read.table(fn, col.names=) on an empty file returned NULL
	columns, rather than logical(0) columns (which is what results
	from reading a file with just a header).

    o	grid.[xy]axis(label=logical(0)) failed.

    o	expression() was unnecessarily duplicating arguments.

    o	as.expression(<list>) returned a single-element expression
	vector, which was not compatible with S: it now copies lists
	element-by-element.

    o	supsmu(periodic = TRUE) could segfault.	 (PR#9502, detection
	and patch by Bill Dunlap.)

    o	pmax/pmin called with only logical arguments did not coerce to
	numeric, although they were documented to do so (as max/min
	do).

    o	methods() did not know that cbind() and rbind() are internally
	generic.

    o	dim(x) <- NULL removed the names of x, but this was always
	undocumented.  It is not clear that it is desirable but it is
	S-compatible and relied on, so is now documented.

    o	which(x, arr.ind = TRUE) did not return a matrix (as
	documented) if 'x' was an array of length 0.

    o	C-level duplicate() truncated CHARSXPs with embedded nuls.

    o	Partial matching of attributes was not working as documented
	in some cases if there were more than two partial matches or
	if "names" was involved.

    o	data(package=character(0)) was not looking in ./data as
	documented.

    o	summary.mlm() failed if some response names were "" (as can
	easily happen if cbind() is used).

    o	The postscript() and pdf() drivers shared an encoding list
	but used slightly different formats.  This caused problems if
	both were used with the same non-default encoding in the same
	session.  (PR#9517)

    o	The data editor was not allowing Inf, NA and NaN to be entered
	in numerical columns.  It was intended to differentiate
	between empty cells and NAs, but did not do so: it now does
	so for strings.

    o	supsmu() could segfault if all cases had non-finite values.
	(PR#9519)

    o	plnorm(x, lower.tail=FALSE) was returning the wrong tail for
	x <= 0.	 (PR#9520)

    o	which.min() would not report a minimum of +Inf, and
	analogously for which.max().  (PR#9522)

    o	'R CMD check' could fail with an unhelpful error when checking
	Rd files for errors if there was only one file and that had a
	serious error.	(PR#9459)

    o	try() has been reimplemented using tryCatch() to solve two
	problems with the original implementation: (i) try() would run
	non-NULL options("error") expressions for errors within a try, and
	(ii) try() would catch user interrupts.

    o	str(obj) could fail when obj contained a dendrogram.

    o	Using <data frame>[, <last column>] <- NULL failed (PR#9565)

    o	choose(n, k) could return non-integer values for integer n and
	small k on some platforms.

    o	nclass.scott(x) and nclass.FD(x) no longer return NaN when var(x)
	or IQR(x) (respectively) is zero.

	hist() now allows breaks = 1 (which the above patch will
	return), but not breaks = Inf (which gave an obscure error).

    o	strptime("%j") now also works for the first days of Feb-Dec.
	(PR#9577)

    o	write.table() now recovers better if 'file' is an unopened
	connection.  (It used to open it for both the column names and
	the data.)

    o	Fixed bug in mosaicplot(sort=) introduced by undocumented
	change in R 2.4.1 (changeset r39655).

    o	contr.treatment(n=0) failed with a spurious error message.
	(It remains an error.)

    o	as.numeric() was incorrectly documented: it is identical to
	as.double.

    o	jitter(rep(-1, 3)) gave NaNs. (PR#9580)

    o	max.col() was not random for a row of zeroes. (PR#9542)

    o	ansari.test(conf.int=TRUE, exact=FALSE) failed.

    o	trace() now works on S3 registered methods, by modifying the
	version in the S3 methods table.

    o	rep(length=1, each=0) segfaulted.

    o	postscript() could overflow a buffer if used with a long
	'command' argument.

    o	The internal computations to copy complete attribute lists did
	not copy the flag marking S4 objects, so the copies no longer
	behaved like S4 objects.

    o	The C code of nlminb() was altering a variable without
	duplicating it.	 (This did not affect nlminb() but would have
	if the code was called from a different wrapper.)

    o	smooth(kind = "3RS3R") (the current default) used .C(DUP =
	FALSE) but altered its input argument.	(This was masked by
	duplication in as.double.)

    o	The signature for the predefined S4 method for as.character()
	was missing '...' .

    o	readBin(<raw vector>) could read beyond the end of the vector
	when size-changing was involved.

    o	The C entry point PrintValue (designed to emulate auto-printing)
	would not find show() for use on S4 objects, and did not have
	the same search path (for show(), print() and print() methods)
	as auto-printing.  Also, auto-printing and print() of S4
	objects would fail to find 'show' if the methods name space was
	loaded but the package was not attached (or otherwise not in
	the search path).

    o	print() (and auto-printing) now recognize S4 objects even when
	'methods' is not loaded, and print a short summary rather than
	dump the internal structure.

    o	Sweave and Stangle had problems due to partial matching of code
	chunk names when run with split=TRUE.

    o	install.packages() on a source package now ensures that
	R CMD INSTALL sees the same library search path as
	install.packages() did when computing dependencies.

    o	density() now ensures its 'y' values are non-negative. (PR#8876)

    o	is.finite() and is.infinite() (and many other primitives)
	are not internally generic and so do not support S4 methods,
	which can no longer be set. (PR#7951)

    o	nls(algorithm = "port") now accepts a list 'start' argument,
	as for the other methods (and as documented).

    o	Standard errors from the "ar" method of predict() could be
	wrong for the last p predictions for models near
	non-stationarity. (PR#9614)




	**************************************************
	*						 *
	*	       2.4 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.4.1 patched

NEW FEATURES

    o	The Simplified Chinese translations have been completed.


BUG FIXES

    o	co.intervals() sometimes failed to cover the largest value.

    o	tempfile() is now random across sessions as well as within a
	session.  (On some systems it would give the same hex suffix
	at the start of each session.)

    o	Added infinite recursion test to internal function isMissing.
	(PR#9426)

    o	The "Date" and "POSIXt" methods for cut() were not choosing
	the first day of the year for breaks = "years".
	(In part, PR#9433.)

    o	R is now able to deparse/print invalid multibyte strings in
	MBCS locales (such as UTF-8) using hex escapes.	 This means
	that e.g. demo(Hershey) works in all such locales.

    o	optimize() could give incorrect answers in some rare problems
	with exact symmetry about the midpoint of the interval
	supplied.  (PR#9438)

    o	The residuals from an lm() fit with no coefficients but an
	offset were incorrect.

    o	oneway.test() was expecting a literal formula and did not
	accept a variable containing a formula.

    o	The legacy Quartz device (used by console R) displayed its
	window outside the screen estate in some dual-head setups.
	Now it will be always displayed in the center of the main
	screen.

    o	read.ftable() was not functional on non-seekable connections
	such as URLs.

    o	Some large memory allocations could cause segfaults or
	crashes (e.g. followup to PR#9557).

    o	Sweave() would drop characters from the end of chunk names
	ending in "R".	(PR#9567)

    o	library(), i.e. its internal checkConflicts(), now (again) prints
	"The following object(s) are masked .." only once per masked package.

    o	methods:::cbind(x) {one argument} now works, calling cbind2(x)
	when 'x' is an S4 object.



		CHANGES IN R VERSION 2.4.1


INSTALLATION

    o	The extraction of info from Subversion for an SVN checkout now
	also works for svn >= 1.4.0.  However, on Windows the 'Last
	Changed Date' will be in the local timezone, and not in GMT as
	previously.

    o	configure uses code borrowed from autoconf 2.60 to try harder to
	ensure that a C99-compliant compiler is used.  (It does so by
	appending to CC.)  This avoids problems with systems such as FC5
	which override CFLAGS and thereby lose flags such as -std=gnu99.


NEW FEATURES

    o	rainbow(), heat.colors(), terrain.colors(), topo.colors() and
	cm.colors() all gain an 'alpha' argument to be passed to hsv().

    o	dput() will give an incorrect representation of the row names
	of a data frame with integer row names.	 This is now corrected
	when the object is recreated.


C-LEVEL FACILITIES

    o	Using STRICT_R_HEADERS applies to more reported clashes with
	Windows headers, including Calloc and Realloc.	These and
	Free need to be prefixed by R_ when STRICT_R_HEADERS is defined.


DEPRECATED & DEFUNCT

    o	The previously undocumented behaviour of structure() in adding a
	class when specifying "tsp" or "levels" attributes is now
	deprecated (with a warning).


BUG FIXES

    o	Fixed warning() to use .dfltWarn intead of .dfltStop for default
	handling (PR#9274).

    o	R would slow down when the product of the length of a vector and
	the length of a character vector used to subset it exceeded 2^31.
	(PR#9280)

    o	merge() now allows zero-row data frames.

    o	add1.lm() had been broken by other changes for weighted fits.

    o	axis.POSIXct() would sometimes give the wrong labels.

    o	Help for a method call would fail. (PR#9291)

    o	gzfile() returned an object of class "file" not "gzfile". (PR#9271)

    o	load()ing from a connection had a logic bug in when it closed
	the connection. (PR#9271)

    o	The lowess() algorithm is unstable if the MAD of the residuals
	becomes (effectively) zero: R now terminates the iterations at
	that point.  (This may result in quite different answers.)

	The 'delta' argument was incorrectly documented.  (PR#9264)

    o	abbreviate() would only work for strings of up to 8191 bytes,
	but this was not checked.  Now longer strings are errors.

    o	Drawing X11 rotated text was buggy for VERY small (negative)
	angle of rotation.  Reported by Ben Bolker. (PR#9301)

    o	The X11 data editor would crash in an MBCS locale if R was
	compiled with FC's CFLAGS that add buffer overflow and
	stack-smashing detection.

    o	rect() was not accepting border=NA in some cases involving
	cross-hatching.

    o	Fixes to S4 group generics to ensure that the correct number of
	active arguments are in the signature of the group and all
	members.  Also a fix to keep the 'groupMembers' slot up to date.

    o	S4 group generic "Logic" (with '&', '|', but not '!') has been
	created, following the green book (apart from '!').

    o	removeClass() now takes care to remove any subclass references
	to the deleted class.

    o	mle() (in stats4) might not have worked as intended when the
	order of parameters in 'start' differed from that in the
	log-likelihood.	 (PR#9313)

    o	dotchart() now properly restores par() settings after itself.

    o	system() on Mac OS X was blocking arbitrary signals during the
	call although only SIGPROF was meant to be blocked.

    o	methods cached via callNextMethod() and (sometimes) as() were
	being cached as directly specified although in fact they were
	inherited.  Caused problems in later search for inherited methods.

    o	str() works properly for method definitions and other S4-classed
	function objects.

    o	JAVA_LIBS are now set correctly on MacOS X.

    o	Fix null-termination issue suspected of causing crash with Fedora
	Extra RPMS (PR#9339, Justin Harrington, analysis and fix from Bill
	Dunlap).

    o	Name spaces restored via a saved session silently failed to cache
	their methods because the methods package was not yet
	attached.  Fixed by attaching methods before restoring data.

    o	rbind()ing a list to a data frame generated invalid row names,
	which were an error in 2.4.0. (PR#9346)

    o	boxplot.stats(x) now returns the correct minimum instead of an
	error for x <- c(1,Inf,Inf,Inf), and hence boxplot(x) "works".

    o	promptClass() now uses \linkS4class{<ClassName>} instead of
	of \link{<ClassName>-class}.

    o	gc() no longer reports nonsense values for the number of used
	Vcells if the true value exceeds 2^31 (and hence over 16Gb of
	heap is in use): it now reports NA. (PR#9345)

    o	rapply() now detects more user errors in supplying arguments. (PR#9349)

    o	boxplot() was ignoring argument 'boxfill'. (PR#9352)

    o	plot.lm(which = 6, id.n = 0) did not work. (PR#9333)

    o	.deparseOpts("delayPromises") was not matching the C code,
	returning 64 rather than 32.

    o	bxp() could use partial matching on 'pars' when finding
	defaults for some of its parameters, e.g. a setting of 'cex.axis'
	in 'pars' or inline was used to set a default for 'outcex'.

    o	acf() now allows lag.max = 0 except when type="partial", and
	forces the lag 0 autocorrelation to 1. (PR#9360)

    o	hist(*, include.lowest=., right=., plot=FALSE) does not warn
	anymore, (PR#9356) and more.

    o	Some bugs in caching superclass/subclass relations and in
	removing those relations on detach and on removeClass() have
	been fixed.

    o	readBin() could return one too many strings if 'n' was an
	over-estimate. (PR#9361)

    o	A request for an opaque colour in the pdf() device after a
	translucent one did not set the transparency back to opaque in
	2.4.0.

	Semi-transparent background colours were not being plotted on
	the pdf() device.

    o	plot.lm(which=5) in the case of constant leverage re-ordered
	the factor levels but not the residuals, so the labelling by
	factor level was often incorrect.

    o	packBits() was not accepting a logical argument. (PR#9374)

    o	make install was omitting doc/FAQ and doc/RESOURCES.

    o	A two-sample t.test(x, y, var.equal=TRUE) did not allow one of the
	groups to be of size one.

    o	The "ts" method for print() failed on some corrupted objects
	of class "ts", e.g. those without a "tsp" attribute.

    o	structure() reordered the "class" value given if there was a
	"tsp" value specified.

    o	pairs() now does pass appropriate parts of '...' to the
	'diag.panel' argument. (PR#9384)

    o	plot.lm() was using an incorrect estimate of dispersion for
	some GLMs (including family=binomial and family=poisson).
	(PR#9316)

    o	Subsetting operators were setting R_Visible too early, so
	assignments in arguments could make the result invisible.
	(PR#9263)

    o	The tk-GUI was displaying a warning due to an extra comma in
	the list of manuals (PR#9396)

    o	packageDescription() now gives an explicit error on a corrupt
	DESCRIPTION file.

    o	There was a scoping issue with tcltk callbacks given as
	unevaluated expressions. This has only been partially fixed, a
	complete fix probably requires redesign.

    o	trace() had its return value documented incorrectly and was
	sometimes visible when it should not have been.

    o	pchisq() would sometimes use the wrong tail when calculating
	non-central probabilities with lower.tail = FALSE. (PR#9406)

    o	rm() could remove the wrong objects when passed an expression.
	(PR#9399)  Now only names are allowed in the '...' argument,
	and the incorrect documentation of what happened with
	character objects is corrected.

    o	url() was not supporting 'encoding' except on file:// URLs.



		CHANGES IN R VERSION 2.4.0


USER-VISIBLE CHANGES

    o	The startup message now prints first the version string and
	then the copyright notice (to be more similar to R --version).

    o	save() by default evaluates promise objects.  The old behaviour
	(to save the promise and its evaluation environment) can be
	obtained by setting the new argument 'eval.promises' to FALSE.
	(Note that this does not apply to promises embedded in
	objects, only to top-level objects.)

    o	The functions read.csv(), read.csv2(), read.delim(),
	read.delim2() now default their 'comment.char' argument to "".
	(These functions are designed to read files produced by other
	software, which might use the # character inside fields, but
	are unlikely to use it for comments.)

    o	The bindings in the base environment/name space (currently the
	same thing) are now locked.  This means that the values of
	base functions cannot be changed except via
	assignInNamespace() and similar tricks.

    o	[[ on a factor now returns a one-element factor (and not an
	integer), as.list() on a factor returns a list of one-element
	factors (and not of character vectors), and unlist() on a list
	of factors returns a factor (and not an integer vector).
	These changes may affect the results of sapply() and lapply()
	applied to factors.

    o	mauchly.test() now returns the W statistic (for comparability
	with SAS and SPSS), rather than the z (which was accidentally
	not named in the output)

    o	sort(x, decreasing = FALSE, ...) is now a generic function.
	This means that 'partial' is no longer the second argument,
	and calls which used positional matching may be incorrect: we
	try to detect them.

    o	See the section on 'Changes to S4 methods': all packages
	depending on 'methods' need to be re-installed.


NEW FEATURES

    o	agrep(), grep(), strwrap(), strtrim(), substr() and
	related functions now coerce arguments which should be
	character via as.character() rather than internally (so method
	dispatch takes place, e.g. for factors).

	chartr(), charfold(), tolower() and toupper() now coerce their
	main argument if necessary to a character vector via
	as.character().

	Functions which work element-by-element on character vectors
	to give a character result now preserve attributes including
	names, dims and dimnames (as suggested by the Blue Book
	p. 144).  Such functions include charfold(), chartr(), gsub(),
	strtrim(), sub(), substr(), tolower() and toupper().  (Note
	that coercion of a non-character argument may lose the
	attributes.)

	agrep(value = TRUE) preserves names for compatibility with
	grep().

	nchar() has always preserved dims/dimnames (undocumented
	before) and now also preserves names.


    o	.Deprecated and .Defunct take a new parameter, msg, that allows
	for the specification of the message printed and facilitates
	deprecation of calling sequences etc.

    o	.Fortran() will map 'name' to lower case, and will work with
	'name' containing underscores.

    o	The default is now .saveRDS(compress = TRUE)

    o	The :: operator now also works for packages without name spaces
	that are on the search path.

    o	[[ on a list does not duplicate the extracted element unless
	necessary.  (It did not duplicate in other cases, e.g. a
	pairlist.)

    o	argsAnywhere() works like args() on non-exported functions.

    o	as.data.frame() gains a '...' argument.

    o	Added an as.data.frame() method for class "ftable".

    o	as.list(<an expression>) is now handled by internal code and
	no longer loses attributes such as names.

	as.list(<a list>) no longer duplicates (unnecessarily).

    o	as.POSIX[cl]t can now convert character strings containing
	fractional seconds.

    o	attach() can now attach a copy of an environment.

    o	available.packages() and installed.packages() gain a 'fields'
	argument thanks to Seth Falcon.

    o	axis.POSIXct() uses a different algorithm for ranges of 2 to 50
	days that will mark days at midnight in the current timezone
	(even if the graph crosses a DST change).

    o	body<-() and formals<-() default to envir = environment(fun),
	that is they do not by default change the environment.
	(Previously they changed it to parent.frame().)

    o	New function combn(x, m, ..) for computing on all combinations of
	size 'm' (for small 'm' !).

    o	The cumxxx() functions now handle logical/integer arguments
	separately from numeric ones, and so return an integer result
	where appropriate.

    o	data.frame() has a new argument 'stringsAsFactor'.  This and
	the default for read.table(as.is=) are set from the new global
	option 'stringsAsFactors' via the utility function
	default.stringsAsFactors().

    o	dev.interactive() now has an optional argument 'orNone'.

    o	df() now has a noncentrality argument 'ncp', based on a
	contribution by Peter Ruckdeschel.

    o	example() gains an argument 'ask' which defaults to "TRUE when
	sensible", but the default can be overridden by setting option
	'example.ask'.

    o	expand.grid() now has an argument 'KEEP.OUT.ATTRS' which can
	suppress (the potentially expensive) "out.attrs" attribute. It no
	longer returns an extraneous 'colnames' attribute.

    o	The subset and subassign methods for factors now handle factor
	matrices, and dim() can be set on a factor.

    o	There is now a format() method for class "ftable".

    o	head(x, n) and tail(x, n) now also work for negative arguments,
	thanks to Vincent Goulet.

    o	head.matrix() and tail.matrix() are no longer hidden, to be used
	for building head() and tail() methods for other classes.

    o	If help() finds multiple help files for a given topic, a menu
	of titles is used to allow interactive choice.

    o	help.search() now rebuilds the database if 'package' specifies a
	package not in the saved database.

    o	hist(*, plot = FALSE) now warns about unused arguments.

    o	history() gains a 'pattern' argument as suggested by Romain
	Francois.

    o	integer(0) now prints as that rather than "numeric(0)" (it
	always deparsed as "integer(0)").

    o	interaction(..., drop=TRUE) now gives the same result as
	interaction(...)[,drop=TRUE] (it used to sometimes give a
	different order for the levels).

    o	lag.plot() produces a conventional plot (not setting mfrow) if
	only one plot is to be produced.

    o	lapply() does much less copying.  Vector X are handled without
	duplication, and other types are coerced via as.list().	 (As a
	result, package 'boot' runs its examples 4% faster.)

	lapply(<a pairlist>) now coerces to a list (rather than traverse
	the pairlist from the beginning for each item).

    o	legend() has new parameters 'box.lwd' and 'box.lty'.

    o	lines() gains a simple method for isoreg() results.

    o	load() no longer coerces pairlists to lists (which was
	undocumented, but has been happening since 1998).

    o	make.link() now returns an object of class "link-glm".
	The GLM families accept an object of this class for their
	'link' argument, which allows user-specified link functions.
	Also, quasi() allows user-specified variance functions.

    o	mapply() uses names more analogously to lapply(), e.g..

    o	matplot() now accepts a 'bg' argument similarly to plot.default() etc.

    o	median() is now generic, and its default method uses mean()
	rather than sum() and so is more widely applicable (e.g. to dates).

    o	Dummy functions memory.size() and memory.limit() are available
	on Unix-alikes, for people who have not noticed that documentation
	is Windows-specific.

    o	merge() works more efficiently when there are relatively few
	matches between the data frames (for example, for 1-1
	matching).  The order of the result is changed for 'sort = FALSE'.

    o	merge() now inserts row names as a character column and not a
	factor: this makes the default sort order more comprehensible.

    o	Raw, complex and character vectors are now allowed in model
	frames (there was a previously undocumented restriction to
	logical, integer and numeric types.).  Character vectors in a
	formula passed to model.matrix() are converted to factors and
	coded accordingly.

    o	modifyList() utility, typically for housekeeping nested lists.

    o	x <- 1:20; y <- rnorm(x); nls(y ~ A*exp(-x^2/sig)) no longer
	returns an unhelpful error message.  In this and similar cases, it
	now tries a wild guess for starting values.

    o	Ops.difftime() now handles unary minus and plus.

    o	Ops.Date() and Ops.POSIXt() now allow character arguments
	(which are coerced to the appropriate class before comparison,
	for Ops.POSIXt() using the current time zone).

    o	There is a new option(max.contour.segments = 25000) which can be
	raised to allow extremely complex contour lines in contour()
	and contourLines().  (PR#9205)

    o	options(max.print = N) where N defaults to 99999 now cuts printing
	of large objects after about N entries.	 print(x, ..., max = N)
	does the same for the default method and those building on
	print.default().

	options("menu.graphics") controls if graphical menus should be
	used when available.

	options("par.ask.default") allows the default for par("ask")
	to be set for a newly-opened device.  (Defaults to FALSE, the
	previous behaviour.)

	The way option("papersize") is set has been changed.  On
	platforms which support the LC_PAPER locale category, the
	setting is taken first from the R_PAPERSIZE environment
	variable at run time, then from the LC_PAPER category
	("letter" for _US and _CA locales and "a4" otherwise).	On
	other platforms (including Windows and older Unixen), the
	choice is unchanged.

    o	package.skeleton() gains arguments 'namespace' and
	'code_files'.

    o	par(ask=TRUE) now only applies to interactive R sessions.

    o	parse() now returns up to 'n' expressions, rather than fill
	the expressions vector with NULL.  (This is now compatible
	with S.)

    o	The 'version' argument for pdf() is now increased
	automatically (with a warning) if features which need a higher
	level are used.

    o	pie() now allows expressions for 'labels', and empty slices.

    o	There is a new '%.%' operator for mathematical annotations
	(plotmath) which draws a centred multiplication dot
	(a \cdot in LaTeX), thanks to Uwe Ligges.

    o	predict.lm() gains a 'pred.var' argument.  (Wishlist PR#8877.)

    o	print.summary.{aov,glm,lm,nls} and print.{aov,glm} make use of
	naprint() to report when na.action altered the model frame.

    o	print.table(T, zero.print=ch) now also replaces 0 by ch when T is
	non-integer with integer entries.

    o	Recursive rapply() which is similar to lapply but used
	recursively and can restrict the classes of elements to which
	it is applied.

    o	r2dtable() has been moved to package 'stats'.

    o	New function read.DIF() to read Data Interchange Format files,
	and (on Windows) this format from the clipboard.

    o	New experimental function readNEWS() to read R's own "NEWS" file
	and similarly formatted ones.

    o	readLines() has a new argument 'warn' to suppress warnings:
	the default behaviour is still to warn.

    o	reg.finalizer() has a new argument 'onexit' to parallel the
	C-level equivalent R_RegisterFinalizerEx.

    o	rep() is now a primitive function and under some conditions
	very much faster: rep.int() is still a little faster (but does
	less). (Because it is primitive there are minor changes to the
	call semantics: see the help page.)

    o	The 'row.names' of a data frame may be stored internally as an
	integer or character vector.  This can result in considerably
	more compact storage (and more logical row names from rbind)
	when the row.names are 1:nrow(x).  However, such data frames
	are not compatible with earlier versions of R: this can be
	ensured by supplying a character vector as 'row.names'.

	row.names() will always return a character vector, but direct
	access to the attribute may not.

	The internal storage of row.names = 1:n just records 'n', for
	efficiency with very long vectors.

	The "row.names" attribute must be a character or integer
	vector, and this is now enforced by the C code.

    o	The "data.frame" and "matrix" methods for rowsum() gain an 'na.rm'
	argument.

    o	Experimental support for memory-use profiling via Rprof(),
	summaryRprof(), Rprofmem() and tracemem().

    o	save.image() [also called by sys.save.image() and hence from q()]
	now defaults to saving compressed binary images.  To revert to
	the previous behaviour set option "save.image.defaults": see
	?save.image.

    o	There is a new primitive seq.int() which is slightly more
	restricted than seq() but often very much faster, and new
	primitives seq_along() and seq_len() which are faster still.

    o	serialize(connection = NULL) now returns a raw vector (and not
	a character string).  unserialize() accepts both old and new
	formats (and has since 2.3.0).

    o	setwd() now returns the previously current directory (invisibly).

    o	The function sort() is now sort.int(), with a new generic
	function sort() which behaves in the same way (except for the
	order of its argument list) for objects without a class, and
	relies on the '[' method for objects with a class (unless a
	specific method has been written, as it has for class "POSIXlt").

    o	sort.list() now implements complex vectors (PR#9039), and how
	complex numbers are sorted is now documented.

    o	spline() and splinefun() now follow approx[fun] to have an argument
	'ties = mean' which makes them applicable also when 'x' has
	duplicated values.

    o	str(x) does not print the S3 "class" attribute when it is the
	same as 'mode' (which is printed anyway, possibly abbreviated)
	and it puts it beside mode for atomic objects such as S3 class
	"table".

    o	str(<data.frame>) now outputs 'data.frame' instead of
	`data.frame'; this may affect some strict (Package) tests.

    o	str() now takes also its defaults for 'vec.len' and 'digits.d'
	from options('str') which can be set by the new strOptions().

    o	symnum() has a new argument 'numeric.x' particularly useful for
	handling 0/1 data.

    o	Sys.getlocale() and Sys.setlocale() support LC_MESSAGES,
	LC_PAPER and LC_MEASUREMENT if the platform does.

    o	Sweave has a new options 'pdf.encoding' and 'pdf.version' for
	its Rweave driver.

    o	The character vector used by an output textConnection() has
	a locked binding whilst the connection is open.

	There is a new function textConnectionValue() to retrieve the
	value of an output textConnection().

    o	traceback() gains a 'max.lines' argument.
	.Traceback is no longer stored in the workspace.

    o	warning(immediate. = TRUE) now applies to
	getOption("warn") < 0 and not just == 0.

    o	warnings() is now an accessor function for 'last.warning' (which
	is no longer stored in the workspace) with a print() method.


    o	The internal internet download functions have some new
	features from libxml 2.6.26.

    o	There is an option "HTTPUserAgent" to set the User Agent in R
	download requests etc.	Patch from S. Falcon.

    o	PCRE has been updated to version 6.7.

    o	The C function substituteList now has tail recursion expanded
	out, so C stack overflow is less likely.  (PR#8141, fix by
	Kevin Hendricks)

    o	The (somewhat soft) 1023/4 byte limit on command lines is now
	documented in 'An Introduction to R'.

    o	The maximum number of open connections has been increased from
	50 to 128.

    o	There is a new manual 'R Internals' on R internal stuctures
	plus the former appendices of 'Writing R Extensions'.

    o	The autoloads introduced at the package re-organization have been
	almost completely removed: the one that remains is for ts().

    o	The setting of the various Java configuration variables has been
	improved to refer to JAVA_HOME, and they are now documented in
	the R-admin manual.

    o	It is (again) possible to calculate prediction intervals from
	"lm" objects for the original data frame, now with a warning
	that the intervals refer to future observations.  Weighted
	intervals have also been implemented, with user-specifiable
	weights. Warnings are given in cases where the default
	behaviour might differ from user expectations.	See the
	?predict.lm for details.


CHANGES TO S4 METHODS

    o	The default prototype object for S4 classes will have its own
	internal type in 2.4.0, as opposed to being an empty list (the
	cause of several errors in the code up to 2.3.1).  Note that old
	binary objects, including class definitions, will be
	inconsistent with the type, and should be recreated.

    o	S4 method dispatch has been completely revised to use cached
	generic functions and to search for the best match among
	inherited methods.  See ?Methods and
	http://developer.r-project.org/howMethodsWork.pdf

    o	Objects created from an S4 class are now marked by an internal flag,
	tested by isS4() in R and by macro IS_S4_OBJECT() in C.	 This
	is an efficient and reliable test, and should replace all
	earlier heuristic tests.

    o	Some changes have been made to automatic printing of S4
	objects, to make this correspond to a call to show(), as per
	'Programming with Data'.

    o	S4 generic and class definitions are now cached when the related
	package is loaded.  This should improve efficiency and also
	avoid anomalous situations in which a class or generic cannot
	be found.

    o	trace() now creates a new S4 class for the traced object if
	required.  This allows tracing of user-defined subclasses of
	"function".


DEPRECATED & DEFUNCT

    o	The re-named tcltk functions tkcmd, tkfile.tail, tkfile.dir,
	tkopen, tkclose, tkputs, tkread are now defunct.

    o	Argument 'col' of bxp() has been removed: use 'boxfill'.

    o	Use of NULL as an environment is now an error.

    o	postscriptFont() is defunct: use Type1Font().

    o	La.chol() and La.chol2inv() are defunct (they were the same as
	the default options of chol() and chol2inv).

    o	La.svd(method = "dgesvd") is defunct.

    o	Files install.R and R_PROFILE.R in packages are now ignored
	(with a warning).

    o	The following deprecated command-line options to INSTALL have
	been removed (use the fields in the DESCRIPTION file instead):
	-s --save --no-save --lazy --no-lazy --lazy-data --no-lazy-data

    o	Graphical parameter 'tmag' is obsolete.

    o	mauchley.test() (package 'stats') is now defunct.

    o	symbol.C() and symbol.For() are deprecated.  They are required in
	S for use with is.loaded(), but are not so required in R.

    o	load()ing an object saved in one of the formats used prior to
	R 1.4.0 is deprecated.	Such objects should be re-saved in the
	current format.

    o	save(version = 1) is now deprecated.


C-LEVEL FACILITIES

    o	The convenience function ScalarLogical now coerces all
	non-zero non-NA values to TRUE.

    o	The vector accessor functions such as INTEGER, REAL and
	SET_VECTOR_ELT now check that they are called on the
	correct SEXPTYPE (or at least on a compatible one).  See
	`Writing R Extensions' for the details and for a stricter
	test regime.

    o	It is no longer possible to pass list variables to
	.C(DUP = FALSE): it would have given rise to obscure garbage
	collection errors.

    o	allocString is now a macro, so packages using it will need to
	be reinstalled.

    o	R_ParseVector was returning with object(s) protected in the
	parser if the status was PARSE_INCOMPLETE or PARSE_ERROR.

    o	There is a new function Rf_endEmbeddedR to properly terminate
	a session started by Rf_initEmbeddedR, and both are now
	available on Windows as well as on Unix-alikes.	 These and
	related functions are declared in a new header <Rembedded.h>.

	If R_TempDir is set when embedded R is initialized it is
	assumed to point to a valid session temporary directory: see
	`Writing R Extensions'.

    o	There is a new interface allowing one package to make C routines
	available to C code in other packages.	The interface consists
	of the routines R_RegisterCCallable and R_GetCCallable.	 These
	functions are declared in <R_ext/Rdynload.h>. This interface
	is experimental and subject to change.

	In addition, a package can arrange to make use of header
	files in another (already installed) package via the
	'LinkingTo' field in the DESCRIPTION file: see 'Writing R
	Extensions'.


UTILITIES

    o	R CMD SHLIB now handles (as linker commands) -L*, -l* and *.a.

    o	R CMD check now:

	- warns if there are non-ASCII characters in the R code (as
	  these will likely be syntax errors in some locale).

	- tests Rd cross-references by default, and tests for
	  (syntactically) valid CITATION metadata.

	- tests that the package can be loaded, and that the package
	  and name space (if there is one) can each be loaded in
	  startup code (before the standard packages are loaded).

	- tests for empty 'exec' or 'inst' directories.

	- checks if $(FLIBS) is used when $(BLAS_LIBS) is.

	- checks that all packages (except non-S4-using standard
	  packages) used in ::, :::, library() and require() calls are
	  declared in the DESCRIPTION file, and 'methods' is declared if
	  S4 classes or methods are set.

	- throws an error if the standard packages 'methods' and
	  'stats4' are imported from in the NAMESPACE file and not
	  declared in the DESCRIPTION file.

    o	The test script produced by massage-Examples.pl no longer
	creates objects in the base environment.

    o	New utilties R CMD Stangle and R CMD Sweave for extracting S/R
	code from and processing Sweave documentation, respectively.

    o	The DESCRIPTION file of packages may contain an 'Enhances:'
	field.

    o	An R CMD javareconf script has been added to allow Java
	configuration to be updated even after R has been installed.


INSTALLATION

    o	The C function realpath (used by normalizePath()) is hidden on
	some systems and we try harder to find it.

    o	There is a new option --enable-BLAS-shlib, which compiles the
	BLAS into a dynamic library -lRblas and links against that.
	For the pros and cons see the R-admin manual.

	The defaults are now --without-blas (so you have explicitly to
	ask for an external BLAS), and --enable-BLAS-shlib unless
	a usable external BLAS is found or on AIX or on MacOS X 10.2
	and earlier.

    o	MacOS X did not like having LSAME in both BLAS and LAPACK
	libraries, so it is no longer part of the R-internal LAPACK.
	We now require an external BLAS to provide LSAME: it seems
	that nowadays all do.

    o	The configure test for 'whether mixed C/Fortran code can be
	run' has been improved as on one system that test passed but
	the Fortran run-time library was broken.

    o	A precious configure variable DEFS can be set to pass defines
	(e.g. -DUSE_TYPE_CHECKING_STRICT) to C code when compiling R.

    o	There is now a test for visible __libc_stack_end on Linux
	systems (since it is not visible on some recent glibc's
	built from the sources).

    o	MacOS X 10.4 and higher now use two-level namespaces, single
	module in a shared library and allow undefined symbols to be
	resolved at run-time. This implies that common symbols are now
	allowed in package libraries. --enable-BLAS-shlib is supported
	for internal BLAS, external BLAS framework and external static
	BLAS.  An external dynamic library BLAS is NOT supported. (But
	it can be easily used by replacing internal BLAS library file
	later.)	 MacOS X < 10.4 does not support --enable-BLAS-shlib.

    o	Dynamic libraries and modules use a flat namespace on MacOS X
	10.4 and higher if either Xcode tools don't support dynamic
	lookup (Xcode < 2.3) or the FORCE_FLAT_NAMESPACE environment
	variable is set.  (The latter was introduced temporarily for
	testing purposes and may go away anytime.)

    o	configure now defaults to 'run-time linking' on AIX
	(and AIX < 4.2 is no longer allowed), using -bexpall rather
	than export/import files.  If this works, it allows R to be
	built in the same way as other Unix-alikes, including with R
	as a shared library and with a shared BLAS.

    o	The "mac.binary" package type now defaults to universal
	binary.	 If a repository supports architecture-specific Mac
	binaries, they can be requested by using "mac.binary.xxx" in
	contrib.url(), where xxx is the desired architecture.

    o	There is a new configure option --enable-memory-profiling to
	enable memory profiling with tracemem, Rprof, Rprofmem.


BUG FIXES

    o	The name of a Fortran symbol reported to be missing by
	.Fortran() is now the actual name.  (What was reported to be
	an 'entry point' was missing the common leading underscore.)

    o	print() on a MBCS character string now works properly a
	character at a time rather than a byte at time.	 (This does
	not affect MBCSs like UTF-8 and the Windows DBCSes which have
	non-ASCII lead bytes and always worked correctly.)

    o	glm() now recalculates the null deviance whenever there is an
	offset (even if it is exactly zero to avoid a discontinuity in
	that case, since the calculations with and without offset are
	done by different algorithms).

    o	Amongst families, quasi() accepted an expression for link and
	no other did.  Now all accept an expression which evaluates to
	a one-element character vector (although e.g. 'logit' is taken
	as a name and not an expression).

    o	trace() now accepts arguments where= and signature= for the
	old-style trace (no tracer or exit, edit==FALSE) and just
	prints a message on entry.  Also the undocumented feature of
	where=function now works for generic functions as well.

    o	callNextMethod() failed for recursive use when the methods had
	nonstandard argument lists.  Now enforces the semantic rule
	that the inheritance is fixed when the method containing the
	callNextMethod() is installed.	See Details in the documentation.

    o	UseMethod() looked for the defining environment of 'generic' as
	if it were the current function, although some functions are
	generic for methods of a different generic.

	Lookup for S3 methods is confined to functions: previously a
	non-function 'fun.class' could have masked a function of the
	same name.

    o	Line types (lty) specified as hex strings were documented not to
	allow zero, but some devices accepted zero and handled it in a
	device-dependent way.  Now it is an error on all devices.
	(PR#8914)

    o	Subassignment for a time series can no longer extend the series:
	it used to attempt to but failed to adjust the tsp attributes.
	Now window() must be used.

    o	Function AIC() in package 'stats4' was not dispatching correctly
	on S4 classes via logLik() because of name space issues.

    o	Subsetting LANGSXPs could break the call-by-value illusion.
	(PR#7924) (patch from Kevin Hendricks).

    o	parse() with n > 1 gave a syntax error if fewer than n statements
	were available.

    o	parse() with n > 1 gave strange results on some syntax errors.
	(PR#8815)

    o	lag.plot() now respects graphical parameters for the axes.

    o	Using a wrong link in family() now gives more consistent error
	messages.

    o	sort.list(method="radix") works on factors again.

    o	object.size() is more accurate for vector objects (it takes into
	account the smaller header and also the fixed sizes used in
	the node classes for small vector objects).

    o	addmargins(T, ...) now returns a "table" when 'T' is a "table", as
	its help page has always suggested.

    o	remove() now explicitly precludes removing variables from
	baseenv() and throws an error (this was previously ignored).

    o	Saving the workspace at the end of a session now works as has
	long been intended, that is it is saved only if something has
	been added/deleted/changed during the current session.

    o	The search for bindings in <<-, ->> and assign(inherits=TRUE)
	was omitting the base package, although this was not
	documented.  Now the base package is included (but most
	bindings there are locked).

    o	dweibull(0, shape) was NaN not Inf for shape < 1.  Also, the
	help for dgamma and dweibull gave support as x > 0, but
	returned non-zero values for x = 0.  (PR#9080)

    o	Subsetting arrays no longer preserves attributes (it was
	removed for matrices in 1998).

    o	The "factor" method of as.character() no longer maps level
	"NA" to "<NA>" (a legacy of before there were NA character
	strings).

    o	terms(keep.order=TRUE) was not returning a valid "order"
	attribute.

    o	The DLL registration code was not freeing .External symbols.

    o	The internet download routines expected URLs of less than 4096
	bytes, but did not check.  Now this is checked, and http:// URLs
	are allowed to be up to 40960 bytes.

    o	parse(n=-1) threw a stack-imbalance error, and parse(n=3) did
	not cope correctly with EOF during input.

    o	Zero-column data frames had no names (rather than character(0)).

    o	by() and acf() could get confused when they used very long
	expressions as names.

    o	residuals(<glm object>, type="working") was NA for cases with
	zero weight (whereas they are well-defined even though the
	case was not used during the fitting) and the actual value is
	now returned.  This allows residuals to be computed from fits
	with 'y = FALSE'.

	The residuals in a fitted "glm" object are computed more
	accurately: the previous formula was subject to cancellation.

    o	loess() now checks the validity of its 'control' argument.

    o	rownames(<0-row matrix>, do.NULL=FALSE) was wrong.  (PR#9136)

    o	apply() now works as documented when applied over 2 or more
	margins with one of zero extent.  (It used to drop dimensions.)

    o	head() and tail() now also work row-wise for "table" and "ftable"
	objects.

    o	NextMethod() could throw an error/crash if called from a method
	that was called directly rather than from a generic (so
	.Method was unset).

    o	order(x, na.last = NA) failed for a zero-length x.

    o	grep(pat, x, value = TRUE, perl = L) preserved names for
	L == TRUE && !is.na(pat) but not otherwise.  Now it always does.

    o	[rc]bind() now find registered methods and not just visible ones.

    o	Printing a factor no longer ignores attributes such as names and
	dim/dimnames.

    o	Command-line arguments after --encoding were ignored.

    o	The check for impossible confidence levels was off by one in
	wilcox.test (PR#8557)

    o	[[ on an environment could create aliases. (PR#8457)

    o	pt() with a very small (or zero) non-centrality parameter could
	give an unduly stringent warning about 'full precision was not
	achieved'.  (PR#9171)

    o	writeChar() could segfault if 'nchars' was given silly values.

    o	qt() and rt() did not work for vector 'ncp', and qt() did not
	work for negative 'ncp'.

    o	ns() failed to work correctly when 'x' was of length one.

    o	identical() ignored tags on pairlists (including names of
	attributes) and required an identical ordering for
	attribute values in their pairlists.  Now names are compared
	on pairlists, and attribute sets are treated as unordered.

    o	If they were unused arguments supplied to a closure, only
	the first non-empty one was reported, despite the message.

	Unmatched empty arguments (such as f(1,,) for a function of
	one argument) were ignored.  They are now an error.

    o	Calling a builtin with empty arguments used to silently remove
	them (and this was undocumented).  Now this is an error unless
	builtin is c() or list() or there are only trailing empty
	arguments, when it is a warning (for the time being: this will
	be made an error in R 2.5.0).

    o	install.packages() ignored 'configure.args' if the vector was
	unnamed.

    o	biplot() now works if there are missing values in the data.

    o	biplot() now passes par() values to all four axes (not
	just those on sides 1 and 2).

    o	[.acf now handles an empty first index.

    o	Deparsing uses backticks more consistently to quote
	non-syntactic names.

    o	Assigning to the symbol in a for() loop with a
	list/expression/pairlist index could alter the index.  Now the
	loop variable is explicitly read-only.	(PR#9216)

    o	Using old.packages() (and hence update.packages()) on an empty
	(or non-existent) library failed with an obscure message.

    o	plot.xy() could segfault if supplied with an invalid 'col'
	argument.  (PR#9221)

    o	menu() with graphics=TRUE attempted to use Tcl/Tk on unix even
	if DISPLAY was not set (in which case Tk is not available and
	so the attempt is bound to fail).

    o	The print() method for 'dist' objects prints a matrix even for
	n = 2.

    o	The cumxxx functions were missing some PROTECTs and so could
	segfault on long vectors (especially with names or where
	coercion to numeric occurred).

    o	The X11() device no longer produces (apparently spurious)
	'BadWindow (invalid Window parameter)' warnings when run from
	Rcmdr.

    o	legend() assumed that widths and heights of strings were positive,
	which they need not be in user coordinates with reversed axes.
	(In part, PR#9236)

    o	The plot() methods for "profile.nls" objects could get
	confused if 'which' had been used in the profile() call. (PR#9231)

    o	boxplot() did not passed named arguments (except graphics
	parameters) to bxp() as documented.  (PR#9183)

    o	Only genuinely empty statements act as 'return' in the
	browser, not say those starting with a comment char.  (PR#9063)

    o	summary.mlm() incorrectly used accessor functions to fake an
	"lm" object.  (PR#9191)

    o	prettyNum() was not preserving attributes, despite being
	explicitly documented to. (PR#8695)

    o	It was previously undocumented what happened if a graphical
	parameter was passed in both '...' and 'pars' to boxplot()
	and bxp(), and they behaved differently.  Now those passed in
	'...' have precedence in both cases.

    o	A failed subassignment could leave behind an object '*tmp*'.
	The fix also sometimes gives better error messages.

    o	Using SIGUSR1 on Unix now always terminates a session, and no
	longer is caught by browser contexts and restarts (such as try()).

    o	In the 'graphics' package, in-line 'font=5' was being ignored
	(report by Tom Cook).

    o	nls() looked for non-parameter arguments in a function call in
	the wrong scope (from the body of nls).

    o	Printing of complex numbers could misbehave when one of the
	parts was large (so scientific notation was used) and the
	other was so much smaller that it had no significant digits
	and should have been printed as zero (e.g. 1e80+3e44i).

    o	Using install.packages with type="mac.binary" and target path
	starting with ~ failed with a cryptic message while unpacking.

    o	getwd() now works correctly when the working directory is
	unavailable (e.g. unreadable).

    o	The alternative hypothesis in wilcox.test() was labelled by an
	unexplained quantity 'mu' which is now spelled out.

	The alternative hypothesis in ks.test() is clearer both in the
	documentation and in the result. (PR#5360)



	**************************************************
	*						 *
	*	       2.3 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.3.1 patched


BUG FIXES

    o	help.search() incorrectly documented where the data base was
	saved and what was in it.

    o	str(<data.frame>, strict.width=.) produced an extraneous first line.

    o	Improve bessel[IJKY]() out-of-range checks; for instance,
	besselI(0, nu) no longer warns.

    o	cbind() on some non-vector objects (e.g. names) segfaulted.

    o	xy.coords(numeric(0)) gave a misleading error message.

    o	INSTALL has been changed to avoid a few problems with the
	base (not XPG4) Solaris sed.

    o	There were problems in src/main/printutils.c on some platforms
	that did not have va_copy.

    o	[pq]unif allowed infinite ranges but handled them
	inconsistently.	 (PR#8958)

	[pq]unif claimed to allow min == max but did not do so.

    o	Subassignment within raw arrays of 3 or more dimensions was not
	implemented.

    o	environment<-() did not even check if duplication was required.

    o	rt() was wrong for non-central t-distributions. qt() was wrong
	for non-central distributions far enough in the left tail
	(reported by Long Qu).	(PR#9050)

    o	R CMD Rdconv --type=Ssgm no longer drops a \keyword{} if it is the
	only one (one letter typo patch by Bill Dunlap).  (PR#9051)

    o	poly(x, y, .., raw = TRUE) now does follow 'raw'.

    o	plot(0/ -1:1, type = "s") now works.  (PR#9046)

    o	write.table(row.names=FALSE) does now quote column names. (PR#9044)

    o	rf() was wrong for non-central F (PR#9055). qf() was wrong for
	non-central F with denominator df > 1e8.

    o	The C function dummy_vfprint had a potential memory leak.  This
	showed up with some connections when used with output of more
	than 100,000 bytes in a single call.

    o	vignette() did not work if more than one vignette with the
	same name was installed	 (PR#9069).

    o	mget() did not check that 'ifnotfound' was a list, and worked
	incorrectly if it was a list of length > 1.  Now 'ifnotfound'
	is (if possible) coerced to a list.

    o	The internal check for conformance of time series assumed that the
	'tsp' attribute was integer, whereas it was enforced to be
	numeric by the attribute-setting code.

    o	Sweave() did not treat \begin{document} in comments correctly
	(PR#9073).

    o	diff(x) gave wrong result when x was "POSIXlt" object.

    o	title() could crash R when passed a long non-character vector.
	(PR#9115)

    o	Functions rgb(), hsv() and hcl() lost names unless 'alpha' was
	specified.  (In part, PR#9118)

    o	The residuals() method for "glm" failed unless 'y = TRUE' for
	the fit: it now works for "working" and "partial" residuals
	and gives a useful error message for other types. (PR#9124)

    o	R CMD Rdconv did not close the .Rd file, which matters on Windows.
	(PR#9126)

    o	anova.mlm() could fail if applied to a single model.

    o	stopifnot(<FALSE-expr>) now gives a better message for a *long*
	expression.




		CHANGES IN R VERSION 2.3.1


NEW FEATURES

    o	In lm() and glm(), offsets are allowed to be length 1 (and
	if so are replicated to the number of cases).

    o	The \uxxxx notation for Unicode characters in input strings
	can now be used on any platform which supports MBCS, even if
	the current locale is not MBCS (provided that the Unicode
	character is valid in the current character set).

    o	The quasibinomial() family now allows the "cauchit" link. (PR#8851)

    o	edit.data.frame() no longer (silently) coerces character columns
	to factor.


C-LEVEL FACILITIES

    o	The variables controlling stack checking are made available via
	Rinterface.h to front-ends embedding R: see 'Writing R Extensions'

    o	R_SignalHandlers (defined in Rinterface.h) can be set to 0 to
	suppress the R signal handlers in front-ends embedding R.


INSTALLATION CHANGES

    o	There have been a number of changes to help installation on
	platforms that no one had beta-tested.

	- Changes related to older header files, e.g. on Redhat 8.0/9.

	- Problems with 'make install' on older (<3) versions of bash
	  on Solaris and elsewhere.

	- AIX 5.2/gcc issues with needing -lm when making modules X11
	  and vfonts.

	- Some versions of Solaris and AIX had an fcntl.h that
	  redefined 'open' to be 'open64' and thereby broke
	  compilation of src/main/connections.c and elsewhere.

    o	'make uninstall' works better on a build using a named
	subarchitecture.


BUG FIXES

    o	min(), max(), sum() and prod() gave nonsensical answers with
	an empty list or raw argument.

    o	sum() on a data frame did not allow multiple arguments.	 (PR#8385)

    o	charmatch() and pmatch() did not specify they applied only to
	character vectors.  Now they do, and attempt to coerce 'x' and
	'target' to character before attempting matching.

    o	The Summary() methods for data.frame, Date, POSIXct, POSIXlt
	and difftime all required an argument which can match 'x',
	although the generics did not.

    o	regexpr() now accepts 0-length 'text' inputs.

    o	help.search() no longer errors out on a wrongly installed package
	(with no "hsearch.rds" file).

    o	The LaTeX version of the package reference manual was omitting
	some topics, and was not sorting the foo-package topic first.

    o	Serializing (e.g. via save()) is better protected against C
	stack overflow, which will now abort the conversion but no
	longer crashes the R process on some platforms.

    o	rbind()ing dataframes with a single row could lead to a
	corrupt data frame (a problem with the fix to PR#8506).

    o	plot(lm(y ~ 1)) now works also for 'which = 5'.

    o	dbeta(0, 1, a, 0) now correctly gives 'a' (limit) instead of 0,
	and dbeta(0, a, b, ncp) now returns Inf instead of NaN.

    o	demo(Hershey) was failing on the Cyrillic octal codes in locales
	(e.g. UTF-8) in which these are invalid.

    o	mean() on an integer (or logical) vector was treating NAs as
	actual values (unless na.rm = TRUE).

    o	mean() on a complex vector was calculated incorrectly in
	code to improve precision (PR#8842, John Peters).

    o	Graphical parameters bg, cex, col, lty, and lwd were being
	checked as being of length one even by functions such as
	title() that ignored them.  (Functions such as lines() and
	points() allow them to be of length > 1, so they might be
	passed through ... to other high-level graphical functions
	which then used to reject them.)

    o	str() now is fast again for large character vectors.

    o	edit() would default the environment of a function to .BaseEnv,
	instead of to .GlobalEnv.

    o	lm() and glm() coerce their 'weights' and 'offset' values to
	vector to avoid problems with specifying them as 1D or n x 1
	arrays.

    o	image() with one or both axes on log scales would give a
	spurious warning; contour() would give an error.

    o	legend() with log axes would place the title in the wrong place.

    o	edit.data.frame() was not returning factors edited with
	factor.mode="numeric" to factors.

    o	edit.matrix() tried to set rownames and colnames from the
	original matrix even if the sizes had been altered, and
	ignored changes made to the column names.  'edit.row.names' has
	a more sensible default (if the rownames are non-NULL).

    o	bindingIsLocked() was returning invalid values of a logical
	vector on some platforms.

    o	merge.data.frame() did not make the column names unique (by
	appending elements of 'suffixes') when performing a Cartesian
	product.  (PR#8676)

    o	rbind.data.frame() matches up the names of columns (which was
	undocumented), but failed to do so when checking if it was
	dealing with a factor column.  (PR#8868)

	If rbind() was used on data frames with duplicated names it
	produced a corrupt data frame.

    o	dt(x, df, ncp= not.0) no longer gives erratic values for
	|x| < ~1e-12.  (PR#8874)

    o	\code{\linkS4class{.}} now works.

    o	ccf() aligns time series by ts.intersect() rather than
	ts.union() and so is less likely to need a non-default
	na.action.  (PR#8893)

    o	optim(method="CG") could return a value that did not
	correspond to $par for very badly behaved functions on which
	the second phase of the line search failed.  (PR#8786)

    o	print.ts() could fail on a corrupt time series: it now warns and
	does the best it can.




		CHANGES IN R VERSION 2.3.0


USER-VISIBLE CHANGES

    o	In the grid package there are new 'arrow' arguments to
	grid.line.to(), grid.lines(), and grid.segments()
	(grid.arrows() has been deprecated).

	The new 'arrow' arguments have been added BEFORE
	the 'name', 'gp' and 'vp' arguments so existing code that
	specifies any of these arguments *by position* (not by name)
	will fail.

    o	all.equal() is more stringent, see the PR#8191 bug fix below.

    o	The data frame argument to transform() is no longer called 'x',
	but '_data'.  Since this is an invalid name, it is less likely
	to clash with names given to transformed variables. (People
	were getting into trouble with transform(data, x=y+z).)


NEW FEATURES

    o	arima.sim() has a new argument 'start.innov' for compatibility
	with S-PLUS.  (If not supplied, the output is unchanged from
	previous versions in R.)

    o	arrows() has been changed to be more similar to segments():
	for example col=NA omits the arrow rather than as previously
	(undocumented) using par("col").

    o	as.list() now accepts symbols (as given by as.symbol() aka
	as.name()).

    o	atan2() now allows one complex and one numeric argument.

    o	The 'masked' warnings given by attach() and library() now only
	warn for functions masking functions or non-functions masking
	non-functions.

    o	New function Axis(), a generic version of axis(), with Date and
	POSIX[cl]t methods.  This is used by most of the standard
	plotting functions (boxplot, contour, coplot, filled.contour,
	pairs, plot.default, rug, stripchart) which will thus label x
	or y axes appropriately.

    o	pbeta() now uses TOMS708 in all cases and so is more accurate
	in some (e.g. when lower.tail = FALSE and when one of the
	shape parameters is very small).

    o	[qr]beta(), [qr]f() and [qr]t() now have a non-centrality parameter.

    o	[rc]bind and some more cases of subassignment are implemented
	for raw matrices.  (PR#8529 and PR#8530)

    o	The number of lines of deparsed calls printed by browser() and
	traceback() can be limited by the option "deparse.max.lines".
	(Wish of PR#8638.)

    o	New canCoerce() utility function in "methods" package.

    o	[pq]chisq() are considerably more accurate for moderate (up to
	80) values of ncp, and lower.tail = FALSE is fully supported
	in that region.	 (They are somewhat slower than before.)

    o	chol(pivot = TRUE) now gives a warning if used on a (numerically)
	non-positive-definite matrix.

    o	chooseCRANmirror() consults the CRAN master (if accessible) to
	find an up-to-date list of mirrors.

    o	cov.wt() is more efficient for 'cor = TRUE' and has a new 'method'
	argument which allows 'Maximum Likelihood'.

    o	do.call() gains an 'envir' argument.

    o	eigen() applied to an asymmetric real matrix now uses a
	tolerance to decide if the result is complex (rather than
	expecting the imaginary parts of the eigenvalues to be exactly
	zero).

    o	New function embedFonts() for embedding fonts in PDF or
	PostScript graphics files.

    o	fisher.test() now uses p-values computed via hypergeometric
	distributions for all 2 by 2 tables.  This might be slightly
	slower for a few cases, but works much better for tables with
	some large counts.

	There is a new option to simulate the p-value for larger than
	2 x 2 tables.

    o	for() now supports raw vectors as the set of indices.

    o	getNativeSymbolInfo() is vectorized for the 'name' argument.  It
	returns a named list of NativeSymbolInfo objects, but is
	backward compatible by default when called with a character
	vector of length 1, returning the NativeSymbolInfo object.

    o	help.search() no longer attempts to handle packages installed
	prior to R 2.0.0, and reports the current path to the
	package (rather than where it was originally installed: this
	information is not shown by the print() method).

    o	Added "hexmode" to parallel "octmode".

    o	install.packages() now does tilde expansion on file paths
	supplied as 'pkgs'.

    o	install.packages() has additional arguments 'configure.args' and
	'clean' which allow the caller to provide additional arguments
	to the underlying R CMD INSTALL shell command when installing
	source packages on a Unix-alike.

    o	is.loaded() has a new argument 'type' to confine the search to
	symbols for .C, .Fortran, .Call or .External: by default it
	looks for a symbol which will match any of them.  It is now
	internal and not primitive, so argument matching works in the
	usual way.

    o	The symmetry test for matrices used in eigen() has been ``exported''
	as the 'matrix' method of a new S3-generic 'isSymmetric().

    o	.leap.seconds and the internal adjustment code now know about
	the 23rd leap second on 2005-12-31: the internal code uses a
	run-time test to see if the OS does.

    o	The 'col' argument of legend() now defaults to par("col")
	(which defaults to "black", the previous default), so that
	the lines/symbols are shown in the legend in the colour that
	is used on the plot.

    o	log2() and log10() call C functions of the same name if
	available, and will then be more likely to be precise to
	machine accuracy.

    o	new.packages() gains a ... argument to pass e.g. 'destdir' to
	install.packages().  (Wish of PR#8239.)

    o	nls() now supports 'weights'.

    o	The vector passed as the first argument of the 'fn' and 'gr'
	arguments of optim() has the names (if any) given to argument
	'par'.

    o	options(expressions) is temporarily increased by 500 during
	error-handling.	  This enables e.g. traceback() to work when
	the error is reaching the limit on the nesting of expressions.

    o	page() accepts general R objects, not just names (and
	previously undocumented) character strings.  This allows the
	object to be specified as a call, for example.	More options
	are allowed in its '...' argument.

    o	pairs() allows a wider class of inputs, including data frames
	with date and date-time columns.

    o	par() and the in-line use of graphical parameters produce more
	informative error messages, distinguishing between
	non-existent pars and inappropriate use of valid pars.

	Graphical parameters 'family', 'lend', 'ljoin' and 'lmitre'
	can now be set in-line.

	There is no longer a warning if non-settable pars are used
	in-line, but there is an appropriate warning if unknown pars
	are passed.

	The length limit for the 'family' parameter has been increased
	to 200 bytes, to allow for the names of some CID-keyed fonts
	in multi-byte locales.

    o	The pdf() device now allows 'family' to be specified in the same
	generality as postscript().

    o	The pdf() device writes /FontDescriptor entries for all fonts
	except the base 14, and does not write font entries for unused
	fonts.

    o	Plotmath allows 'vartheta', 'varphi' and 'varsigma' (or 'stigma')
	as synonyms for 'theta1', 'phi1' and 'sigma1', and the help
	page has a note for TeX users.

    o	plot.xy() now takes its default arguments from the
	corresponding par() settings, so points(type="l") and
	lines(type="p") behave in the same way (and more obviously,
	also for type="b").

    o	poly() has a new argument 'raw', mainly for pedagogical purposes.

    o	The class "POSIXlt" now supports fractional seconds (as
	"POSIXct" has always done).  The printing of fractional seconds
	is controlled by the new option "digits.secs", and by default is off.

    o	postscript() supports family = "ComputerModernItalic" for
	Computer Modern with italic (rather than slanted) faces.

    o	The postscript()/pdf() font metrics for the 14 standard fonts
	(only, not the rest of the common 35) have been updated to
	versions from late 1999 which cover more glyphs.  There are
	also a few differences in the metrics and hence the output
	might be slightly different in some cases.

    o	The way families can be specified for postscript() and pdf()
	has been expanded to include CID-keyed fonts, with new
	functions Type1Font() and CIDFont() to set up such fonts
	families.

    o	prettyNum() has new arguments 'preserve.width' and 'zero.print'.
	When the former is not "none", as in calls from format() and
	formatC(), the resulting strings are kept at the desired width
	when possible even after adding of 'big.mark' or 'small.mark'.

    o	proc.time() and system.time() now record times to 1ms accuracy
	where available (most Unix-like systems).

    o	The initialization methods for the quasi() family have been
	changed to depend on the variance function, and in particular
	to work better for the "mu(1-mu)" variance function.  (PR#8486)

    o	read.table() gains a 'flush' argument passed to scan().

    o	require() now takes a 'lib.loc' argument.

    o	The second argument 'size' to sample() is required to have
	length 1, so that errors when supplying arguments are more
	easily detected.

    o	The default is now compress = !ascii in save() (but not save.image).

    o	scan() and write.table() now have some interruptibility, which
	may be useful when processing very large files.

    o	A new heuristic test, seemsS4Object() is supplied, along with a
	similar C-level test, R_seemsS4Object(object). The test
	detects probable S4 objects by their class's attribute. See
	the help page.

    o	S3 classes can now be made non-virtual S4 classes by supplying a
	prototype object in the arguments to setOldClass().

    o	splinefun() returns a function that now also has a 'deriv' argument
	and can provide up to the 3rd derivative of the interpolating
	spline, thanks to Berwin Turlach.

    o	stopifnot(A) now gives a better error message when A has NAs, and
	uses "not all TRUE" when A has length >= 2.

    o	str()'s default method has a new argument 'strict.width' which can
	be used to produce strict 'width' conforming output.  A new
	options(str = list(strict.width = *)) setting allows to control
	this for a whole session.

    o	summary.nls() has a new argument 'correlation' that defaults
	to FALSE (like summary.lm).

    o	Sys.sleep() has sub-millisecond resolution on Unix-alikes
	with gettimeofday().

    o	Sys.time() now has sub-millisecond accuracy on systems
	supporting the POSIX call gettimeofday, and clock-tick
	accuracy on Windows.

    o	The new function timestamp() adds a time stamp to the saved
	command history on consoles which support it.

    o	New function tcrossprod() for efficiently computing x %*% t(x)
	and x %*% t(y).

    o	The suffix used by tempfile() is now in hex on all platforms
	and guaranteed to be at least 6 hex digits (usually 8).

    o	trace() now works more consistently and more like its
	documentation, in particular the assertions about old tracing
	being removed for new.	For debugging purposes (of R) a
	mechanism for debugging the trace computations themselves was
	added.	See trace.R.

    o	The implementation of trace() has beem made more general by
	calling a function to do the trace interaction, and recover()
	now detects trace calls to trim the irrelevant code underneath.

    o	unserialize() can now also read a byte stream from a raw vector.

    o	The useDynLib() directive in the NAMESPACE file now accepts the
	names of the native/foreign symbols that are to be resolved in
	the DLL for use in .C/.Call/.Fortran/.External calls.  These
	can be used as regular R variables instead of the (routine
	name, PACKAGE) pairs currently recommended.  Alternative names
	can be given for the R variables mapping to these symbols.
	The native routine registration information can also be used
	directly via useDynLib(name, .registration = TRUE).  See the
	'Writing R Extensions' manual for more details.

	checkFF() (package 'tools') has been updated accordingly.

    o	validObject() has an option complete=TRUE that recursively
	checks the objects in the slots.  Not used when new(...)
	checks validity.

    o	New Vectorize() function, a wrapper for mapply().

    o	write.ftable() has gained an argument 'append = FALSE' (thanks to
	Stephen Weigand).

    o	On Unix-alikes, X11() now has arguments to request the initial
	position of the window, and 'gamma' defaults to the value of
	getOptions("gamma").  These changes are consistent with the
	windows() device.

    o	X11() and the Unix-alike data entry window can have properties
	(including geometry) set by X resources: see their help files.

    o	xy.coords() & xyz.coords() now have NULL defaults for their 'y' or
	'y' and 'z' arguments.	This is more consistent with their earlier
	documentation, and may be convenient for using them.


    o	Non-syntactic names of list elements are now printed quoted by
	backticks rather than double quotes.

    o	There is some basic checking for imminent C stack overflow (when
	the evaluation depth and the user interrupts are checked).
	On systems with suitable OS support (not Windows), segfaults
	from C stack overflow are caught and treated as an R error.

	New function Cstack_info() reports on stack size and usage.

	options(expressions) reverts to the default of 5000 now
	stack checking is in place.

    o	Package tcltk does not try to initialize Tk on Unix-alikes
	unless a DISPLAY variable is present.  This allows packages
	dependent on tcltk to be installed without access to an X server.

    o	The code used to guess timezone offsets where not supplied by
	the OS uses a different algorithm that is more likely to guess
	the summer-time transitions correctly.

    o	Package tools contains translation tables 'Adobe_glyphs' and
	'charset_to_Unicode'.

    o	Changed the environment tree to be rooted in an empty
	environment, available as emptyenv().  baseenv() has been
	modified to return an environment with emptyenv() as parent,
	rather than NULL.

    o	gettext has been updated to 0.14.5.

    o	PCRE has been updated to version 6.4.

    o	The method $.DLLInfo resolves the specified symbol in the DLL,
	returning a NativeSymbolInfo object.  Use [[ to access the actual
	values in the DLLInfo object.

    o	On systems with either vasprintf or both va_copy and a vsnprintf
	which reports the size of buffer required, connections such as
	gzfile() and bzfile() can now write arbitrarily long lines,
	not just 100000 chars.

    o	The R session temporary directory is now set in C code using
	the same algorithm whether or not the shell front-end is used
	and on all platforms.  This looks at environment variables
	TMPDIR, TMP and TEMP in turn, and checks if they point to a
	writable directory.

    o	Some of the classical tests put unnecessary restrictions on the
	LHS in the formula interface (e.g., t.test(x+y ~ g) was not
	allowed).

    o	On suitably equipped Unix-alike systems, segfaults, illegal
	operations and bus errors are caught and there is a simple
	error-handler which gives the user some choice as to what to
	do in interactive use.

	On Windows access violations and illegal instructions are
	caught with a simple error handler.

    o	Tracebacks now include calls such as .C/.Fortran/.Call, which
	will help if errors occur in R code evaluated by compiled code
	and in tracebacks presented by the segfault etc handlers.

    o	Treatment of signature objects and method definition objects has
	been modified to give cleaner printing and more consistency in
	the treatment of signatures.  A sometimes useful utility,
	methodSignatureMatrix(), is now exported.

    o	Printing the results of codoc() from package tools now helpfully
	summarizes the found code/documentation mismatches.

    o	R refrains from printing a final EOL upon exiting the main loop
	if the quiet flag is on and if the save action is known (e.g. this
	is true for --slave).


DEPRECATED & DEFUNCT

    o	The deprecated and undocumented use of atan() with two arguments
	has been removed: instead use atan2().

    o	write.table0() is defunct in favour of write.table().

    o	format.char() is defunct in favour of format.default().

    o	Support for the long-deprecated (and no longer documented)
	arguments --min-vsize --min-nsize --max-vsize --max-nsize
	--vsize --nsize of R CMD BATCH has been removed.

    o	The 'debian' subdirectory has been removed from the sources.

    o	The 'vfont' argument of axis() and mtext() has been removed:
	use par(family=) instead.

    o	The unused graphical parameter "type" has been removed: it
	invited confusion with the 'type' argument to default methods
	of plot(), points() and lines().

    o	nlsMethod() and profiler() are no longer exported from the stats
	name space (and nlsMethod.plinear() is no longer registered as
	a method, as nlsMethod() was not generic).

    o	The re-named tcltk functions tkcmd, tkfile.tail, tkfile.dir,
	tkopen, tkclose, tkputs, tkread are now formally deprecated.

    o	Argument 'col' of bxp() is now formally deprecated.

    o	Use of NULL as an environment is deprecated and gives a warning.

    o	postscriptFont() is deprecated in favour of Type1Font() (which
	is just a change of name).

    o	La.chol() and La.chol2inv() are deprecated (they have since R
	1.7.0 been the same as the default options of chol() and chol2inv).

    o	La.svd(method = "dgesvd") is deprecated.

    o	The use of install.R and R_PROFILE.R files in packages is
	deprecated: use the DESCRIPTION file instead to arrange to
	save an image or to load dependent packages.

	The following command-line options to INSTALL are deprecated
	(use the fields in the DESCRIPTION file instead):
	-s --save --no-save --lazy --no-lazy --lazy-data --no-lazy-data

    o	Graphical parameter 'tmag' (which is long unused) is deprecated.


INTERNATIONALIZATION

	A set of patches supplied by Ei-ji Nakama has been incorporated.

    o	New postscript encodings for CP1253, CP1257 and Greek (ISO 8859-7).

    o	Support for East Asian CID-keyed fonts in pdf() and postscript().
	Although these usually contain Latin characters no accurate
	AFMs are available and so CID-keyed fonts are intended only
	for use with CJK characters.

    o	Wide-character width functions wc[s]width are provided that
	overcome problems found with OS-supplied ones (and those
	previously used by R on Windows).  This means that
	double-width CJK characters are now supported on all
	platforms.  It seems that the width of some characters (and
	not just CJK characters) depends on which CJK locale's fonts
	are in use and also on the OS.

	Revised wide-character classification functions are
	provided for use on Windows, AIX and MacOS X to replace
	deficient OS-supplied ones.

    o	There is support for MBCS charsets in the pictex() graphics
	device, and rotated (by 90 degrees) text may work better.

    o	The \u (and \U except on Windows) notation for characters which
	is supported by the parser in all MBCS charsets is now always
	interpreted as a Unicode point, even on platforms which do not
	encode wchar_t in Unicode.  These are now a syntax error in
	single-byte locales.

    o	The default encoding for postscript() and pdf() is chosen to
	be suitable for the current locale, if that is a single-byte
	locale which is supported.  This covers European (including
	Greek) and Cyrillic languages.

	In UTF-8 locales, a suitable single-byte encoding is chosen
	for postscript() and pdf(), and text translated to it.

    o	xfig() gains an 'encoding' argument.

    o	There are some message translations into Spanish.


INSTALLATION CHANGES

    o	The encoding files for pdf()/postscript() have been moved to
	directory 'enc' in package 'grDevices'.

    o	Support for MBCS is only enabled if iconv is found and it
	supports enough conversions.  (libiconv does.)

    o	In an MBCS locale, make check now translates the graphics
	examples from Latin-1.	This ensures that they will work
	correctly in UTF-8: it is possible that in other MBCS locales
	they will now fail (rather than work completely incorrectly).

    o	There is a new test, 'test-Docs', which as part of 'make
	check-devel' tests the code in the documentation.  Currently
	it runs doc/manual/R-{exts,intro}.R and the compiled code in
	R-exts.c.

    o	The workaround to allow an external LAPACK-containing BLAS
	such as libsunperf to be used with the internal LAPACK has
	been removed.  If you have such a library you may now need
	to use --with-lapack.  It is no longer possible to use some
	older versions of libsunperf, e.g. Forte 7 on 64-bit builds.

    o	A substitute for mkdtemp is provided, so it is now always
	used for R_TempDir.

    o	Most of the functions checked for by 'configure' also have
	declarations checked for in the appropriate header.

    o	The top-level documentation files AUTHORS COPYING.LIB COPYRIGHTS
	FAQ RESOURCES THANKS have been moved to doc, and COPYING and NEWS
	are installed there.  The file Y2K has been removed from the
	distribution.

    o	The extension .lo is no longer used in building R (only in
	the optional build of libRmath.so): this allows a considerable
	simplification of the Makefiles.

    o	Direct support for f2c has been removed: it can still be used
	via a script which makes it look like a Fortran compiler.
	(src/scripts/f77_f2c is an example of such a script.)

    o	There is a new flag SAFE_FFLAGS which is used for the
	compilation of dlamc.f.	 It is set by configure for known
	problem cases (recent g77 and gfortran), but can be overridden
	by the user.

    o	The standard autoconf macros for large-file support are now used,
	and these are enabled unless --disable-largefile is specified.
	This replaces --enable-linux-lfs (and is now selected by default).

    o	Visibility attributes are used where supported (gcc4/gfortran on
	some platforms, also gcc3/g77 on FC3 and partially elsewhere).
	The main benefit should be faster loading (and perhaps better
	optimized code) in some of the dynamic shared objects (e.g.
	libR.so and stats.so).

    o	The *PICFLAGS are taken to be -fpic rather than -fPIC where
	possible.   This will make no difference on most platforms:
	-fPIC is needed on Sparc (and still used there), but -fpic
	should give slightly better performance on PowerPC (although
	-fPIC is used on PPC64 as it is needed to build libR.so there).

    o	More use is made of inlining for small utility functions such
	as isReal.  Because this can only be done portably with C99
	constructs (and we know of no actual implementation), this is
	only done for the GNU C compiler.

    o	There is an experimental feature to allow shared installations
	of sub-architectures.  See the R-admin manual.

    o	All platforms now use R's internal implementation of strptime,
	which allows fractional seconds.  (The major platforms were
	already using it.)

    o	The dlcompat work-around for old Mac OS X systems (<= 10.2)
	has been removed.  External dlcompat must be installed if needed.


UTILITIES

    o	R CMD check now uses an install log by default.

    o	R CMD check works for packages whose package name is different
	from the directory name in which it is located.

    o	R CMD INSTALL now uses more randomness in the temporary
	directory name even on systems without mktemp -d.

    o	R CMD f77 has been removed now f2c is no longer supported.

    o	The version string shown in the startup message and by
	"R --version", and that stored in variable R.version.string
	are now in exactly the same format.

    o	The base name of a help file needs to be valid as part of a file://
	URL, so R CMD check now checks the names are ASCII and do not
	contain % .

    o	R CMD check now warns about unknown sections in Rd files, and
	invalid names for help, demo and R files, as well as unlikely
	file names in the 'src' directory.  The latter is controlled
	by option --check-subdirs and by default is done if checking a
	tarball without a configure script.

	R CMD build excludes invalid files in the 'man', 'R' and 'demo'
	subdirectories.

    o	\usepackage[noae]{Sweave} in the header of an Sweave file
	supresses auto-usage of the ae package ("almost European"
	fonts) and T1 input encoding.


DOCUMENTATION

    o	Rd format now allows \var{} markup inside \code{} and \examples{}.

    o	Markup such as --, ---, < and > is handled better when
	converting .Rd files to [C]HTML.

    o	There is new markup \link[=dest]{name} to generate a link to topic
	'dest' which is shown as 'name', and \linkS4class{abc} which
	expands to \link[=abc-class]{abc}, for cross-referencing the
	recommended form of documentation for S4 classes.


PACKAGE INSTALLATION

    o	There is now some support for Fortran 90/95 code in packages:
	see `Writing R Extensions'.

    o	Installation of man sources and demos is now done by R code.
	The restrictions on the names of help files, R files and
	of demos are now enforced (see `Writing R Extensions').

    o	Packages which contain compiled code can now have more than
	one dot in their name even on Windows.

    o	The Meta/hsearch.rds database saved now contains LibPath="".
	This information is now always recreated when help.search() is
	run, but the field is retained for back-compatibility.

    o	update.packages() now has a '...' argument to be passed to
	install.packages(), including the formerly separate arguments
	'destdir' and 'installWithVers'.

    o	Make macros AR and RANLIB are now declared in etc/Makeconf for
	use by packages which wish to make static libraries.


C-LEVEL FACILITIES

    o	qgamma and rgamma in Rmath.h now check for non-positive arguments.

    o	The BLAS which ships with R now contains the complete set of
	double-complex BLAS routines, rather than just those used in R.

	<R_ext/BLAS.h> has been corrected to add the missing
	double-precision BLAS functions drotmg and drotm, and to
	exclude lsame (which is a Lapack auxiliary function and is now
	declared in <R_ext/Lapack.h>).	It also includes the double
	complex routines added for this release of R provided Fortran
	doublecomplex is usable on the platform.

    o	<R_ext/BLAS.h> and <R_ext/Lapack.h> now declare all the entry
	points as 'extern'.

    o	The flag SAFE_FFLAGS is made available to packages via
	etc/Makeconf and R CMD config.	It can be used where
	optimization needs to be defeated, e.g. in LAPACK setup.

    o	getNativeSymbolInfo has a withRegistrationInfo argument which
	causes the address field to be a reference to the registration
	information if it is available for that symbol.	 If the
	registration information is not available, the address is a
	reference to the native symbol. The default is FALSE which is
	backward compatible, returning just the address of the symbol
	and ignoring registration information.

    o	errorcall and warningcall are now declared in <Rinternals.h>
	(they might be needed in front-ends).

    o	R_FlushConsole and R_ProcessEvents are now declared in <R.h>.

    o	The R_Sock* functions supporting socket connections are no
	longer declared in R-ftp-http.h as they are not loaded into R
	itself, and are now hidden in the module's DLL on suitable systems.


BUG FIXES

    o	Quoted arguments to the R script after --args are now
	passed quoted to the R executable and so will be shown as
	expected by commandArgs().  (They were previously split at
	whitespace even inside quotes on Unix-alikes but not on
	Windows.)

    o	axis() now supports pars 'xaxp'/'yaxp' as inline arguments.

    o	sort() now does not return inappropriate attributes such as
	"dim" and "tsp": it only returns names.

	sort(x, partial=) no longer returns unsorted names, and drops
	names (since it is supplied for efficiency).

    o	Use of non-central F in pf() gives accurate values for larger ncp.

    o	R CMD build --binary does a better job of cleaning up after
	failure to re-make vignettes.

    o	reg-test-1.R tested system(intern=TRUE) which depends on popen
	and so is not supported on all platforms.

    o	Changed apparent misspelling of "Gibraltar" in dataset 'eurodist'.

    o	sysconf() is now used to find the number of clock ticks/second:
	under some circumstances glibc reported CLK_TCK = 60 when the
	true value was 100.

    o	identical() was not allowing for embedded nuls in character
	strings. (NB: the comparison operators including == do not,
	and never will.)

    o	The profile() and profiler() methods for "nls" objects now
	support algorithm = "plinear" and algorithm = "port".

    o	The signal handlers for signals USR1 and USR2 where not
	restored if the signal arrived when interrupts were suspended.

    o	Certain combinations of S4 inheritance could cause inherited
	methods to override some directly specified methods.

    o	Some cases of named signatures in calls to setMethod() caused errors.

    o	all.equal() is now more consistent and "picky" about mismatching
	attributes, in particular names(); this is a part of the
	propositions by Andy Piskorkski (PR#8191).

    o	load() when applied to a connection leaves it open/not as it
	found it, and checks explicitly for having a binary readable
	connection.

    o	The p-values given by stat.anova() (called from several
	anova() methods) are now NA (rather than spurious) if
	non-nested models give rise to changes in deviance with a
	different sign from changes in degrees of freedom.

    o	Built-ins were reported as the relevant call in C-level error()s
	iff R profiling was in progress.  Now they are never reported.

    o	Too-long signatures (with no names) were not being caught
	in setMethod().

    o	Slot names in prototype() are being more thoroughly checked.

    o	signif() is more likely to follow the 'round to even' rule for
	exactly representable numbers, e.g. signif(0.25, 1).  (Related
	to PR#8452.)

    o	nls() now works correctly with some low-dimensional fits,
	e.g. with one or zero non-linear parameters.

    o	glm() could give an inappropriate error message if all
	possible coefficients were invalid (e.g. a log-linear binomial
	model with no intercept and a not all positive predictor).

    o	solve() gives clearer error messages for some incorrect usages.
	(PR#8494 and similar)

    o	The gaussian() family was missing the 'valideta' component
	(which could be needed for the "inverse" link function).

	The starting values supplied by the gaussian family could be
	invalid for the "log" and "inverse" link functions.  This is
	now reported.

    o	data.matrix() did not work correctly on zero-row data frames.
	(PR#8496 and other problems.)

    o	The DSC comments in the files from postscript(onefile=FALSE) now
	label all files as having page 1 of 1, as some other software
	seems to expect that.

    o	The axis labels chosen for logarithmic axis are now less
	likely to be linear and inappropriate (when the range is more
	than 10 and less than 100).  (PR#1235)

    o	Staircase lines (types "s" and "S") are now drawn
	continuously rather than a point at a time and so line types,
	mitring and so on work. (PR#2630)

    o	Calling par(mfg) before doing any plotting resulted in NewPage
	never being called on the device, which in turn resulted in
	incorrect output for postcript() and pdf() devices.  (Reported
	by Marc Schwartz in discussion of the non-bug PR#7820.)

    o	terms.formula needed to add parentheses to formulae with
	terms containing '|'.  (PR#8462)

    o	pbirthday() and qbirthday() now also work for very improbable
	events {those you are typically *not* interested in}.

    o	Only source help files starting with an upper- or lower-case
	letter or digit and extension .Rd or .rd are documented to be
	processed.  This is more liberal in that starting with a digit
	is now also allowed, but rule is now enforced.

    o	nls(algorthm="port") was always taking positive numeric
	differences and so could exceed the upper bounds.

    o	methods:::.asEnvironmentPackage() was not allowing for
	versioned installs.

    o	.find.package() now reports which package(s) it cannot find in
	the case it stops with an error.

    o	The standard Unix-alike version of file.show() gives an
	informative message if it cannot open a file rather than the
	(possibly incorrect) 'NO FILE'.

    o	window() did not allow non-overlapping ranges with
	extend = TRUE.	(PR#8545)

    o	pbinom(size = 0) now returns correct values (not NaN).	(PR#8560)

    o	[dp]binom(x, *) for x < 0 now always returns 0. (PR#8700)
	analogous change in pgeom(), pnbinom() and ppois().

    o	[dqpr]geom and [dpqr]nbinom() now all consistently accept prob = 1
	but not prob = 0.  qgeom(prob=1) now gives the correct values
	(not -1).

    o	INSTALL on Unix-alikes was not loading dependent packages when
	preparing for lazy-loading.

    o	qcauchy(1) now gives +Inf instead of just a very large number.

    o	df(0, f1, *) now properly returns Inf, 1, or 0 for f1 < , = , or > 2.

    o	qbinom(), qnbinom() and qpois() now use a better search and
	normally reach the answer very quickly when it is large
	(instead of being slow or infinite-looping).

    o	pt(x, df) lost accuracy in the far tails (when |x| > 1e154) for
	small df (like df = 0.001 for which such extremes are not unlikely).

    o	dbeta(x, a, b) underflowed internally and incorrectly gave 0
	for very small x and a.

    o	None of the warnings about convergence failures or loss of
	precision in nmath (distribution and special functions) were
	being reported to the R user.

    o	dnt was missing from standalone nmath (under Unix-alikes).

    o	split() now accepts factors with numeric (but not storage mode
	integer) codes.

    o	The utilities such as 'check' now report active version numbers
	again, as SVN 'last changed revision' numbers.

    o	addmargins() did not accept a name for 'FUN', only an expression.

    o	'+' for POSIXt objects now takes the tzone from whichever
	object has it, so date+x is the same as x+date if x is numeric.

    o	mean.default() and var() compute means with an additional pass
	and so are often more accurate, e.g. the variance of a
	constant vector is (almost) always zero and the mean of such a
	vector will be equal to the constant value to machine
	precision.  (PR#1228)

	sum(), prod(), mean(), rowSums() and friends use a long double
	accumulator where available and so may be more accurate.  (This
	is particularly helpful on systems such as Sparc and AMD64
	where long double gives considerably greater exponent range
	and precision than double.)

    o	read.dcf() now gives a warning on malformed lines.

    o	add1.[g]lm now try harder to use the environment of the
	formula in the orginal fit to look for objects such as the
	'data' and 'subset' arguments.

    o	gaussian()$aic was inconsistent with e.g. the lm results from
	AIC() and extractAIC() for weighted fits: it treated the weights
	as case weights and not variance factors.

    o	system() on Unix-alikes ignored non-logical values of 'intern' and
	treated 'intern = NA' as true.

    o	as.table() now produces non-NA rownames when converting a
	matrix of more than 26 rows.  (PR#8652)

    o	Partial sorting used an algorithm that was intended only for a
	few values of 'partial' and so could be far slower than a full
	sort.  It now switches to a barebones full sort for more than
	10 values of 'partial' and uses a more efficient recursive
	implementation for 2...10.

    o	summary.glm() returned an estimate of dispersion of Inf for a
	gaussian glm with zero residual degrees of freedom and then
	treated that as a known value.	It now uses the estimate NaN,
	which is consistent with summary.lm().

    o	Sys.sleep() on Unix-alikes was restricted to about 2147 seconds
	and otherwise might never have returned.  (PR#8678)

    o	is(obj, Cl) could wrongly report TRUE when Cl was a classUnion and
	multiple inheritance was involved.

    o	confint[.lm / .default] used label "100 %" for level = 0.999

    o	Empty entries (i.e., extraneous ",") in NAMESPACE files now give
	a better error message early at parsing time instead of a less
	comprehensible one later at load time.

    o	all.equal(n1, n2) could erroneously return NA when n1, n2
	contained large integers.

    o	anova.mlm() didn't handle multi-df effects properly in the
	single-model case (PR#8679)

    o	anova.mlm() had its colnames mangled by data.frame() (needed
	check.names=FALSE).

    o	summary.glm() gave an NA estimate of dispersion for fits with
	zero weights.  (PR#8720)

    o	qhyper() had too small a tolerance for right-continuity on
	some platforms so was not always an inverse to phyper().

    o	rownames<-.data.frame() and dimnames<-.data.frame() tested the
	length(s) of the replacement value(s) before coercion, which
	can change the length (e.g. for class "POSIXlt").

    o	max() and min() ignored the largest/smallest representable
	integer, as well as Inf/-Inf.  (PR#8731)

    o	write.table() assumed factors had integer codes: it now allows
	malformed factors with numeric codes (and otherwise throws an
	error).

    o	Worked around a Solaris restriction which meant that
	Sys.sleep() was only effective for times of up to one second.

    o	sink(, split=TRUE) now works correctly, but is allowed only on
	platforms that support va_copy or __va_copy.  (PR#8716)

    o	factanal(), prcomp() and princomp() now only check that columns
	in the model frame that will be used are numeric (they
	previously also checked columns which were part of negative terms
	in the formula).

    o	Misuse of $ in apply could corrupt memory.  (PR#8718)

    o	apply() could fail if the function returned NULL (e.g. if
	there was a single row).

    o	registerS3method() failed due to a typo. (It was almost never
	used.)

    o	Registering an S3 method for an S3 generic in another package
	that was converted to an S4 generic in the same package as the
	S3 method, registered the method in the wrong place.

    o	Recall() used lookup for the function in use and so could fail
	if that was an S3 method not on the search path.

    o	Rdconv -t Ssgm failed if it encountered \link[opt]{arg}.

    o	uniroot() did not give a warning (as documented) if it failed
	to converge in 'maxiter' steps.	 (PR#8751)

    o	eapply() (and as.list.environment()) did not work for the base
	environment/name space.	 (PR#8761)

    o	Added protection in configure against systems for which using
	xmkmf fails to report a C or C++ compiler.

    o	expand.grid() was constructing a data frame 'by hand' and so
	setting integer row.names (which are documented to be
	character).  It now sets character row names, and
	row.names.data.frame() coerces to character.

    o	qbeta() used == on volatile doubles for its convergence test,
	which failed with gcc 3.3.x on ix86 Linux.  We now use a less
	fragile test (and lose a negligible amount of accuracy).

    o	ls.str() was missing inherits=FALSE, and so could have
	reported on an object of the same name but a different mode in
	the enclosure of the given environment.

    o	logLik.nls assumed that sigma^2 had been estimated, but did
	not count this in the 'df' attribute.




	**************************************************
	*						 *
	*	       2.2 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.2.1 patched


INSTALLATION CHANGES


    o	The macro SOCKLEN_T has been replaced by R_SOCKLEN_T to work
	around a problem with the headers of AIX 5.3.


BUG FIXES

    o	sub(fixed = TRUE) could get wrong the length of the character
	string for elements of the result after the first.

    o	legend() worked out which elements of 'lty' were valid before
	resizing 'lty', and so could fail if 'lty' was a different
	length from 'legend'.

    o	str(<dendrogram>) sometimes used much too many spaces (in 2.2.x).

    o	eigen(eispack=TRUE) accessed areas off the matrix in some
	circumstances (some asymmetric matrices with both complex
	conjugate pair and real eigenvalues).

    o	strptime() in 2.2.1 sometimes did not set $isdst when it was
	previously set.

    o	Another case of infinite influence has been worked around.
	(An addendum to PR#8367.)

    o	qr.coef() worked incorrectly with multiple rhs in the
	LAPACK-using cases. (PR#8476/8)

    o	rbind.data.frame() gave a corrupt data frame if one of the
	named arguments was a zero-row data frame. (PR#8506)

    o	Checks for NULL in the rho argument of the C-level findVar
	function have been added.

    o	The C-level substitute function was handling NULL in its 'rho'
	argument incorrectly.

    o	The code for pgamma() introduced in 2.1.0 failed for large
	values of 'shape' where the previous code was perfectly
	acceptable, despite the claim to be uniformly better.  For
	example, pgamma(0.9e100, 1e100) was NaN.  (PR#8528)

    o	There was no command 'ls' in browser() nor 'next' in debug(),
	despite the documentation (which has been corrected).
	Command 'where' in the browser() no longer changes to
	step-though mode.

    o	factor.scope() could report incorrectly that interaction terms
	were not in the upper scope when such terms in the model and
	the upper scope had different orders for the main effects.
	(Another manifestation of PR#7842.)

    o	The "lm" method of drop1() was giving incorrect results for
	weighted fits (since deviance.lm() was called on a non-"lm" object).

    o	dotchart() was miscalculating the space for the labels in the
	left margin.  (PR#8681)

    o	r <- glm(.....); all.equal(r,r) # now gives TRUE instead of an error

    o	plot.acf() with a multiple time series was sometimes
	miscalculating the 'ylim' value for the plot after the first.
	(PR#8705)



		CHANGES IN R VERSION 2.2.1


USER-VISIBLE CHANGES

    o	options("expressions") has been reduced to 1000: the limit
	of 5000 introduced in 2.1.0 was liable to give crashes from C
	stack overflow.


NEW FEATURES

    o	Use of 'pch' (e.g. in points) in the symbol font 5 is now
	interpreted in the single-byte encoding used by that font.
	Similarly, strwidth now recognizes that font 5 has a different
	encoding from that of the locale.  (These are likely to affect
	the answer only in MBCS locales such as UTF-8.)

    o	The URW font metrics have been updated to versions from late
	2002 which cover more glyphs, including Cyrillic.

    o	New postscript encodings for CP1250 (Windows East European),
	ISO Latin-7 (8859-13, Latvian, Lithuanian and Maori), Cyrillic
	(8859-5), KOI8-R, KOI8-U and CP1251.

    o	configure has more support for the Intel and Portland Group
	compilers on ix86 and x86_64 Linux.

    o	R CMD INSTALL will clean up if interrupted (e.g. by ctrl-C from
	the keyboard).

    o	There is now a comprehensive French translation of the messages,
	thanks to Philippe Grosjean, Frederic Lehobey, Jean Thioulouse
	and Emmanuel Paradis.


DEPRECATED & DEFUNCT

    o	The undocumented use of atan() with two arguments is deprecated:
	instead use atan2() (as documented).

    o	The 'vfont' argument of axis() and mtext() is deprecated
	(it currently warns and does nothing).

    o	The function mauchley.test() is deprecated (was a misspelling)
	and replaced by mauchly.test()


BUG FIXES

    o	The malloc's of AIX and OSF/1 which return NULL for size 0
	are now catered for in src/main/regex.c.

    o	Names of list elements which are missing are now printed as
	$<NA> and not $"NA" (which is how the non-missing name "NA" is
	printed).  (Brought up in discussion of PR#8161.)

    o	help.start() was not linking R.css for use by its front page and
	immediate links (2.2.0 only).

    o	Indexing by character NA matched the name "NA".

    o	The arith-true test used random inputs and did not set the seed, so
	it could fail very occasionally.

    o	arima() with 'fixed' supplied and p=0 for the non-seasonal
	part could give spurious warnings about 'some AR parameters
	were fixed'.

    o	summary.matrix() could give an infinite recursion on some
	classed objects (e.g. those of class "Surv").

    o	The 255th character in an 8-bit character set was not handled
	correctly as a letter on some platforms where C char is
	signed: for example it was printed as \377 and not allowed in
	variable names.	 (Spotted by Alexey Shipunov in Russian
	encodings.)

    o	Conversion from POSIXct to POSIXlt is done more accurately
	around the change of DST in years not supported by the OS
	(pre-1970 on Windows and some others, and in the far past or
	future).

    o	chisq.test(cbind(1:0, c(7,16)), simulate.p = TRUE) gave wrong
	P-values on some platforms. (PR#8224)

    o	pdf() was not writing details of the encoding to the file
	correctly.  (Spotted by Alexey Shipunov in Russian encodings.)

    o	image() was failing with an error when plotting a matrix
	of all NA values.  (PR#8228)

	image() could fail if called with add=FALSE (the default) and
	length(x)=1 for either x or y, as it uses the plot coordinates of
	the previous plot (if any).

    o	tools::checkMD5sums was not accepting file names with spaces in.

    o	The plot() method for TukeyHSD() needed updating after adding
	adjusted p-values.  (PR#8229)

    o	read.fwf() did not work for header = TRUE.  (PR#8226)

    o	diag() failed when its argument had NA values in its dimnames.

    o	[g]sub(pcre=TRUE) did not work correctly with \U and \L in a
	UTF-8 locale, even on the example on the help page.

    o	promptMethods() was failing if the "methods" argument was supplied.

    o	is.loaded() now finds Fortran symbols whether or not the
	registration mechanism has been used.

    o	ISODateTime() mistakenly corrected non-existent times (when
	DST was being started) in the current time zone.

    o	Some replacement operations on data frames gave incorrect
	answers, e.g. DF[3:4, "y"] if column "y" did not exist or was
	a matrix.

    o	getGraphicsEvent() would cause memory corruption if passed an
	empty prompt.

    o	qr() and chol() now pivot the colnames of the result when
	pivoting is used.  (PR#8258)

    o	example(points) omitted pch=0, although it was valid and
	said in the text to be illustrated.

    o	plot.default() had an unused 'lab' argument, thereby preventing
	the 'lab' graphics parameter being passed through '...' .

    o	Although polygon(col = NA) was the stated default, specifying
	NA was not equivalent to omitting the argument (but col=NULL
	was equivalent).

    o	Im(-1) was pi. (PR#8272, a side effect from all previous
	versions of R returning the same value for Im and Arg of
	non-complex numbers.)

    o	symbols(fg) defaulted to colour 1, not par("col") as documented.
	It does now defaults to par("col").

    o	par("family") did not check the length of the value (up to 49
	bytes) and so could segfault.

    o	aggregate.ts() did not allow for rounding in frequencies such
	as 1/5.

    o	prcomp(tol=) was not dropping the sdev's corresponding to
	dropped columns.

    o	Subassignment of a vector which increased the length of the
	vector _and_ had the wrong length of replacement could
	occasionally segfault.	(This has been there since at least
	mid 1997.)

    o	The registration of .Fortran symbols was broken: these could
	only be looked up if there were also .Call symbols registered!

    o	R CMD build was incorrectly rejecting the recommended form of
	name for a translation package, 'Translation-ll'.  (PR#8314)

    o	numericDeriv() gave nonsense results unless the variables were
	real, which was not checked.

    o	predict.prcomp() would sometimes give an error when predicting
	a single observation.  (PR#8324)

    o	mapply() could segfault if MoreArgs was not a list.  (PR#8332)

    o	The arith-true test used identical() on floating-point results,
	and this allowed a failure when the relative difference was
	less than .Machine$double.eps but non-zero.

    o	qbinom() was not accepting p = -Inf when log.p = TRUE, although
	it is a legitimate value.

    o	write.csv[2] only accepted logical constants for 'row.names', and
	now accepts variables.

    o	Conversion of .Rd files did not correctly match braces
	enclosing a whole argument, e.g. \eqn{{\bf a}}{a}.

    o	The C function pythag (used if hypot was not available) would
	infinite-loop on systems with effective optimizing compilers.

    o	Writing long formats (more than 1000 bytes) with connections
	that use dummy_vfprintf could fail on some systems.  The limit
	has been changed to 100000 bytes pending a more complete fix in R
	2.3.0.

    o	Making in src/nmath/standalone without making R was not
	making Rmath.h.

    o	Both the R front-end and INSTALL could find the attempted
	temporary directory name already in use on platforms without
	mktemp (and a genuine Bourne shell /bin/sh, not bash).	Now
	both the process ID and a timestamp are used to create the
	directory name.

    o	[dpqr]gamma now return NaN for an invalid 'shape' parameter
	(rather than throw an error), for consistency with other
	distribution functions.

    o	t() now longer drops dimnames 'list(NULL,NULL)' or 'list(NULL)'.

    o	Influence measures such as rstandard() and cooks.distance()
	could return infinite values rather than NaN for a case which
	was fitted exactly.  Similarly, plot.lm() could fail on such
	examples.  plot.lm(which = 5)  had to be modified to only plot
	cases with hat < 1.  (PR#8367)

	lm.influence() was incorrectly reporting 'coefficients' and
	'sigma' as NaN for cases with hat = 1, and on some platforms
	not detecting hat = 1 correctly.

    o	Rmath.h for standalone Rmath was not recording HAVE_WORKING_LOG,
	so R_log was not available on platforms defining it.

    o	HoltWinters() was using a slightly incorrect formula in the C code.

    o	dir.create() could be confused by a trailing slash on the
	path, and by paths containing drives on Windows.

    o	The search for tcl/tkConfig.sh looked in 'lib' before 'lib64'
	directories (and not at all in /usr/local/lib64) and so might
	prefer 32- to 64-bit versions if both are available.

    o	nlminb() used an uninitialized variable unless bounds were supplied,
	and so failed on 64-bit Solaris.



		CHANGES IN R VERSION 2.2.0


USER-VISIBLE CHANGES

    o	plot(<lm object>) uses a new default 'which = 5'
	for the fourth panel when 'which' is not specified.

    o	The SVN revision number will appear after the date in the
	welcome message.  The date shown is now the date of the last
	change to the sources rather than the date the sources were
	prepared.

    o	is.null(expression()) now returns FALSE.  Only NULL gives TRUE
	in is.null().

    o	graphics::xy.coords, xyz.coords and n2mfrow have been moved to
	the grDevices name space (to be available for grid as well).

	graphics::boxplot.stats, contourLines, nclass.*, and chull
	have been moved to the grDevices name space.  The C code
	underlying chull() has been moved to package grDevices.

    o	split(x, f), split<-() and unsplit() now by default split by all
	levels of a factor f, even when some are empty.
	Use split(x, f, drop = TRUE) if you want the old behavior of
	dropping empty levels.	split() and split<-() are S3 generic
	functions with new arguments 'drop' and '...' and all methods now
	should have 'drop' and '...' arguments as well.

    o	The default for 'allowEscapes' in both read.table() and scan()
	has been changed to FALSE.

    o	The default for 'gcFirst' in system.time() is now TRUE.


NEW FEATURES

    o	.Platform has a new component 'path.sep', the separator used
	between paths in environment variables such as PATH and TEXINPUTS.

    o	anova.mlm() now handles the single-model case.

    o	Hexadecimal values are now allowed for as.numeric() and
	as.integer() on all platforms, and as integer constants in R code.

    o	attach() now prints an information message when objects are
	masked on the search path by or from a newly attached database.

    o	axis() now returns 'at' positions.

    o	axis() has a new argument 'hadj' to control horizontal
	adjustment of labels.

    o	axis.Date() and axis.POSIXct() now accept a 'labels' argument
	(contributed by Gavin Simpson).

    o	barplot() now has arguments 'log = ""' and 'add = FALSE'
	(as in barplot2() from package 'gplots').

    o	baseenv() has been added, to return the base environment.  This
	is currently still NULL, but will change in a future release.

    o	boxplot() now responds to supplying 'yaxs' (via bxp()).
	(Wish of PR#8072.)

    o	capabilities() has a new component 'NLS'.

    o	cbind() and rbind() now react to 'deparse.level' = {0,1,2}
	(as in another system not unlike R).

    o	Experimental versions of cbind() and rbind() in methods package,
	based on new generic function cbind2(x,y) and rbind2().	 This will
	allow the equivalent of S4 methods for cbind() and rbind() ---
	currently only after an explicit activation call, see ?cbind2.

    o	New functions cdplot() and spineplot() for conditional density
	plots and spine plots or spinograms.  Spine plots are now used
	instead of bar plots for x-y scatterplots where y is a factor.

    o	checkDocFiles() in package 'tools' now checks for bad \usage
	lines (syntactically invalid R code).

    o	The nonparametric variants of cor.test() now behave better in
	the presence of ties. The "spearman" method uses the asymptotic
	approximation in that case, and the "kendall" method likewise,
	but adds a correction for ties (this is not necessary in the
	Spearman case).

    o	The X11 dataentry() now has support for X Input Methods
	(contributed by Ei-ji Nakama).

    o	density() is now an S3 generic where density.default() {former
	density()} has new argument 'weights' for specifying observation
	masses different than the default 1/N -- based on a suggestion and
	code from Adrian Baddeley.

    o	download.packages() now carries on if it encounters a download
	error (e.g. a repository with a corrupt index).

    o	dump() now skips missing objects with a warning rather than
	throw an error.

    o	Added "POSIXlt" methods for duplicated() and unique().

    o	Function encoded_text_to_latex() in package tools translates
	Latin 1,2,9 and UTF-8 encoded character vectors to LaTeX
	escape sequences where appropriate.

    o	encodeString() allows justify = "none" for consistency with
	format.default().  Some argument names have been lengthened
	for clarity.

    o	file(), fifo() and pipe() now (if possible) report a reason
	if they fail to open a connection.

    o	format.default() now has a 'width' argument, and 'justify' can
	now centre character strings.

	format.default() has new arguments 'na.encode' to control
	whether NA character strings are encoded (true by default),
	and 'scientific' to control the use of fixed/scientific
	notation for real/complex numbers.

	How format() works on a list is now documented, and uses
	arguments consistently with their usage on an atomic vector.

    o	format.info() now has a 'digits' argument, and is documented
	to work for all atomic vectors (it used to work for all but
	raw vectors.).

    o	New function glob2rx() for translating `wildcard' aka `globbing'
	to regular expressions.

    o	There is a new function gregexpr() which generalizes regexpr()
	to search for all matches in each of the input strings (not
	just the first match).

    o	[g]sub() now have a 'useBytes' argument like grep() and regexpr().

    o	[g]sub(perl = TRUE) support \L and \U in the replacement.

    o	iconv() has been moved from 'utils' to 'base'.

    o	identify()'s default method has additional arguments 'atpen'
	and 'tolerance' (following S).

    o	KalmanForecast() and KalmanLike() now have an optional argument
	fast=FALSE to prevent their arguments being modified.

    o	Exact p-values are available in ks.test() for the one-sided and
	two-sided one-sample Kolmogorov-Smirnov tests.

    o	labels() now has a method for "dist" objects (replacing that
	for names() which was withdrawn in 2.1.0).

    o	library() now explicitly checks for the existence of
	directories in 'lib.loc': this avoids some warning messages.

    o	loadNamespace(keep.source=) now applies only to that name space
	and not others it might load to satisfy imports: this is now
	consistent with library().

    o	match.arg() has a new argument 'several.ok = FALSE'.

    o	max.col() has a new argument for non-random behavior in the
	case of ties.

    o	memory.profile() now uses the type names returned by typeof()
	and no longer has two unlabelled entries.

    o	methods() now warns if it appears to have been called on a
	non-generic function.

    o	The default mosaicplot() method by default draws grey boxes.

    o	nlminb(), similar to that in S-PLUS, added to package 'stats'.

    o	New algorithm "port" (the nl2sol algorithm available in the
	Port library on netlib) added to the nls() function in the
	'stats' package.

    o	object.size() now supports more types, including external
	pointers and weak references.

    o	options() now returns its result in alphabetical order, and is
	documented more comprehensively and accurately.	 (Now all
	options used in base R are documented, including
	platform-specific ones.)

	Some options are now set in the package which makes use of
	them (grDevices, stats or utils) if not already set when the
	package is loaded.

    o	New option("OutDec") to set the decimal point for output conversions.

    o	New option("add.smooth") to add smoothers to a plot, currently
	only used by plot.lm().

    o	pie() has new optional arguments 'clockwise' and 'init.angle'.

    o	plot.lm() has two new plots (for 'which' = 5 or 6), plotting
	residuals or cook distances versus (transformed) leverages - unless
	these are constant.  Further, the new argument 'add.smooth' adds a
	loess smoother to the point plots by default, and 'qqline = TRUE'
	adds a qqline() to the normal plot.
	The default for 'sub.caption' has been improved for long calls.

    o	R.home() has been expanded to return the paths to components
	(which can as from this version be installed elsewhere).

    o	readbin() and writeBin() now support raw vectors as well as
	filenames and connections.

    o	read.dcf() can now read gzipped files.

    o	read.table() now passes 'allowEscapes' to scan().

    o	sample(x, size, prob, replace = TRUE) now uses a faster
	algorithm if there are many reasonably probable values.	 (This
	does mean the results will be different from earlier versions
	of R.)	The speedup is modest unless 'x' is very large _and_
	'prob' is very diffuse so that thousands of distinct values
	will be generated with an appreciable frequency.

    o	scatter.smooth() now works a bit more like other plotting
	functions (e.g., accepts a data frame for argument 'x').
	Improvements suggested by Kevin Wright.

    o	signif() on complex numbers now rounds jointly to give the
	requested number of digits in the larger component, not
	independently for each component.

    o	New generic function simulate() in the 'stats' package with
	methods for some classes of fitted models.

    o	smooth.spline() has a new argument 'keep.data' which allows to
	provide residuals() and fitted() methods for smoothing splines.

    o	Attempting source(file, chdir=TRUE) with a URL or connection
	for 'file' now gives a warning and ignores 'chdir'.

    o	source() closes its input file after parsing it rather than
	after executing the commands, as used to happen prior to
	2.1.0.	(This is probably only significant on Windows where
	the file is locked for a much shorter time.)

    o	split(), split<-(), unsplit() now have a new argument 'drop = FALSE',
	by default not dropping empty levels; this is *not* back compatible.

    o	sprintf() now supports asterisk `*' width or precision
	specification (but not both) as well as `*1$' to `*99$'.  Also the
	handling of `%' as conversion specification terminator is now
	left to the system and doesn't affect following specifications.

    o	The plot method for stl() now allows the colour of the range
	bars to be set (default unchanged at "light gray").

    o	Added tclServiceMode() function to the tcltk package to allow
	updating to be suspended.

    o	terms.formula() no longer allows '.' in a formula unless there
	is a (non-empty) 'data' argument or 'allowDotAsName = TRUE' is
	supplied.  We have found several cases where 'data' had not
	been passed down to terms() and so '.' was interpreted as a
	single variable leading to incorrect results.

    o	New functions trans3d(), the 3D -> 2D utility from persp()'s
	example, and extendrange(), both in package 'grDevices'.

    o	TukeyHSD() now returns p-values adjusted for multiple comparisons
	(based on a patch contributed by Fernando Henrique Ferraz P. da Rosa).

    o	New functions URLencode() and URLdecode(), particularly for use
	with file:// URLs.  These are used by e.g. browse.env(),
	download.file(), download.packages() and various help() print
	methods.

    o	Functions utf8ToInt() and intToUtf8() to work with UTF-8
	encoded character strings (irrespective of locale or OS-level
	UTF-8 support).

    o	[dqp]wilcox and wilcox.test work better with one very large sample
	size and an extreme first argument.

    o	write() has a new argument 'sep'.

    o	write.csv[2] now also support row.names = FALSE.



    o	The specification of the substitutions done when processing
	Renviron files is more liberal: see ?Startup.  It now
	accepts forms like R_LIBS=${HOME}/Rlibrary:${WORKGRP}/R/lib .

    o	Added recommendation that packages have an overview man page
	<pkg>-package.Rd, and the promptPackage() function to create a
	skeleton version.

    o	Replacement indexing of a data frame by a logical matrix index
	containing NAs is allowed in a few more cases, in particular
	always when the replacement value has length one.

    o	Conversion of .Rd files to latex now handles encoding more
	comprehensively, including some support for UTF-8.

    o	The internal regex code has been upgraded to glibc-2.3.5.
	Apart from a number of bug fixes, this should be somewhat
	faster, especially in UTF-8 locales.

    o	PCRE has been updated to version 6.2.

    o	zlib has been updated to version 1.2.3.

    o	bzip2 has been updated to version 1.0.3.

    o	Complex arithmetic is now done by C99 complex types where
	supported.  This is likely to boost performance, but is
	subject to the accuracy with which it has been implemented.

    o	The printing of complex numbers has changed, handling numbers
	as a whole rather than in two parts.  So both real and
	imaginary parts are shown to the same accuracy, with the
	'digits' parameter referring to the accuracy of the larger
	component, and both components are shown in fixed or
	scientific notation (unless one is entirely zero when it is
	always shown in fixed notation).

    o	Error messages from .C() and .Fortran(), and from parsing errors,
	are now more informative.

    o	The date and date-time functions work better with dates more
	than 5000 years away from 1970-01-01 (by making dubious
	assumptions about the calendar in use).

    o	There is now a traditional Chinese translation, and a much more
	extensive Russian translation.


DEPRECATED & DEFUNCT

    o	Capability "IEEE754" is defunct.

    o	loadURL() is defunct: use load(url()).

    o	delay() is defunct: use delayedAssign() instead.

    o	The 'CRAN' argument to update.packages(), old.packages(),
	new.packages(), download.packages() and install.packages() is
	defunct in favour of 'repos'.

    o	write.table0() is deprecated in favour of the much faster
	write.table().

    o	format.char() is deprecated in favour of format.default().

    o	R_HOME/etc/Rprofile is no longer looked for if
	R_HOME/etc/Rprofile.site does not exist.  (This has been
	undocumented since R 1.4.0.)

    o	CRAN.packages() is deprecated in favour of available.packages().

    o	Rd.sty no longer processes pre-2.0.0 conversions containing \Link.

    o	The stubs for the defunct device GNOME/gnome have been removed.

    o	print.matrix() (which has been identical to print.default since
	R 1.7.0) has been removed.


INSTALLATION

    o	LDFLAGS now defaults to -L/usr/local/lib64 on most Linux
	64-bit OSes (but not ia64).  The use of lib/lib64 can be
	overridden by the new variable LIBnn.

    o	The default installation directory is now ${prefix}/${LIBnn}/R,
	/usr/local/lib64/R on most 64-bit Linux OSes and /usr/local/lib/R
	elsewhere.

    o	The places where the doc, include and share directory trees are
	installed can be specified independently: see the R-admin manual.

    o	We now test for wctrans_t, as apparently some broken OSes have
	wctrans but not wctrans_t (which is required by the relevant
	standards) .

    o	Any external BLAS found is now tested to see if the complex
	routine zdotu works correctly: this provides a compatibility
	test of compiler return conventions.

    o	Installation without NLS is now cleaner, and does not install
	any message catalogues.

    o	src/modules/lapack/dlamc.f is now compiled with -ffloat-store
	if f2c/gcc are used, as well as if g77 is used.

    o	All the Fortran code has been checked to be fully F77
	compliant so there are no longer any warnings from F95
	compilers such as gfortran.

    o	The (not-recommended) options --with-system-zlib,
	--with-system-bzlib and -with-system-pcre now have 'system' in
	the name.

    o	If a Java runtime environment is detected at configure time
	its library path is appended to LD_LIBRARY_PATH or equivalent.
	New Java-related variables JAVA_HOME (path to JRE/JDK), JAVA_PROG
	(path to Java interpreter), JAVA_LD_PATH (Java library path)
	and JAVA_LIBS (flags to link against JNI) are made available
	in Makeconf.

    o	Ei-ji Nakama was contributed a patch for FPU control with the
	Intel compilers on ix86 Linux.


MAC OS X INSTALLATION

    o	--with-blas="-framework vecLib" --with-lapack and
	--with-aqua are now the default configure options.

    o	The default framework version name was changed to not contain
	the patch level (i.e. it is now 2.2 instead of 2.2.0).	Also
	it can be overridden at configure time by setting FW_VERSION
	to the desired name.

    o	The Rmath stand-alone library is now correctly installed inside
	the R.framework if R was configured as a framework.  In
	addition, make install-Rmath-framework will install a
	stand-alone Rmath framework in /Library/Frameworks (unless
	overridden by RMATH_FRAMEWORK_DIR specifying full framework
	path and name including the .framework extension).


PACKAGE INSTALLATION

    o	The encoding for a packages' 00Index.html is chosen from the
	Encoding: field (if any) of the DESCRIPTION file and from the
	\encoding{} fields of any Rd files with non-ASCII titles.
	If there are conflicts, first-found wins with a warning.

    o	R_HOME/doc/html/packages.html is now remade by R not Perl code.
	This may result in small changes in layout and a change in
	encoding (to UTF-8 where supported).

    o	The return value of new.packages() is now updated for any
	packages which may be installed.

    o	available.packages() will read a compressed PACKAGES.gz file in
	preference to PACKAGES if available on the repository: this
	will reduce considerably the download time on a dialup connection.

	The downloaded information about a repository is cached for the
	current R session.

    o	The information about library trees found by
	installed.packages() is cached for the current session, and
	updated only if the modification date of the top-level
	directory has been changed.

    o	A data index is now installed for a package with a 'data' dir
	but no 'man' dir (even though it will have undocumented data objects).

    o	contrib.url path for type="mac.binary" has changed from
	bin/macosx/<version> to	bin/macosx/<arch>/contrib/<version>
	where <arch> corresponds to R.version$arch


UTILITIES

    o	checkFF() used by R CMD check has since R 2.0.0 not reported
	missing PACKAGE arguments when testing installed packages with
	name spaces.  It now

	- treats installed and source packages in the same way.

	- reports missing arguments unless they are in a function in
	  the name space with a useDynLib declaration (as the
	  appropriate DLL for such calls can be searched for).

    o	Rd2dvi sets the encoding(s) used appropriately.	 If UTF-8
	encoding is used, latex >= 2003/12/01 is required.

    o	codoc() allows help files named pkg_name-defunct.Rd to have
	undocumented arguments (and not just base-defunct.Rd).


C-LEVEL FACILITIES

    o	C function massdist() {called from density()} has new argument
	'xmass' (= weights).

    o	Raw vectors passed to .C() are now passed as unsigned char *
	rather than as SEXPs.  (Wish of Keith Frost, PR#7853)

    o	The search for symbols in a .C/.Call/... call without a
	package argument now searches for an enclosing name space and
	so finds functions defined within functions in a name space.

    o	R_max_col() has new (5th) argument '*ties_meth' allowing
	non-random behavior in the case of ties.

    o	The header files have been rationalized: the BLAS routine
	LSAME is now declared in BLAS.h not Linpack.h, Applic.h no
	longer duplicates routines from Linpack.h, and Applic.h is
	divided into API and non-API sections.

    o	memory.c has been instrumented so that Valgrind can track R's
	internal memory management.  To use this, configure using
	       --with-valgrind-instrumentation=level
	where level is 1 or 2.	Both levels will find more bugs with
	gctorture(TRUE).  Level 2 makes Valgrind run extremely slowly.

    o	Some support for raw vectors has been added to Rdefines.h.

    o	R_BaseEnv has been added, to refer to the base environment.
	This is currently equal to R_NilValue, but it will change in
	a future release.


BUG FIXES

    o	%/% has been adjusted to make x == (x %% y) + y * ( x %/% y )
	more likely in cases when extended-precision registers were
	interfering.

    o	Operations on POSIXct objects (such as seq(), max() and
	subsetting) try harder to preserve time zones and warn if
	inconsistent time zones are used.

    o	as.function.default() no longer asks for a bug report when
	given an invalid body. (PR#1880, PR#7535, PR#7702)

    o	Hershey fonts and grid output (and therefore lattice output)
	now rescale correctly in fit-to-window resizing on a Windows
	graphics device.  Line widths also scale now.

    o	Plotmath has more support for multibyte characters (contributed
	by Ei-ji Nakama).

    o	The X11() device now hints the window manager so that decorations
	appear reliably under e.g. the GNOME WM	 (contributed
	by Ei-ji Nakama).

    o	Subsetting a matrix or an array as a vector used to attempt to
	use the row names to name the result, even though the
	array might be longer than the row names.  Now this is only
	done for 1D arrays when it is done in all cases, even matrix
	indexing.  (Tidies up after the fix to PR#937.)

    o	Constants in mathlib are declared 'const static double' to
	avoid performance issues with the Intel Itanium compiler.

    o	The parser checks the format of numeric constants more
	thoroughly so for example '123E-' is no longer valid.

    o	contourLines() no longer requires an open device (used to
	start a device unnecessarily).	Fix suggested by Barry Rowlingson.

    o	capabilities() used partial matching but was not documented
	to: it no longer does so.

    o	kernel(1,0) printed wrongly;  kernel(<name-string>, *) now returns
	a named kernel in all cases; plot(kernel(.),..) is more flexible.

    o	qgamma(1,s) didn't give +Inf for some s.

    o	installed.packages() and download.packages() now always
	return a matrix as documented, possibly with 0 rows (rather than
	a 0-length character vector or NULL).

    o	Arithmetic operations on data frames no longer coerce the
	names to syntatically valid names.

    o	Units are now properly recycled in grid layouts
	when 'widths' or 'heights' are shorter than the number of
	columns or rows (PR#8014).

    o	DF <- data.frame(A=1:2, B=3:4); DF[1, 1:3] <- NULL gave a wrong
	error message.

    o	spline()/spinefun()'s C code had a memory access buglet which
	never lead to incorrect results.  (PR#8030)

    o	sum() was promoting logical arguments to double not integer
	(as min() and other members of its group do).

    o	loess() had a bug causing it to occasionally miscalculate
	standard errors (PR#7956).  Reported by Benjamin Tyner, fixed
	by Berwin Turlach.

    o	library(keep.source=) was ignored if the package had a
	name space (the setting of options("keep.source.pkgs") was
	always used).

    o	hist.POSIXct() and hist.Date() now respect par("xaxt").

    o	The 'vfont' argument was not supported correctly in title(),
	mtext(), and axis().  The 'vfont' argument is superseded by
	the par(family=) approach introduced in 2.0.0.	This bug-fix
	just updates the warning messages and documentation to
	properly reflect the new order of things.

    o	The C-level function PrintGenericVector could overflow if
	asked to print a length-1 character vector of several thousand
	characters.  This could happen when printing a list matrix,
	and was fatal up to 2.1.1 and silently truncated in 2.1.1 patched.

    o	What happened for proc.time() and system.time() on
	(Unix-alike) systems which do not support timing was
	incorrectly documented.	 (They both exist but throw an error.)
	Further, systen.time() would give an error in its on.exit
	expression.

    o	weighted.residuals() now does sensible things for glm() fits:
	in particular it now agrees with an lm() fit for a Gaussian glm()
	fit.  (PR#7961).

    o	The 'lm' and 'glm' methods for add1() took the weights and
	offset from the original fit, and so gave errors in the
	(dubious) usage where the upper scope resulted in a smaller
	number of cases to fit (e.g. by omitting missing values in new
	variables).  (PR#8049)

    o	demo() had a 'device' argument that did nothing (although it
	was documented to): it has been removed.

    o	Setting new levels on a factor dropped all existing
	attributes, including class "ordered".

    o	format.default(justify="none") now by default converts NA
	character strings, as the other values always did.

    o	format.info() often gave a different field width from format()
	for character vectors (e.g. including missing values or
	non-printable characters).

    o	axis() now ensures that if 'labels' are supplied as character
	strings or expressions then 'at' is also supplied (since the
	calculated value for 'at' can change under resizing).

    o	Defining S4 methods for "[" had resulted in changed behavior of S3
	dispatch in a very rare case which no longer happens.

    o	Fixed segfault when PostScript font loading fails, e.g., when
	R is unable to find afm files (reported by Ivo Welch).

    o	R CMD BATCH <file> now also works when <file> does not end in a
	newline on Unix-alike platforms.

    o	terms.formula() got confused if the 'data' argument was a list with
	non-syntactic names.

    o	prompt() and hence package.skeleton() now produce *.Rd files that
	give no errors (but warnings) when not edited, much more often.

    o	promptClass() and promptMethods() now also escape "%" e.g. in '%*%'
	and the latter gives a message about the file written.

    o	wilcox.test() now warns when conf.level is set higher than
	achievable, preventing errors (PR#3666) and incorrect answers
	with extremely small sample sizes.

    o	The default (protection pointer) stack size (the default for
	'--max-ppsize') has been increased from 10000 to 50000 in order to
	match the increased default options("expressions") (in R 2.1.0).

    o	The R front-end was expecting --gui=tk not Tk as documented,
	and rejecting --gui=X11.

    o	Rdconv -t latex protected only the first << and >> in a chunk
	against conversion to guillemets.

    o	callNextMethod() and callGeneric() have fixes related to
	handling arguments.

    o	ls.diag() now works for fits with missing data. (PR#8139)

    o	window.default() had an incorrect tolerance and so sometimes
	created too short a series if 'start' or 'end' were zero.

    o	Some (fairly pointless) cases of reshape left a
	temporary id variable in the result (PR#8152)

    o	R CMD build used 'tar xhf' which is invalid on FreeBSD systems
	(and followed tar chf, so there could be no symbolic links in
	the tarball).

    o	Subassignment of length zero vectors to NULL gave garbage
	answers. (PR#8157)

    o	Automatic coercion of raw vectors to lists was missing, so for a
	list (or data frame) z, z[["a"]] <- raw_vector did not work
	and now does.  This also affected DF$a <- raw_vector for a
	data frame DF.

    o	The internal code for commandArgs() was missing PROTECTs.

    o	The width for strwrap() was used as one less than specified.

    o	R CMD INSTALL was not cleaning up after an unsuccessful
	install of a non-bundle which was not already installed.




	**************************************************
	*						 *
	*	       2.1 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.1.1 patched


BUG FIXES

    o	runmed(x, k = -1) now gives an error instead of a seg.fault.

    o	File creation errors in pdf(), postscript(), xfig() resulted
	in a pointer being freed twice.	 (Reported by Matt McCall)

    o	model.matrix(~ .^2, data=foo) now works as most people would
	expect (it used to expand '.' after using the a^2 = a rule).

    o	ftable() and xtabs() had a check for interactions that would
	not work correctly with '.' in the formula.

    o	The formula method for pairs() was ignoring the na.action argument.

    o	scan() with the default separator (only) was stripping backslashes
	inside quoted string inputs even if allowEscapes = FALSE.

    o	The "col" parameter to pairs() is now treated consistently with
	plot():	 it affects the data, not the axes.  (Patch submitted
	by Olaf Mersmann)

    o	Sweave failed for \Sexpr{character(0)}.	 Sweave-test-1.Rnw
	contained a print() statement that is no longer needed.

    o	Typo meant that R_alloc was limited to 2^31 not 2^34 on 64-bit
	builds of R.

    o	pgamma(Inf, shape) did not terminate for shape = 1.1 and some
	other values (but not all) (PR#8001).  This affected
	pchisq(Inf, df1) and pf(Inf, df1, Inf) for some values of df1.

    o	regexpr("[a-z]", ...) could cause a buffer overrun with multi-byte
	character sets, leading to random errors later.

    o	Installing a package with a 'data' directory which contains
	files but those files generate no objects (e.g. the BioC
	package	makecdfenv) created an incorrectly formatted data
	index that data(package="pkg") could not read.

    o	density(1/(0:2)) now works again (PR#8033).

    o	make.names() was not respecting the allow_=FALSE argument.

    o	Arg(-1) now gives pi, not 0; Arg(0i + -1) always worked.

    o	--enable-linux-lfs had been broken at 2.1.0.

    o	Printing was not allowing for double-width characters in its
	layout.

    o	axTicks() is now also correct for reverse axis.	 (PR#7973)

    o	signif() rounded some numnbers near 1e-308 to the wrong
	number of places (this showed up in the print-tests.R), and made
	unnecessary rounding errors on some platforms on e.g. signif(18000, 3).

    o	window() was sometimes failing incorrectly due to representation
	errors when the new and old deltat were not both integers
	(e.g. multiples of 0.1).

    o	The 'lm' methods for add1() and drop1() ignored offsets (which
	were added for lm() after they written).  (PR#8049)

    o	atan2(0+1i, 0+0i) was incorrectly NA (from a typo in complex.c).

    o	The POSIXct method for as.Date() was rounding part days
	before 1970-01-01 upwards rather than discarding them.

    o	qpois() was using an incorrect starting point and so could be
	unnecessarily slow for large lambda.  (PR#8058)

    o	Formatting of complex numbers with nsmall > 0 could be
	incorrect (and was in print-tests.Rout) because of a typo.

    o	The test for new levels when predicting using model.frame()
	sometimes reported levels that were not actually used.

    o	order(c("5","6",NA,"4",NA), na.last=FALSE) was incorrect.

    o	Coercion to raw could give spurious messages about discarding
	imaginary parts.

	Coercion of a list to raw was behaving inconsistently for
	out-of-range values (and not warning).

    o	cor.test(method = "spearman") gave NA p-values for _very_ long
	vectors. (PR#8087)

    o	Switching to the Mersenne-Twister RNG could cause a segfault on
	first use.

	A user-supplied RNG without user_unif_{nseed,seedloc} was
	being re-initialized at each call.

    o	Reading very short tables from stdin() with read.table would
	fail because of a typo.




		CHANGES IN R VERSION 2.1.1


NEW FEATURES

    o	bug.report() now reports the locale in use.

    o	upgrade.packageStatus() allows user input "c" to cancel the
	upgrade, just as update.packages() does.

    o	glm() now accepts 1D arrays (e.g. tables) as a response,
	dropping them to a vector whilst preserving names.

    o	df() with one infinite df now works (to match pf()).

    o	Added tclServiceMode() function to the tcltk package to allow
	updating to be suspended.

    o	The Encoding: field of a DESCRIPTION file is now documented,
	and used by packageDescription() and library(help=).

    o	There has been progress on translations: existing translations
	have been revised and expanded, and French and Korean have
	been added.

	The Windows installer supports a wide range of languages for
	installation.


BUG FIXES

    o	lm(qr=FALSE) now works.

    o	predict.glm() not longer loses names for "response" predictions.
	(PR#7792)

    o	Typo in menu(graphics=TRUE) meant it failed on Unix if tcltk
	was not available.

    o	When names.dist() was removed, the result of cmdscale() lost
	its rownames.  The example also lost the labels.

    o	R CMD check assumed 'tar' was GNU tar and so supported -z.

    o	read.table() was not handing escaped quotes inside quoted fields
	in the first five lines of the file.  (PR#7789)

	It was also not handling correctly EOF in the first five lines
	when reading from stdin().  (PR#7772)

    o	'make uninstall' was incomplete.

    o	make.packages.html() called by help.start() was failing if
	there were installed packages with help titles invalid in the
	current locale.

    o	printCoefmat(signif.legend = FALSE) was non-functional. (PR#7802)

    o	Some as.date.frame() methods failed because the expression
	deparsed into multiple lines. (PR#7808)

    o	setRepositories() had a typo. (PR#7810)

    o	Printing arrays/data frames with multibyte characters in the
	column labels was sometimes misaligned or using excessive space.
	(PR#7803)

    o	The Tcl/Tk console did not support multibyte characters.

    o	as.POSIXlt() could give infinite recursion if passed a corrupt
	"POSIXct" object (generated by an incorrect call to c.POSIXct,
	PR#7826).

    o	update.packages() was not passing 'type' correctly to
	install.packages().

    o	Printing the result of an unbalanced model.tables() call
	sometimes got confused if terms() had rearranged interaction
	terms.	(PR#7829)

    o	.Platform$pkgType was wrong on the CRAN MacOS X build, and
	.install.macbinary() was missing.

    o	as.personList() as used by citation() got confused by names
	containing "and".  (PR#7797)

    o	Subscripting an array by a matrix containing zero or negative
	values or the wrong number of columns was not handled
	consistently. (PR#7824)

    o	select.list(multiple=TRUE) now detects and tries again for invalid
	text input.

    o	add1.[g]lm could give strange results with interaction terms
	when the model and the upper scope had different orders for
	the main effects.  (PR#7842)

    o	A bug had sneaked into the anova.mlmlist() code, affecting the
	Greenhouse-Geisser epsilon. Code wrongly assumed a matrix to
	be symmetric. (Thanks to Bela Bauer.)

    o	anova.mlmlist() and mauchley.test() are now more tolerant to rank
	deficiency in the M and X matrices (also when they are implicitly
	generated via model.matrix()).

    o	anova.mlm had a scoping issue (PR#7898)

    o	pf() with infinite df is allowed again.	 It is now more accurate
	for extreme ratios of dfs, especially when there is a
	non-centrality parameter.

    o	df() was inaccurate for large df (1e16 or greater).

    o	dt() was inaccurate for large df (1e9 or greater) with a
	non-centrality parameter.

    o	runmed(*, algorithm="Turlach") seg.faulted in rare cases.

    o	strwrap() now makes a reasonable job of text that is invalid in the
	current locale.

    o	Reading with encoding "UCS-2LE" will remove any Byte Order
	Mark, as most implementations of iconv fail to handle BOMs
	(which are present in 'Windows Unicode' files).

    o	unique() for a list was incorrectly reporting `unimplemented'.

    o	The parser's contextstack was not protected against overflow,
	e.g. more than 50 unmatched '('.  (PR#7859)

    o	source(file, chdir = TRUE) was not checking that 'file' was a
	filepath (rather than a URL).  For 2.1.0 only, it did not work
	even if 'file' was a filepath.

    o	Hershey fonts were being sized based on pixels not points so came
	out too small on devices where pixels were noticeably different
	from points (e.g., win.printer() and high-resolution screens).

	Fix means that default size of Hershey fonts may be slightly
	different, for example, smaller by default on PostScript and PDF.

    o	The branch cuts in the complex versions of the inverse
	trigonometric and hyperbolic functions were non-standard.
	(PR#7871)

    o	truncate() on file() connections was limited to files < 2Gb.  It
	now works for larger files at least on 64-bit OSes and others
	where ftruncate supports such files.  (Related to PR#7879)

    o	proj.aovlist() did not work correctly on objects fitted from a
	data frame with row names.

    o	The coding standards recommendations had
	nuke-trailing-whitespace where newer versions of ESS need
	ess-nuke-trailing-whitespace.  (PR#7888)

    o	package.skeleton() missed the first newline in the DESCRIPTION file.

    o	pbirthday() reported p = 1 too often when coincident > 2.

    o	plot(1:3, exp(1:3), log = "y", ylim = c(30,1)) {reversed
	log-scale axis} now works, based on Uwe Ligges' suggestions.
	(PR#7894)

    o	install.packages() was aborting when a package in a bundle was
	chosen from a menu.  It failed if more than one package in a
	bundle was chosen from the command line.

    o	qcauchy() suffered from underflow in the extreme tails.	 (PR#7902)

    o	Printing of raw matrices/arrays was not implemented. (PR#7912)

    o	getCallingDLL()'s default first argument did not correspond to
	its description and has been changed.  The mismatch caused
	symbols in .C/.Call/.Fortran calls without a PACKAGE= argument
	to be potentially looked up in the wrong name space.

    o	Binary save() of raw vectors was not working correctly on
	big-endian platforms.  (PR#7812)

    o	as.Date.factor() now accepts a format argument.

    o	Workaround added for FreeBSD which does not have alloca.h _and_
	does not allow alloca() to be declared.

    o	identify() now respects 'cex'.	(PR#660)

	Warnings from identify() are now printed immediately even on
	consoles with delayed printing.



		CHANGES IN R VERSION 2.1.0


USER-VISIBLE CHANGES

    o	box plots {by boxplot() or bxp()} now have the median line three
	times the normal line width in order to distinguish it from the
	quartile ones.

    o	Unix-alike versions of R can now be used in UTF-8 locales on
	suitably equipped OSes.	 See the internationalization section
	below.

    o	The meaning of 'encoding' for a connection has changed: See the
	internationalization section below.

    o	There has been some rationalization of the format of
	warning/error messages, to make them easier to translate.
	Generally names of functions and arguments are single-quoted,
	and classes double-quoted.

    o	Reading text files with embedded "\" (as in Windows file names)
	may now need to use scan(* , allowEscapes = FALSE), see also below.


NEW FEATURES

    o	%% now warns if its accuracy is likely to be affected by lack
	of precision (as in 1e18 %% 11, the unrealistic expectation of
	PR#7409), and tries harder to return a value in range when it is.

    o	abbreviate() now warns if used with non-ASCII chars, as the
	algorithm is designed for English words.

    o	The default methods for add1() and drop1() check for changes
	in the number of cases in use.

	The "lm" and "glm" methods for add1() quoted the <none> model
	on the original fitted values when using (with a warning) a
	smaller set of cases for the expanded models.

    o	Added alarm() function to generate a bell or beep or visual alert.

    o	all/any() now attempt to coerce their arguments to logical, as
	documented in the Blue Book.  This means e.g. any(list()) works.

    o	New functions for multivariate linear models: anova.mlm(),
	SSD(), estVar(), mauchley.test() (for sphericity).

	vcov() now does something more sensible for "mlm" class objects.

    o	as.data.frame.table() has a new argument 'responseName'
	(contributed by Bill Venables).

    o	as.dist() and cophenetic() are now generic, and the latter has a
	new method for objects of class "dendrogram".

    o	as.ts() is now generic.

    o	binomial() has a new "cauchit" link (suggested by Roger Koenker).

    o	chisq.test() has a new argument 'rescale.p'.  It is now possible
	to simulate (slowly) the P value also in the 1D case
	(contributed by Rolf Turner).

    o	choose(n,k) and lchoose(.) now also work for arbitrary (real) n
	in accordance with the general binomial theorem.  choose(*,k)
	is more accurate (and faster) for small k.

    o	Added colorRamp() and colorRampPalette() functions for color
	interpolation.

    o	colSums()/rowSums() now allow arrays with a zero-length extent
	(requested by PR#7775).

    o	confint() has stub methods for classes "glm" and "nls" that
	invoke those in package MASS.  This avoids using the "lm"
	method for "glm" objects if MASS is not attached.

	confint() has a default method using asymptotic normality.

    o	contr.SAS() has been moved from the 'nlme' package to the
	'stats' package.

    o	New function convertColors() maps between color spaces.
	colorRamp() uses it.

    o	The cov() function in the non-Pearson cases now ranks data after
	removal of missing values, not before.	The pairwise-complete
	method should now be consistent with cor.test.	(Code
	contributed by Shigenobu Aoki.)

    o	Added delayedAssign() function to replace delay(), which is now
	deprecated.

    o	dir.create() has a new argument 'recursive' serving the same
	purpose as Unix's mkdir -p.

    o	do.call() now takes either a function or a character string as
	its first argument.  The supplied arguments can optionally be
	quoted.

    o	duplicated() and unique() now accept "list" objects, but are
	fast only for simple list objects.

    o	ecdf() now has jumps of the correct size (a multiple of 1/n)
	if there are ties.  (Wished by PR#7292).

    o	eff.aovlist() assumed orthogonal contrasts for any term
	with more than one degree of freedom: this is now documented
	and checked for.  Where each term only occurs in only one
	stratum the efficiencies are all one: this is detected and
	orthogonal contrasts are not required.

    o	New function encodeString() to encode character strings in the
	same way that printing does.

    o	file("clipboard") now work for reading the primary selection on
	Unix-alikes with an active X11 display.	 (It has long worked
	for reading and writing under Windows.)	 The secondary
	selection can also be read: see ?file.

	file() now allows mode "w+b" as well as "w+".

    o	file.append() has been tuned, including for the case of
	appending many files to a single file.

    o	Functions flush.console() and select.list() are now available
	on all platforms.  There is a Tcl/Tk-based version of
	select.list() called tk_select.list() in package tcltk.

    o	gc() now reports maximum as well as current memory use.

    o	A new function getGraphicsEvent() has been added which will allow
	mouse or keyboard input from a graphics device. (NB: currently
	only the Windows screen device supports this function.	This
	should improve before the 2.1.0 release.)

    o	New functions gray.colors()/grey.colors() for gray color
	palettes.

    o	grep(), gsub(), sub() and regexpr() now always attempt to
	coerce their 'pattern', 'x', 'replacement' and 'text'
	arguments to character.	 Previously this was undocumented but
	done by [g]sub() and regexpr() for some values of their
	other arguments.  (Wish of PR#7742.)

    o	gsub/sub() have a new 'fixed' method.

    o	New function hcl() for creating colors for a given hue,
	chroma and luminance (i.e. perceptual hsv).

    o	isTRUE() convenience function to be used for programming.

    o	kmeans() now returns an object of class "kmeans" which has a
	print() method.

	Two alternative algorithms have been implemented.

	If the number of centres is supplied, it has a new option of
	multiple random starts.

    o	The limits on the grid size in layout() are now documented, and
	have been raised somewhat by using more efficient internal
	structures.

    o	legend() now accepts positioning by keyword, e.g. "topleft",
	and can put a title within the legend.	(Suggested by Elizabeth
	Purdom in PR#7400.)

    o	mahalanobis() now has a '...' argument which is passed to solve()
	for computing the inverse of the covariance matrix, this replaces
	the former 'tol.inv' argument.

    o	menu() uses a multi-column layout if possible for more than
	10 choices.

	menu(graphics = TRUE) is implemented on most platforms via
	select.list() or tk_select.list().

    o	New function message() in 'base' for generating "simple"
	diagnostic messages, replacing such a function in the
	'methods' package.

    o	na.contiguous() is now (S3) generic with first argument
	renamed to 'object'.

    o	New function normalizePath() to find canonical paths (and on
	Windows, canonical names of components).

    o	The default in options("expressions") has been increased to 5000,
	and the maximal settable value to 500000.

    o	p.adjust() has a new method "BY".

    o	pbeta() now uses a different algorithm for large values of at
	least one of the shape parameters, which is much faster and is
	accurate and reliable for very large values.  (This affects
	pbinom(), pf(), qbeta() and other functions using pbeta at C
	level.)

    o	pch="." now by default produces a rectangle at least 0.01" per
	side on high-resolution devices.  (It used to be one-pixel
	square even on high-resolution screens and Windows printers,
	but 1/72" on postscript() and pdf() devices.)  Additionally,
	the size is now scalable by 'cex'; see ?points and note that
	the details are subject to change.

    o	pdf() now responds to the 'paper' and 'pagecentre'
	arguments.  The default value of 'paper' is "special"
	for backward-compatibility (this is different from the
	default for postscript()).

    o	plot.data.frame() tries harder to produce sensible plots for
	non-numeric data frames with one or two columns.

    o	The predict() methods for "prcomp" and "princomp" now match
	the columns of 'newdata' to the original fit using column
	names if these are available.

    o	New function recordGraphics() to encapsulate calculations
	and graphics output together on graphics engine display list.
	To be used with care.

    o	New function RSiteSearch() to query R-related resources
	on-line (contributed by Jonathan Baron and Andy Liaw).

    o	scan() arranges to share storage of duplicated character
	strings read in: this can dramatically reduce the memory
	requirements for large character vectors which will
	subsequently be turned into factors with relatively few
	levels.	 For a million items this halved the time and reduced
	storage by a factor of 20.

	scan() has a new argument 'allowEscapes' (default TRUE) that
	controls when C-style escapes in the input are interpreted.
	Previously only \n and \r were interpreted, and then only
	within quoted strings when no separator was supplied.

	scan() used on an open connection now pushes back on the
	connection its private `ungetc' and so is safer to use to
	read partial lines.

    o	scatter.smooth() and loess.smooth() now handle missing values
	in their inputs.

    o	seq.Date() and seq.POSIXt() now allow 'to' to be before 'from'
	if 'by' is negative.

    o	sprintf() has been enhanced to allow the POSIX/XSI specifiers
	like "%2$6d", and also accepts "%x" and "%X".

	sprintf() does limited coercion of its arguments.

	sprintf() accepts vector arguments and operates on them in
	parallel (after re-cycling if needed).

    o	New function strtrim() to trim character vectors to a display
	width, allowing for double-width characters in multi-byte
	character sets.

    o	subset() now has a method for matrices, similar to that for
	data frames.

    o	Faster algorithm in summaryRprof().

    o	sunflowerplot() has new arguments 'col' and 'bg'.

    o	sys.function() now has argument 'which' (as has long been
	presaged on its help page).

    o	Sys.setlocale("LC_ALL", ) now only sets the locale categories
	which R uses, and Sys.setlocale("LC_NUMERIC", ) now gives a
	warning (as it can cause R to malfunction).

    o	unclass() is no longer allowed for environments and external
	pointers (since these cannot be copied and so unclass() was
	destructive of its argument).  You can still change the
	"class" attribute.

    o	File-name matching is no longer case-insensitive with unz()
	connections, even on Windows.

    o	New argument 'immediate.' to warning() to send an immediate
	warning.

    o	New convenience wrappers write.csv() and write.csv2().

    o	There is a new version for write.table() which is implemented in C.
	For simple matrices and data frames this is several times
	faster than before, and uses negligible memory compared to the
	object size.

	The old version (which no longer coerces a matrix to a data
	frame and then back to a matrix) is available for now as
	write.table0().

    o	The functions xinch(), yinch(), and xyinch() have been moved
	from package 'grDevices' into package 'graphics'.


    o	Plotmath now allows underline in expressions.  (PR#7286,
	contributed by Uwe Ligges.)

    o	BATCH on Unix no longer sets --gui="none" as the X11 module
	is only loaded if needed.

    o	The X11 module (and the hence X11(), jpeg() and png() devices
	and the X-based dataentry editor) is now in principle
	available under all Unix GUIs except --gui="none", and this is
	reflected in capabilities().

	capabilities("X11") determines if an X server can be accessed,
	and so is more likely to be accurate.

    o	Printing of arrays now honours the 'right' argument if there
	are more than two dimensions.

    o	Tabular printing of numbers now has headers right-justified, as
	they were prior to version 1.7.0 (spotted by Rob Baer).

    o	Lazy-loading databases are now cached in memory at first use:
	this enables R to run much faster from slow file systems such
	as USB flash drives.  There is a small (less than 2Mb)
	increase in default memory usage.

    o	The implicit class structure for numeric vectors has been
	changed, so that integer/real vectors try first methods for
	class "integer"/"double" and then those for class "numeric".

	The implicit classes for matrices and arrays have been changed
	to be "matrix"/"array" followed by the class(es) of the
	underlying vector.

    o	splines::splineDesign() now allows the evaluation of a B-spline
	basis everywhere instead of just inside the "inner" knots, by
	setting the new argument `outer.ok = TRUE'.

    o	Hashing has been tweaked to use half as much memory as before.

    o	Readline is not used for tilde expansion when R is run with
	--no-readline, nor from embedded applications.	Then "~name"
	is no longer expanded, but "~" still is.

    o	The regular expression code is now based on that in glibc 2.3.3.
	It has stricter conformance to POSIX, so metachars such as
	{ } + * may need to be escaped where before they did not
	(but could have been).

    o	New encoding 'TeXtext.enc' improves the way postscript() works
	with Computer Modern fonts.

    o	Replacement in a non-existent column of a data frame tries
	harder to create a column of the correct length and so avoid a
	corrupt data frame.

    o	For Windows and readline-based history, the saved file size is
	re-read from R_HISTSIZE immediately before saving.

    o	Collected warnings during start-up are now printed before the
	initial prompt rather than after the first command.

    o	Changes to package 'grid':

	- preDrawDetails(), drawDetails(), and postDrawDetails()
	  methods are now recorded on the graphics engine
	  display list.	  This means that calculations within these
	  methods are now run when a device is resized or
	  when output is copied from one device to another.

	- Fixed bug in grid.text() when 'rot' argument has length 0.
	  (privately reported by Emmanuel Paradis)

	- New getNames() function to return just the names of all top-level
	  grobs on the display list.

	- Recording on the grid display list is turned off within
	  preDrawDetails(), drawDetails(), and postDrawDetails() methods.

	- Grid should recover better from errors or user-interrupts
	  during drawing (i.e., not leave you in a strange viewport
	  or with strange graphical parameter settings).

	- New function grid.refresh() to redraw the grid display list.

	- New function grid.record() to capture calculations
	  with grid graphics output.

	- grobWidth and grobHeight ("grobwidth" and "grobheight" units)
	  for primitives (text, rects, etc, ...) are now
	  calculated based on a bounding box for the relevant grob.

	  NOTE: this has changed the calculation of the size of a scalar
	  rect (or circle or lines).

	- New arguments 'warn' and 'wrap' for function grid.grab()

	- New function grid.grabExpr() which captures the output from
	  an expression (i.e., not from the current scene) without
	  doing any drawing (i.e., no impact on the current scene).

	- upViewport() now (invisibly) returns the path that it goes up
	  (suggested by Ross Ihaka).

	- The 'gamma' gpar has been deprecated (this is a device property
	  not a property of graphical objects;	suggested by Ross Ihaka).

	- New 'lex' gpar;  a line width multiplier.

	- grid.text() now handles any language object as mathematical
	  annotation (instead of just expressions).

	- plotViewport() has default value for 'margins' argument (that match
	  the default value for par(mar)).

	- The 'extension' argument to dataViewport() can now be vector,
	  in which case the first value is used to extend the xscale and
	  the second value is used to extend the y scale.
	  (suggested by Ross Ihaka).

	- All 'just' arguments (for viewports, layouts, rectangles, text)
	  can now be numeric values (typically between 0 [left] and 1 [right])
	  as well as character values ("left", "right", ...).

	  For rectangles and text, there are additional 'hjust' and 'vjust'
	  arguments which allow numeric vectors of justification in
	  each direction (e.g., so that several pieces of text can have
	  different justifications).
	  (suggested by Ross Ihaka)

	- New 'edits' argument for grid.xaxis() and grid.yaxis() to
	  allow specification of on-the-fly edits to axis children.

	- applyEdit(x, edit) returns x if target of edit (i.e., child
	  specified by a gPath) cannot be found.

	- Fix for calculation of length of max/min/sum unit.  Length is
	  now (correctly) reported as 1 (was reported as length of first arg).

	- Viewport names can now be any string (they used to have to be a
	  valid R symbol).

	- The 'label' argument for grid.xaxis() and grid.yaxis() can now
	  also be a language object or string vector, in which case it
	  specifies custom labels for the tick marks.


INTERNATIONALIZATION

    o	Unix-alike versions of R can now be used in UTF-8 and other
	multi-byte locales on suitably equipped OSes if configured
	with option --enable-mbcs (which is the default).  [The
	changes to font handling in the X11 module are based on the
	Japanization patches of Ei-ji Nakama.]

	Windows versions of R can be used in `East Asian' locales on
	suitable versions of Windows.

	See the 'Internationalization' chapter in the 'Installation
	and Administration' manual.

    o	New command-line flag --encoding to specify the encoding to
	be assumed for stdin (but not for a console).

    o	New function iconv() to convert character vectors between
	encodings, on those OSes which support this.  See the new
	capabilities("iconv").

    o	The meaning of 'encoding' for a connection has changed: it now
	allows any charset encoding supported by iconv on the
	platform, and can re-encode output as well as input.

	As the new specification is a character string and the old was
	numeric, this should not cause incorrect operation.

    o	New function localeToCharset() to find/guess encoding(s) from
	the locale name.

    o	nchar() returns the true number of bytes stored (including any
	embedded nuls), this being 2 for missing values.  It has an
	optional argument 'type' with possible non-default values
	"chars" and "width" to give the number of characters or the
	display width in columns.

    o	Characters can be entered in hexadecimal as e.g. \x9c, and in
	UTF-8 and other multibyte locales as \uxxxx, \u{xxxx},
	\Uxxxxxxxx or \U{xxxxxxxx}.  Non-printable Unicode characters
	are displayed C-style as \uxxxx or \Uxxxxxxxx.

    o	LC_MONETARY is set to the locale, which affects the result of
	Sys.localeconv(), but nothing else in R itself.	 (It could
	affect add-on packages.)

    o	source() now has an 'encoding' argument which can be used to
	make it try out various possible encodings.  This is made use
	of by example() which will convert (non-UTF-8) Latin-1 example
	files in a UTF-8 locale.

    o	read/writeChar() work in units of characters, not bytes.

    o	.C() now accepts an ENCODING= argument where re-encoding is
	supported by the OS.  See `Writing R Extensions'.

    o	delimMatch (tools) now reports match positions and lengths in
	units of characters, not bytes.	 The delimiters can be
	strings, not just single ASCII characters.

    o	.Rd files can indicate via a \encoding{} argument the encoding
	that should be assumed for non-ASCII characters they contain.

    o	Phrases in .Rd files can be marked by \enc{}{} to show a
	transliteration to ASCII for use in e.g. text help.

    o	The use of 'pch' in points() now allows for multi-byte character
	sets: in such a locale a glyph can either be specified as a
	multi-byte single character or as a number, the Unicode point.

    o	New function l10n_info() reports on aspects of the
	locale/charset currently in use.

    o	scan() is now aware of double-byte locales such as Shift-JIS
	in which ASCII characters can occur as the second ('trail')
	byte.

    o	Functions sQuote() and dQuote() use the Unicode directional
	quotes if in a UTF-8 locale.

    o	The infrastructure is now in place for C-level error and warning
	messages to be translated and used on systems with Native
	Language Support.  This has been used for the startup message
	in English and to translate Americanisms such as 'color' into
	English: translations to several other languages are under
	way, and some are included in this release.

	See 'Writing R Extensions' for how to make use of this in a
	package: all the standard packages have been set up to do
	translation, and the 'language' 'en@quot' is implemented to
	allow Unicode directional quotes in a UTF-8 locale.

    o	R-level stop(), warning() and message() messages can be
	translated, as can other messages via the new function
	gettext(). Tools xgettext() and xgettext2pot() are provided in
	package tools to help manage error messages.

	gettextf() is a new wrapper to call sprintf() using
	gettext() on the format string.

    o	Function ngettext() allows the management of singular and
	plural forms of messages.


UTILITIES

    o	New functions mirror2html() and checkCRAN().

    o	R CMD check has a new option '--use-valgrind'.

    o	R CMD check now checks that Fortran and C++ files have LF
	line endings, as well as C files.  It also checks Makevars[.in]
	files for portable compilation flags.

    o	R CMD check will now work on a source tarball and prints out
	information about the version of R and the package.

    o	tools:::.install_package_code_files() (used to collate R files
	when installing packages) ensures files are separated by a
	line feed.

    o	vignette() now returns an object of class "vignette" whose
	print() method opens the corresponding PDF file.  The edit()
	method can be used to open the code of the vignette in an
	editor.

    o	R CMD INSTALL on Unix has a new option '--build' matching
	that on Windows, to package as tarball the installed package.

    o	R CMD INSTALL on Unix can now install binary bundles.

    o	R CMD build now changes src files to LF line endings if necessary.

    o	R CMD build now behaves consistently between source and binary
	builds: in each case it prepares a source directory and then
	either packages that directory as a tarball or calls R CMD
	INSTALL --build on the prepared sources.

	This means that R CMD build --binary now respects
	.Rbuildignore and will rebuild vignettes (unless the option
	--no-vignettes is used).  For the latter, it now installs the
	current sources into a temporary library and uses that version
	of the package/bundle to rebuild the vignettes.

    o	R CMD build now reports empty directories in the source tree.

    o	New function write_PACKAGES() in package 'tools' to help with
	preparing local package repositories.  (Based on a contribution
	by Uwe Ligges.)	 How to prepare such repositories is
	documented in the 'R Installation and Administration' manual.

    o	package.skeleton() adds a bit more to DESCRIPTION.

    o	Sweave changes:

	- \usepackage[nogin]{Sweave} in the header of an Sweave file
	  supresses auto-setting of the graphical parameter like width
	  of graphics.

	- The new \SweaveInput{} command works similar to LaTeX's
	  \input{} command.

	- Option value strip.white=all strips all blank lines from the
	  output of a code chunk.

	- Code chunks with eval=false are commented out by Stangle() and
	  hence no longer tested by R CMD check.


DOCUMENTATION

    o	File doc/html/faq.html no longer exists, and doc/manual/R-FAQ.html
	(which has active links to other manuals) is used instead.
	(If makeinfo >= 4.7 is not available, the version on CRAN is
	linked to.)

    o	Manual 'Writing R Extensions' has further details on writing
	new front-ends for R using the new public header files.

    o	There are no longer any restrictions on characters in the
	\name{} field of a .Rd file: in particular _ is supported.


C-LEVEL FACILITIES

    o	There are new public C/C++ header files Rinterface.h and
	R_ext/RStartup.h for use with external GUIs.

    o	Added an onExit() function to graphics devices, to be executed
	upon user break if non-NULL.

    o	ISNAN now works even in C++ code that undefines the 'isnan' macro.

    o	R_alloc's limit on 64-bit systems has been raised from just
	under 2^31 bytes (2Gb) to just under 2^34 (16Gb), and is now checked.

    o	New math utility functions  log1pmx(x), lgamma1p(x),
	logspace_add(logx, logy), and logspace_sub(logx, logy).


DEPRECATED & DEFUNCT

    o	The aqua module for MacOS X has been removed: --with-aqua now
	refers to the unbundled Cocoa GUI.

    o	Capabilities "bzip2", "GNOME", "libz" and "PCRE" are defunct.

    o	The undocumented use of UseMethod() with no argument was
	deprecated in 2.0.1 and is now regarded as an error.

    o	Capability "IEEE754" is deprecated.

    o	The 'CRAN' argument to update.packages(), old.packages(),
	new.packages(), download.packages() and install.packages() is
	deprecated in favour of 'repos', which replaces it as a
	positional argument (so this is only relevant for calls with
	named args).

    o	The S3 methods for getting and setting names of "dist" objects
	have been removed (as they provided names with a different
	length from the "dist" object itself).

    o	Option "repositories" is no longer used and so not set.

    o	loadURL() is deprecated in favour of load(url()).

    o	delay() is deprecated.	Use delayedAssign() instead.


INSTALLATION CHANGES

    o	New configure option --enable-mbcs to enable support for
	UTF-8 locales, on by default.

    o	R_XTRA_[CF]FLAGS are now used during the configuration tests,
	and [CF]PICFLAGS if --enable-R-shlib was specified.  This
	ensures that features such as inlining are only used if the
	compilation flags specified support them.  (PR#7257)

    o	Files FAQ, RESOURCES, doc/html/resources.html are no longer in
	the SVN sources but are made by 'make dist'.

    o	The GNOME GUI is unbundled, now provided as a package on CRAN.

    o	Configuring without having the recommended packages is now an
	error unless --with-recommended-packages=no (or equivalent) is used.

    o	Configuring without having the X11 headers and libraries is now
	an error unless --with-x=no (or equivalent) is used.

    o	Configure tries harder to find a minimal set of FLIBS.	Under
	some circumstances this may remove from R_LD_LIBRARY_PATH
	path elements that ought to have specified in LDFLAGS (but
	were not).

    o	The C code for most of the graphics device drivers and their
	afm files are now in package grDevices.

    o	R is now linked against ncurses/termlib/termcap only if
	readline is specified (now the default) and that requires it.

    o	Makeinfo 4.7 or later is now required for building the HTML and
	Info versions of the manuals.


PACKAGE INSTALLATION CHANGES

    o	There are new types of packages, identified by the Type field
	in the DESCRIPTION file.  For example the GNOME console is now
	a separate package (on CRAN), and translations can be
	distributed as packages.

    o	There is now support of installing from within R both source and
	binary packages on MacOS X and Windows.	 Most of the R
	functions now have a 'type' argument defaulting to
	getOption("pkgType") and with possible values "source",
	"win.binary" and "mac.binary".	The default is "source" except
	under Windows and the CRAN GUI build for MacOS X.

    o	install.packages() and friends now accept a vector of URLs for
	'repos' or 'contriburl' and get the newest available version of
	a package from the first repository on the list in which it is
	found.	The argument 'CRAN' is still accepted, but deprecated.

	install.packages() on Unix can now install from local .tar.gz
	files via repos = NULL (as has long been done on Windows).

	install.packages() no longer asks if downloaded packages
	should be deleted: they will be deleted at the end of the
	session anyway (and can be deleted by the user at any time).

	If the repository provides the information, install.packages()
	will now accept the name of a package in a bundle.

	If 'pkgs' is omitted install.packages() will use a listbox to
	display the available packages, on suitable systems.

	'dependencies' can be a character vector to allow only some
	levels of dependencies (e.g. not "Suggests") to be requested.

    o	There is a new possible value update.packages(ask="graphics")
	that uses a widget to (de)select packages, on suitable systems.

    o	The option used is now getOption("repos") not getOption("CRAN")
	and it is initially set to a dummy value.  Its value can be a
	character vector (preferably named) giving one or several
	repositories.

	A new function chooseCRANmirror() will select a CRAN mirror.
	This is called automatically if the contrib.url() encounters
	the initial dummy value of getOption("repos")

	A new function setRepositories() can be used to create
	getOption("repos") from a (platform-specific) list of known
	repositories.

    o	New function new.packages() to report uninstalled packages
	available at the requested repositories.  This also reports
	incomplete bundles.  It will optionally install new packages.

    o	New function available.packages(), similar to CRAN.packages()
	but for use with multiple repositories.	 Both now only report
	packages whose R version requirements are met.

    o	update.packages() and old.packages() have a new option
	'checkBuilt' to allow packages installed under earlier
	versions of R to be updated.

    o	remove.packages() can now remove bundles.

    o	The Contains: field of the DESCRIPTION file of package bundles
	is now installed, so later checks can find out if the bundle
	is complete.

    o	packageStatus() is now built on top of *.packages, and gains a
	'method' argument.  It defaults to the same repositories as
	the other tools, those specified by getOption("repos").


BUG FIXES

    o	Configuring for Tcl/Tk makes use of ${TK_LIB_SPEC} ${TK_LIBS}
	not ${TK_LIB_SPEC} ${TK_XLIBSW}, which is correct for
	recent versions of Tk, but conceivably not for old
	tkConfig.sh files.

    o	detach() was not recomputing the S4 methods for primitives
	correctly.

    o	Methods package now has class "expression" partly fixed in basic
	classes, so S4 classes can extend these (but "expression" is
	pretty broken as a vector class in R).

    o	Collected warnings had messages with unneeded trailing space.

    o	S4 methods for primitive functions must be exported from
	name spaces; this is now done automatically.
	Note that is.primitive() is now in "base", not "methods".

    o	Package grid:

	- Fixed bug in grid.text() when "rot" argument has length 0.
	  (reported by Emmanuel Paradis)

    o	.install_package_vignette_index() created an index even in an
	empty 'doc' directory.

    o	The print() method for factors now escapes characters in the
	levels in the same way as they are printed.

    o	str() removed any class from environment objects.

	str() no longer interprets control characters in character
	strings and factor levels; also no longer truncates factor
	levels unless they are longer than 'nchar.max'.
	Truncation of such long strings is now indicated ''outside''
	the string.

	str(<S4.object>) was misleading for the case of a single slot.

	str() now also properly displays S4 class definitions (such as
	returned by getClass().

    o	print.factor(quote=TRUE) was not quoting levels, causing
	ambiguity when the levels contained spaces or quotes.

    o	R CMD check was confused by a trailing / on a package name.

    o	write.table() was writing incorrect column names if the data
	frame contained any matrix-like columns.

    o	write.table() was not quoting row names for a 0-column x.

    o	t(x)'s default method now also preserves names(dimnames(x)) for
	1D arrays 'x'.

    o	r <- a %*% b no longer produces names(dimnames(r)) == c("", "")
	unless one of a or b has named dimnames.

    o	Some .Internal functions that were supposed to return invisibly
	did not. This was behind PR#7397 and PR#7466.

    o	eval(expr, NULL, encl) now looks up variables in encl, as
	eval(expr, list(), encl) always did

    o	Coercing as.data.frame(NULL) to a pairlist caused an error.

    o	p.adjust(p, ..) now correctly works when `p' contains NAs (or when
	it is of length 0 or length 2 for method = "hommel").

    o	'methods' initialization was calling a function intended for
	.Call() with .C().

    o	optim() needed a check that the objective function returns a
	value of length 1 (spotted by Ben Bolker).

    o	X11() was only scaling its fonts to pointsize if the dpi
	was within 0.5 of 100dpi.

    o	X11() font selection was looking for any symbol font, and
	sometimes got e.g. bold italic if the server has such a font.

    o	dpois(*, lambda=Inf) now returns 0 (or -Inf for log).

    o	Using pch="" gave a square (pch=0)!  Now it is regarded as the
	same as NA, which was also undocumented but omits the point.

    o	Base graphics now notices (ab)lines which have a zero
	coordinate on log scale, and omits them.  (PR#7559)

    o	stop() and warning() now accept NULL as they are documented
	to do (although this seems of little use and is equivalent to "").

    o	weighted.mean() now checks the length of the weight vector w.

    o	getAnywhere() was confused by names with leading or trailing dots
	(spotted by Robert McGehee)

    o	eval() was not handling values from return() correctly.

    o	par(omd) is now of the form c(x1, x2, y1, y2) to match the
	documentation and for S-PLUS compatibility.

	[Previously, par(omd) was of the form c(bottom, left, top, right)
	 like par(oma) and par(omi)]

    o	formatC() did not check its 'flag' argument, and could
	segfault if it was incorrect. (PR#7686)

    o	Contrasts needed to be coerced to numeric (e.g. from integer)
	inside model.matrix.  (PR#7695)

    o	socketSelect() did not check for buffered input.

    o	Reads on a non-blocking socket with no available data were
	not handled properly and could result in a segfault.

    o	The "aovlist" method for se.contrast() failed in some very
	simple cases that were effectively not multistratum designs,
	e.g. only one treatment occurring in only one stratum.

    o	pgamma() uses completely re-written algorithms, and should work
	for all (even very extreme) arguments; this is based on Morten
	Welinder's contribution related to PR#7307.

    o	dpois(10, 2e-308, log=TRUE) and similar cases gave -Inf.

    o	x <- 2^(0:1000);    plot(x, x^.9, type="l", log="xy")# and
	x <- 2^-(1070:170); plot(x, x^.9, type="l", log="xy")# now both work

    o	summary.lm() asked for a report on a reasonable occurrence, but
	the check failed to take account of NAs.

    o	lm() was miscalculating 'df.residual' for empty models with a
	matrix response.

    o	summary.lm() now behaves more sensibly for empty models.

    o	plot.window() was using the wrong sign when adjusting
	xlim/ylim for positive 'asp' and a reversed axis.

    o	If malloc() fails when allocating a large object the allocator now
	does a gc and tries the malloc() again.

    o	packageSlot() and getGroupMembers() are now exported from the
	'methods' package as they should from documentation and the
	Green Book.

    o	rhyper() was giving numbers slightly too small, due to a bug in the
	original algorithm.  (PR#7314)

    o	gsub() was sometimes incorrectly matching ^ inside a string,
	e.g.  gsub("^12", "x", "1212") was "xx".

    o	[g]sub(perl = TRUE) was giving random results for a 0-length
	initial match.	(PR#7742)

    o	[g]sub was ignoring most 0-length matches, including all initial
	ones.  Note that substitutions such as gsub("[[:space:]]*", "
	", ...) now work as they do in 'sed' (whereas the effect was
	previously the same as gsub("[[:space:]]+", " ", ...)).
	(In part PR#7742)

    o	Promises are now evaluated when extracted from an environment
	using '$' or '[[ ]]'.

    o	reshape(direction="wide") had some sorting problems when
	guessing time points (PR#7669)

    o	par() set 'xaxp' before 'xlog' and 'yaxp' before 'ylog',
	causing PR#831.

    o	The logic in tclRequire() to check the availability of a Tcl
	package turned out to be fallible.  It now uses a try()-and-see
	mechanism instead.

    o	Opening a unz() connection on a non-existent file left a file
	handle in use.

    o	"dist" objects of length 0 failed to print.

    o	INSTALL and the libR try harder to find a temporary directory
	(since there might be one left over with the same PID).

    o	acf() could cause a segfault with some datasets.  (PR#7771)

    o	tan(1+LARGEi) now gives 0+1i rather than 0+NaNi (PR#7781)

    o	summary(data.frame(mat = I(matrix(1:8, 4)))) does not go into
	infinite recursion anymore.

    o	writeBin() performed byte-swapping incorrectly on complex
	vectors, also swapping real and imaginary parts. (PR#7778)

    o	read.table() sometimes discarded as blank lines containing
	only white space, even if sep=",".



	**************************************************
	*						 *
	*	       2.0 SERIES NEWS			 *
	*						 *
	**************************************************


		CHANGES IN R VERSION 2.0.1 patched



NEW FEATURES

    o	warnings() now looks only in the workspace for `last.warning'
	(suggested by PR#7363).

    o	The search for browsers now starts with firefox, and has mozilla
	ahead of netscape.


PACKAGE INSTALLATION CHANGES

    o	A package DESCRIPTION file which contains a Built field (it
	should not!) is now worked around, with loud warnings.


BUG FIXES

    o	split() was accepting raw and list vectors as input, but
	not populating the output correctly.

	split() now handles vectors with names internally and so is
	almost as fast as on vectors without names (and maybe 100x
	faster than before).

    o	subset() now throws an error if its 'subset' argument is not
	logical whereas it could appear to work and give wrong answers
	with e.g. a numeric 'subset' argument.

    o	sum(), max(), min(), prod(), any() and all() were incorrectly
	using partial matching for their na.rm argument.

    o	kmeans() now ensures that the initial cluster centers it chooses
	are distinct.

    o	text()'s default method could segfault if passed 0-length coordinates.

    o	R CMD INSTALL (Unix) was sometimes leaving a temporary dir
	behind.	 (PR#7230)

    o	read.table() could fail when the row.names were looking like numbers.

    o	seq(length= <n>) now always returns "integer" storage.

    o	labels.lm was broken. (PR#7417)

    o	The hashing used for character vectors in object.size() was
	inefficient for vectors with thousands of identical values not
	sharing the same storage (an unusual case).

    o	data.matrix() now warns if applied to a data frame with
	classed columns.

    o	Plotting histograms where the expression used to deparse to
	multiple lines now gives a sensible default title.  (PR#7421)

    o	The print method for getDLLRegisteredRoutines() was badly
	designed, and failed for all the standard packages' DLLs.

    o	getDLLRegisteredRoutines.character() was broken.

    o	write.table(x, row.names=FALSE) was incorrect for a 0-column x.

    o	write.table() assumed dec = "," if it was not ".".

    o	morley.tab used by R-intro was not installed on Unix since 2.0.0
	(it was on Windows).

    o	gsub(perl=TRUE) returned a string which printed with trailing
	garbage if there was a match at the beginning whose
	replacement was shorter.  (PR#7479)

	Similarly, the result was truncated if a replacement at the
	beginning was longer.

    o	Some PDF readers do not define PDFDocEncoding, so pdf()'s
	ISOLatin1 encoding is now derived from WinAnsi rather than
	PDFDocEncoding.

    o	xfig() had not been updated for the 2.0.0 alpha changes.
	Using more than one plot with a non-white background and with
	onefile=FALSE could segfault.

    o	sprintf() did not check for buffer overflow on character
	strings.  (PR#7554)

    o	The error message when evaluation depth was exceeded itself
	caused an error in deparsing and so was not shown.

    o	The 'datalist' file was not being used during installation
	(2.0.1 only).

    o	replications() was wrongly reporting lack of balance in
	designs with interactions (and had since unique() gained a
	matrix method).



		CHANGES IN R VERSION 2.0.1


NEW FEATURES

    o	Platform equivalence in library() is tested by a new function
	testPlatformEquivalence() which ignores the 'vendor' field and
	can be customized by cognescenti.

    o	The assignment form of split() allows recycling of vectors
	within the value list. In particular, things like
	    split(x, g) <- lapply(split(x, g), mean)
	now work


DOCUMENTATION

    o	Manual `Writing R Extensions' has new sections on writing
	portable packages and on writing new front-ends for R -- the
	latter will be more comprehensive in R 2.1.0 which has new
	public header files.


DEPRECATED & DEFUNCT

    o	The aqua module in MacOS X is deprecated.

    o	Capabilities "bzip2", "GNOME", "libz" and "PCRE" are deprecated.

    o	The GNOME GUI on Unix-alikes is deprecated as part of R;
	it will be available in another form as from R 2.1.0.

    o	The undocumented use of UseMethod() with no argument is now
	formally deprecated.


INSTALLATION CHANGES

    o	Building on Alpha OSF/1 no longer forces the C flag -std1,
	which appears to be no longer needed.  (PR#7257)

    o	The compiler flag -mieee-fp is no longer used on i386 Linux
	(these days it is only passed to the linker and was only
	invoked for compilation steps).

    o	-D__NO_MATH_INLINES is only used on older ix86 glibc-based
	systems which need it (tested at configure time).  This leads to
	small improvements in speed and accuracy on modern systems.

    o	If makeinfo >= 4.5 is not available, warnings are given that
	some of the HTML manuals will be missing, and the index page
	given by help.start() will link to CRAN versions of those manuals.

    o	Files aclocal.m4 and acinclude.m4 used in maintainer builds
	are not longer included in the distribution.


C-LEVEL FACILITIES

    o	It was not clear in 'Writing R Extensions' that some of the
	entry points in the 'Utilities' section were not declared in
	<R.h> (they were in <R_ext/Applic.h>).	Now all the entry
	points in that section are declared in <R_ext/Utils.h>,
	included by <R.h>.


BUG FIXES

    o	The grid.grab() function in package grid would throw an error
	if there were no viewports pushed (now returns NULL).

    o	model.frame.default() takes row names from the response
	variable if that has suitable names and there is no 'data'
	argument.  (This follows S but was not previously implemented
	in R.)

    o	write.table() was not respecting the 'dec' argument for complex
	numbers.

    o	write.table() printed a mixture of numeric and complex numbers
	as all complex.	 (PR#7260)

    o	R CMD INSTALL failed with versioned installs on packages which
	save images (only).

    o	dlogis() gave NaN not 0 for large negative arguments.

    o	Importing from another name space was broken for versioned
	installs, incorrectly reporting something like
	"package 'imported_from' does not have a name space".

    o	The GNOME interface under Linux/Unix was broken. (PR#7276)

    o	For the jpeg/png devices under Linux/Unix, under certain rare
	circumstances clipping needed to be cleared before starting a
	new page.  (PR#7270, which has been the case since the devices
	were introduced in 1.1.0.)

    o	First lattice plot (first grid.newpage() call) did not start
	a new page IF there had been a previous traditional graphics
	plot (on the same device).

    o	Using install.packages() to install the same package to more
	than one library gave an incorrect warning message.  (If there
	were two or more such packages it might give an error.)

    o	.packages(all.available=TRUE) returned packages with an invalid
	version field in their DESCRIPTION whereas .find.packages() and
	packageDescription() did not.  Now all do not.

    o	packageDescription() now correctly reports that a package does
	not exist, rather than that its DESCRIPTION file is 'missing
	or broken'.

    o	'make dist' from builddir != sourcedir was copying not linking
	recommended packages to *.tgz.

    o	Slots in prototype objects can inherit from locally defined
	classes (which were not being found correctly before).

    o	Several fixes to the behavior of as() when there are either
	coerce= or replace= methods supplied in a call to
	setIs(). Related fixes to setIs() to handle correctly previous
	methods, if there were any.

    o	splinefun(1[0], 1[0])(1) doesn't segfault anymore (PR#7290).
	spline() and splinefun() now also work with missing values by
	omiting them.

    o	ecdf() was failing on inputs containing NAs. (Part of PR#7292)

    o	tools:::.install_package_description was splitting the Built:
	field across lines on platforms with very long names.

    o	capabilities() was wrong for the Aqua GUI on MacOS X.

    o	Using Rprof() with a non-writable 'file' argument is now a
	non-fatal error and does not abort R.

    o	binom.test() did not deparse its arguments early enough such
	that the reported data were ugly if x was a table.

    o	Systems based on glibc, including those using R's substitute for
	strptime, were handling strptime("2001", "%Y") incorrectly, in
	some cases crashing.  R's substitute code has been corrected
	(but problems may remain if glibc is used).  See the ?strptime
	for what should happen (which is system-specific).

    o	untrace() after trace() failed if package 'methods' was attached.
	(PR#7301)

    o	summary.stepfun() was reporting for n > 6 summaries of the
	knots and levels as the actual values.	Both print() and
	summary() methods called the constant values "step heights",
	although they were not the heights of the steps.

    o	is.na/is.nan() were giving spurious warnings if applied to a
	raw vector.

    o	is.atomic() gave incorrect result (false) for a raw vector.

    o	rank() and order() accepted raw and list inputs, but did not
	give a sensible answer (always 1:n).  Similarly, partial sorts
	of a raw vector were accepted but did nothing.

    o	require() without a version argument tried for an unversioned
	load of a package even though a versioned install was already
	loaded.	 This often led to a message that a required package
	was being loaded when it was not actually being loaded.

    o	str(<S4.object>) made use of attributes() instead of slot(),
	and hence didn't properly print NULL slots.

    o	contrib.url() now handles URLs ending in '/' correctly.

    o	str() removed any class from externalptr objects.

    o	logLik() and hence AIC() failed or gave incorrect answers
	on "lm" fits with na.action = na.exclude (and perhaps other
	na.actions's except na.omit and na.fail).

    o	pmax() and pmin() sometimes used NAs in internal subassignments,
	and sometimes these failed.

    o	Subassigning an expression, e.g. expr[2] <- 1, could leave an
	invalid object and so cause a segfault. (PR#7326)

    o	download/install.packages() would misbehave if there was more
	than one version of a package in a repository.

    o	sort(partial=) silently ignored some other arguments: using
	'decreasing' or 'index.return' or supplying a factor are now
	errors.

    o	The ave() function had trouble if the grouping contained
	unused levels.

    o	read.fwf() got confused by skip > 0 and could infinite loop
	under some circumstances.  (PR#7350)

    o	upgrade(x, ask = FALSE) was broken for a "packageStatus" object.

    o	Class "raw" had been omitted from the list of basic classes in
	the "methods" package and so could not be used in S4 classes.

    o	Function getGroupMembers(), part of the definition of S4
	classes, had been promised for release 2.0, but slipped through.

    o	toLatex(sessionInfo()) produced incorrect LaTeX on some
	platforms due to special characters in the platform
	identifier.



		CHANGES IN R VERSION 2.0.0


USER-VISIBLE CHANGES

    o	The stub packages from 1.9.x have been removed: the library()
	function selects the new home for their code.

    o	`Lazy loading' of R code has been implemented, and is used for
	the standard and recommended packages by default.  Rather than
	keep R objects in memory, they are kept in a database on disc
	and only loaded on first use.  This accelerates startup (down
	to 40% of the time for 1.9.x) and reduces memory usage -- the
	latter is probably unimportant of itself, but reduces
	commensurately the time spent in garbage collection.

	Packages are by default installed using lazy loading if they
	have more than 25Kb of R code and did not use a saved image.
	This can be overridden by INSTALL --[no-]lazy or via a field
	in the DESCRIPTION file.  Note that as with --save, any other
	packages which are required must be already installed.

	As the lazy-loading databases will be consulted often, R
	will be slower if run from a slow network-mounted disc.

    o	All the datasets formerly in packages 'base' and 'stats' have
	been moved to a new package 'datasets'.	 data() does the
	appropriate substitution, with a warning.  However, calls to
	data() are not normally needed as the data objects are visible
	in the 'datasets' package.

	Packages can be installed to make their data objects visible
	via R CMD INSTALL --lazy-data or via a field in the
	DESCRIPTION file.

    o	Package 'graphics' has been split into 'grDevices' (the graphics
	devices shared between base and grid graphics) and 'graphics'
	(base graphics).  Each of the 'graphics' and 'grid' packages
	load 'grDevices' when they are attached.  Note that
	ps.options() has been moved to grDevices and user hooks may
	need to be updated.

    o	The semantics of data() have changed (and were incorrectly
	documented in recent releases) and the function has been moved
	to package 'utils'.  Please read the help page carefully if
	you use the 'package' or 'lib.loc' arguments.

	data() now lists datasets, and not just names which data() accepts.

    o	Dataset 'phones' has been renamed to 'WorldPhones'.

    o	Datasets 'sunspot.month' and 'sunspot.year' are available


	*********************************************************
	*							*
	*	News of 1.x.y is in file 'NEWS.1'		*
	*							*
	*********************************************************


%%% Local Variables:
%%% mode: text
%%% coding: utf-8
%%% End:

