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


	This file covers NEWS for R 2.x.y.
	See 'NEWS' (or doc/html/NEWS.html or doc/NEWS.Rd) 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 mis-spelling 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:

