R News

LATER NEWS:

  • News for R 4.x.y can be found in HTML format at doc/html/NEWS.html,
    and in text format in file NEWS in the doc directory.

CHANGES IN R 3.6.3:

  NEW FEATURES:

    • The included LAPACK has been updated to version 3.9.0 (for the
      included routines, just bug fixes).

  BUG FIXES:

    • Fixed a C level integer overflow in rhyper(); reported by
      Benjamin Tyner in PR#17694.

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

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

    • tools:assertCondition(., "error") and hence assertError() no
      longer return errors twice (invisibly).

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

    • The error message from stopifnot(.., <error producing call>)
      again contains the full "stopifnot(.......)" call: Its attempted
      suppression did not work consistently.

    • On Windows, download.file(., , "wininet", headers=character())
      would fail; reported with patch proposal by Kevin Ushey in
      PR#17710.

CHANGES IN R 3.6.2:

  NEW FEATURES:

    • runmed(x, *) gains a new option na.action determining _how_ to
      handle NaN or NA in x.

    • dotchart() gains new options ann, xaxt, frame.plot and log.

  INSTALLATION on a UNIX-ALIKE:

    • Detection of the C stack direction has been moved from run-time
      to configure: this is safer with LTO builds and allows the
      detection to be overridden - see file config.site.

    • Source-code changes enable installation on platforms using gcc
      -fno-common (the expected default for gcc 10.x).

  C-LEVEL FACILITIES:

    • installTrChar (which is nowadays is wrapped by installChar) is
      defined in Rinternals.h.  (Neither are part of the API.)

  PACKAGE INSTALLATION:

    • Header Rconfig.h contains the value of FC_LEN_T deduced at
      installation which is used by the prototypes in headers
      R_ext/BLAS.h and R_ext/Lapack.h but to avoid extensive breakage
      this is only exposed when USE_FC_LEN_T is defined.

      If a package's C/C++ calls to BLAS/LAPACK allow for the ‘hidden’
      arguments used by most Fortran compilers to pass the lengths of
      Fortran character arguments, define USE_FC_LEN_T and include
      Rconfig.h (possibly _via_ R.h) before including R_ext/BLAS.h or
      R_ext/Lapack.h.

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

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

  UTILITIES:

    • R CMD check has a new option to mitigate checks leaving
      files/directories in /tmp.  See the ‘R Internals’ manual - this
      is part of --as-cran.

  Windows:

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

  DEPRECATED AND DEFUNCT:

    • Support for specifying C++98 in package installation is
      deprecated.

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

      Use $CC -E and $CXX -E instead of CPP and CXXCPP.

  BUG FIXES:

    • runmed(x, *) when x contains missing values now works
      consistently for both algorithm="Stuetzle" and "Turlach", and no
      longer segfaults for "Turlach", as reported by Hilmar Berger.

    • apply(diag(3), 2:3, mean) now gives a helpful error message.

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

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

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

    • as.numeric(<call>) now gives correct error message.

    • Printing ls.str() no longer wrongly shows "<missing>" in rare
      cases.

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

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

    • x %% L for finite x no longer returns NaN when L is infinite, nor
      suffers from cancellation for large finite L, thanks to Long Qu's
      PR#17611.

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

    • grepl(NA, *) now returns logical as documented.

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

    • R_tryCatch no longer transfers control for all conditions.
      Reported and patch provided by Lionel Henry in PR#17617.

    • format(object.size(.), digits=NULL) now works, fixing PR#17628
      reported by Jonathan Carroll.

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

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

    • barplot() could get spacings wrong if there were exactly two bars
      PR#15522.  Patch by Michael Chirico.

    • power.t.test() works in more cases when returning values of n
      smaller than 2.

    • dotchart(*, pch=., groups=.) now works better.  Reported by
      Robert and confirmed by Nic Rochette in PR#16953.

    • canCoerce(obj, cl) no longer assumes length(class(obj)) == 1.

    • plot.formula(*, subset = *) now also works in a boundary case
      reported by Robert Schlicht (TU Dresden).

    • readBin() and writeBin() of a rawConnection() now also work in
      large cases, thanks to a report and proposal by Taeke Harkema in
      PR#17665.

CHANGES IN R 3.6.1:

  INSTALLATION on a UNIX-ALIKE:

    • The default detection of the shell variable libNN is overridden
      for derivatives of Debian Linux, some of which have started to
      have a /usr/lib64 directory.  (E.g. Ubuntu 19.04.)  As before, it
      can be specified in config.site.

  UTILITIES:

    • R CMD config knows the values of AR and RANLIB, often set for LTO
      builds.

  DEPRECATED AND DEFUNCT:

    • The use of a character vector with .Fortran() is formally
      deprecated and gives a non-portability warning.  (It has long
      been strongly discouraged in ‘Writing R Extensions’.)

  BUG FIXES:

    • On Windows, GUI package installation via menuInstallPkgs() works
      again, thanks to Len Weil's and Duncan Murdoch's PR#17556.

    • R CMD check on data() fixing PR#17558 thanks to Duncan Murdoch.

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

    • Creation of lazy loading database during package installation is
      again robust to Rprofile changing the current working directory
      (PR#17559).

    • boxplot(y ~ f, horizontal=TRUE) now produces correct x- and
      y-labels.

    • rbind.data.frame() allows to keep <NA> levels from factor columns
      (PR#17562) via new option factor.exclude.

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

    • Correct messaging in C++ pragma checks in tools code for R CMD
      check, fixing PR#17566 thanks to Xavier Robin.

    • print()ing and auto-printing no longer differs for functions with
      a user defined print.function, thanks to Bill Dunlap's report.

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

    • as.data.frame() treats 1D arrays the same as vectors, PR#17570.

    • Improvements in smoothEnds(x, *) working with NAs (towards
      runmed() working in that case, in the next version of R).

    • vcov(glm(<quasi>), dispersion = *) works correctly again, fixing
      PR#17571 thanks to Pavel Krivitsky.

    • R CMD INSTALL of binary packages on Windows now works also with
      per-directory locking.

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

    • On Unix alikes (when readline is active), only expand tilde (~)
      file names starting with a tilde, instead of almost all tildes.

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

CHANGES IN R 3.6.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

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

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

      The output of RNGkind() has been changed to also return the
      ‘kind’ used by sample().

  NEW FEATURES:

    • Sys.setFileTime() has been vectorized so arguments path and time
      of length greater than one are now supported.

    • axis() gets new option gap.axis = NA for specifying a
      multiplication factor for the minimal “gap” (distance) between
      axis labels drawn.  Its default is 1 for labels _parallel_ to the
      axis, and 0.25 for perpendicular ones.

      Perpendicular labels no longer overlap, fixing bug PR#17384.

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

    • removeSource() now works not only for functions but also for some
      language objects.

    • as.call(), rep.int(), rep_len() and nchar() dispatch internally.

    • is(object, class2) looks for class2 in the calling namespace
      after looking in the namespace of class(object).

    • extendrange(.., f) with a length-2 f now extends separately to
      the left and the right.

    • lengths() dispatches internally to S4 methods.

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

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

    • Setting C locale for collation _via_ environment variables LC_ALL
      and LC_COLLATE and _via_ a call to Sys.setlocale() now takes
      precedence over environment variable R_ICU_LOCALE.

    • There is a new function, nullfile(), to give the file name of the
      null system device (e.g., /dev/null) on the current platform.

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

    • In rapply(x, ..), x can also be “list-like” and of length >=
      2^{31}.

    • trimws() gets new optional whitespace argument, allowing more
      extensive definitions of “space”, such as including Unicode
      spaces (as wished in PR#17431).

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

    • When loading namespaces, S3 method registrations which overwrite
      previous registrations are now noted by default (using
      packageStartupMessage()).

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

    • The axis labeling in the default method of pairs() may now be
      toggled by new options horOdd and verOdd.

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

    • The numeric method of all.equal() gets optional arguments countEQ
      and formatFUN.  If countEQ is true, the mean error is more
      sensible when many entries are *eq*ual.

    • outer(x,y, FUN = "*") is more efficient using tcrossprod(u,v)
      instead of u %*% t(v).

    • vcov(<mlm>) is more efficient via new optional arguments in
      summary.mlm().

    • The default method of summary() gets an option to choose the
      _kind_ of quantile()s to use; wish of PR#17438.

    • Fitting multiple linear models _via_ lm() does work with _matrix_
      offsets, as suggested in PR#17407.

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

    • news() gains support for NEWS.md files.

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

    • sessionInfo()$running has been factored out in a new variable
      osVersion.

    • slice.index() now also works for multi-dimensional margins.

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

    • The new function asplit() allow splitting an array or matrix by
      its margins.

    • New functions errorCondition() and warningCondition() provide a
      convenient way to create structured error and warning objects.

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

    • Many ‘package not found’ errors are now signaled as errors of
      class "packageNotFoundError".

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

    • S3method() directives in NAMESPACE can now also be used to
      perform _delayed_ S3 method registration.

    • Experimentally, setting environment variable
      _R_CHECK_LENGTH_1_LOGIC2_ will lead to warnings (or errors if the
      variable is set to a ‘true’ value) when && or || encounter and
      use arguments of length more than one.

    • Added "lines" and "chars" coordinate systems to grconvertX() and
      grconvertY().

    • getOption() is more efficient notably for the rare case when
      called with two arguments, from several contributors in PR#17394.

    • In .col(dim) and .row(dim), dim now may also be an integer-valued
      "double".

    • sQuote() and dQuote() get an explicit q argument with obvious
      default instead of using getOption("fancyQuotes") implicitly and
      unconditionally.

    • unzip() can list archives with comments and with spaces in file
      names even using an external unzip command.

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

    • library() no longer checks packages with compiled code match
      R.version$platform.  loadNamespace() never has, and increasingly
      the ‘canonical name’ does not reflect the important
      characteristics of compiled code.

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

    • In formals(), envir becomes an optional argument instead of being
      hardwired.

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

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

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

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

    • File-based connection functions file(), gzfile(), bzfile() and
      xzfile() now signal an error when used on a directory.

    • For approx(), splinefun() _etc_, a new setting ties =
      c("ordered", <fun>) allows skipping the sorting and still treat
      ties.

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

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

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

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

    • zip() passes its list of files _via_ standard input to the
      external command when too long for the command line (on some
      platforms).

    • data() gains an overwrite argument.

    • t.test() now also returns the standard error (in list component
      stderr).

    • model.matrix(*, contrasts.arg = CC) now warns about invalid
      contrasts.args.

    • Performance of substr() and substring() has been improved.

    • stopifnot() has been simplified thanks to Suharto Anggono's
      proposals to become considerably faster for cheap expressions.

    • The default ‘user agent’ has been changed when accessing http://
      and https:// sites using libcurl.  (A site was found which caused
      libcurl to infinite-loop with the previous default.)

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

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

    • barplot() gets a formula method, thanks to a patch proposal by
      Arni Magnusson in PR#17521.

    • pmax() and pmin(x) now also work for long vectors, thanks to
      Suharto Anggono's PR#17533.

    • bxp() now warns when omitting duplicated arguments.

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

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

      Contributed by Achim Zeileis.

    • The default colours for image() and filled.contour() are now
      based on hcl.colors().

    • The palette-generating functions rainbow(), gray.colors(), etc.
      get a new rev argument to facilitate reversing the order of
      colors.

    • New str2lang() and str2expression() as streamlined versions of
      parse(text=., keep.source=FALSE) allow to abstract typical call
      constructions, e.g., in formula manipulations.  (Somewhat
      experimental)

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

  INSTALLATION on a UNIX-ALIKE:

    • The options selected for the C++ compiler default to the C++11
      standard if supported, otherwise to the C++98 standard.

    • Visibility macros such as C_VISIBILITY can now be user-set
      (including to empty), e.g. in config.site.

    • Macro FCLIBS, which has sometimes been needed on Solaris, has
      been renamed to FCLIBS_XTRA.

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

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

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

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

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

    • Long-untested configure support for HP-UX and very old versions
      of Linux has been removed.

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

    • The configure macro MAKEINFO has been updated to TEXI2ANY.

    • Support for make install-strip has been enhanced.

  PACKAGE INSTALLATION:

    • Source package installation is by default ‘staged’: the package
      is installed into a temporary location under the final library
      directory and moved into place once the installation is complete.
      The benefit is that partially-installed packages are hidden from
      other R sessions.

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

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

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

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

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

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

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

    • The make macro F_VISIBILITY is now preferred for both fixed-form
      and free-form Fortran, for use in src/Makevars and similar.

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

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

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

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

  UTILITIES:

    • R CMD check now optionally checks makefiles for correct and
      portable use of the SHLIB_OPENMP_*FLAGS macros.

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

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

    • tools::Rd2latex() now uses UTF-8 as its default output encoding.

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

      R CMD build will correct line endings in such files.

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

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

    • R CMD check has more comprehensive checks on the data directory
      and the functioning of data() in a package.

    • R CMD check now checks autoconf-generated configure files have
      their corresponding source files, including optionally attempting
      to regenerate them on platforms with autoreconf.

    • R CMD build has a new option --compression to select the
      compression used for the tarball.

    • R CMD build now removes src/*.mod files on all platforms.

  C-LEVEL FACILITIES:

    • New pointer protection C functions R_PreserveInMSet and
      R_ReleaseFromMSet have been introduced to replace UNPROTECT_PTR,
      which is not safe to mix with UNPROTECT (and with
      PROTECT_WITH_INDEX). Intended for use in parsers only.

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

    • R_unif_index is now considered to be part of the C API.

    • R_GetCurrentEnv() allows C code to retrieve the current
      environment.

  DEPRECATED AND DEFUNCT:

    • Argument compressed of untar() is deprecated - it is only used
      for external tar commands which increasingly for extraction
      auto-detect compression and ignore their zjJ flags.

    • var(f) and hence sd(f) now give an error for factor arguments;
      they gave a deprecation warning since R 3.2.3, PR#16564.

    • Package tools' vignetteDepends() has been deprecated (it called a
      function deprecated since Feb 2016), being partly replaced by
      newly exported vignetteInfo().

    • The f77_f2c script has been removed: it no longer sufficed to
      compile the .f files in R.

    • The deprecated legacy support of make macros such as CXX1X has
      been removed: use the CXX11 forms instead.

    • Make macro F77_VISIBILITY is deprecated in favour of
      F_VISIBILITY.

    • Make macros F77, FCPIFCPLAGS and SHLIB_OPENMP_FCFLAGS are
      deprecated in favour of FC, FPICFLAGS and SHLIB_OPENMP_FFLAGS
      respectively.

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

  BUG FIXES:

    • replayPlot(r) now also works in the same R session when r has
      been “reproduced” from serialization, typically after saving to
      and reading from an RDS file.

    • substr() and substring() now signal an error when the input is
      invalid UTF-8.

    • file.copy() now works also when its argument to is of length
      greater than one.

    • mantelhaen.test() no longer suffers from integer overflow in
      largish cases, thanks to Ben Bolker's PR#17383.

    • Calling setGeneric("foo") in a package no longer fails when the
      enclosing environment of the implicit generic foo() is
      .GlobalEnv.

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

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

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

    • order(...., decreasing=c(TRUE, FALSE)) could fail in some cases.
      Reported from StackOverflow via Karl Nordström.

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

    • Changes in print.*(), thanks to Lionel Henry's patches in
      PR#17398:

        • Printing lists, pairlists or attributes containing calls with
          S3 class no longer evaluate those.

        • Printing S4 objects within lists and pairlists dispatches
          with show() rather than print(), as with auto-printing.

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

        • Arguments supplied to print() are now properly forwarded to
          methods when printing lists, pairlists or attributes
          containing S3 objects.

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

        • Printing lists, pairlists or attributes containing functions
          now uses srcref attributes if present.

    • Calling install.packages() with a length zero pkgs argument now
      is a no-op (PR#17422).

    • unlist(x) now returns a correct factor when x is a nested list
      with factor leaves, fixing PR#12572 and PR#17419.

    • The documentation help(family) gives more details about the aic
      component, thanks to Ben Bolker's prompting.

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

    • strwidth() now uses par("font") as default font face (PR#17352).

    • plot(<table>, log="x") no longer warns about log.

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

    • kruskal.test() and fligner.test() no longer erroneously insist on
      numeric g group arguments (PR#16719).

    • Printing a news db via the browser now does a much better job
      (PR#17433).

    • print.aov() missed column names in the multivariate case due to
      misspelling (reported by Chris Andrews).

    • axis() now creates valid at locations also for small subnormal
      number ranges in log scale plots.

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

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

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

    • as(1L, "double") now does coerce (PR#17457).

    • lm.influence(), influence.measures(), rstudent() etc now work
      (more) correctly for multivariate models ("mlm"), thanks to
      (anonymous) stackoverflow remarks.

    • sample.int(2.9, *, replace=TRUE) again behaves as documented and
      as in R < 3.0.0, namely identically to sample.int(2, ..).

    • Fixes to convertColor() for chromatic adaptation; thanks to
      Brodie Gaslam PR#17473.

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

    • Parse data now include a special node for equal assignment.

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

    • Line numbers in messages about .Rd files are now more reliable,
      thanks to a patch from Duncan Murdoch.

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

    • Deferred string conversions now record the OutDec option setting
      when not equal to the default.  Reported by Michael Sannella.

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

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

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

    • methods::formalArgs("<fn>") now finds the same function as
      formals("<fn>"), fixing Emil Bode's PR#17499.

    • The methods package better handles duplicated class names across
      packages.

    • The default method of seq() now avoids integer overflow, thanks
      to the report and "cumsum" patch of Suharto Anggono's PR#17497.

    • sub() no longer loses encodings for non-ASCII replacements
      (PR#17509).

    • Fix for rotated raster image on X11 device.  (Partial fix for
      PR#17148; thanks to Mikko Korpela).

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

    • ar.ols() also returns scalar var.pred in univariate case
      (PR#17517).

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

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

    • strtoi("", base) now gives NA on all platforms, following its
      documentation.  Reported by Michael Chirico.

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

    • From setClassUnion(), if environment variable
      _R_METHODS_SHOW_CHECKSUBCLASSES is set to true, the internal
      .checkSubclasses() utility prints debugging info to see where it
      is used.

    • max.col(m) with an m of zero columns now returns integer NA
      (instead of 1).

    • axTicks() no longer returns small “almost zero” numbers (in
      exponential format) instead of zero, fixing Ilario Gelmetti's
      PR#17534.

    • isSymmetric(matrix(0, dimnames=list("A","b"))) is FALSE again, as
      always documented.

    • The cairo_pdf graphics device (and other Cairo-based devices) now
      clip correctly to the right and bottom border.

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

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

    • reformulate("x", response = "sin(y)") no longer produces extra
      back quotes, PR#17359, and gains new optional argument env.

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

    • as.matrix.data.frame() now produces better strings from logicals,
      thanks to PR#17548 from Gabe Becker.

    • The S4 generic signature of rowSums(), rowMeans(), colSums() and
      colMeans() is restricted to "x".

    • match(x, tab) now works for long _character_ vectors x, thanks to
      PR#17552 by Andreas Kersting.

    • Class unions are unloaded when their namespace is unloaded
      (PR#17531, adapted from a patch by Brodie Gaslam).

    • selectMethod() is robust to ANY-truncation of method signatures
      (thanks to Herve Pages for the report).

CHANGES IN R 3.5.3:

  INSTALLATION on a UNIX-ALIKE:

    • Detection of flags for C++98/11/14/17 has been improved: in
      particular if CXX??STD is set, it is tried first with no
      additional flags.

  PACKAGE INSTALLATION:

    • New macro F_VISIBILITY as an alternative to F77_VISIBILITY.  This
      will become the preferred form in R 3.6.0.

  BUG FIXES:

    • writeLines(readLines(fnam), fnam) now works as expected, thanks
      to Peter Meissner's PR#17528.

    • setClassUnion() no longer warns, but uses message() for now, when
      encountering “non local” subclasses of class members.

    • stopifnot(exprs = T) no longer fails.

CHANGES IN R 3.5.2:

  PACKAGE INSTALLATION:

    • New macro CXX_VISIBILITY analogous to C_VISIBILITY (which several
      packages have been misusing for C++ code) for the default C++
      compiler (but not necessarily one used for non-default C++
      dialects like C++14).

  TESTING:

    • The random number generator tests in tests/p-r-random-tests.R no
      longer fail occasionally as they now randomly sample from
      “certified” random seeds.

  BUG FIXES:

    • The "glm" method of drop1() miscalculated the score test
      (test="Rao") when the model contained an offset.

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

    • vcov(<empty mlm>) and hence confint() now work (via a consistency
      change in summary.lm()).

    • confint(<multiple lm()>) now works correctly; reported on R-devel
      by Steven Pav.

    • quade.test() now also works correctly when its arguments are not
      yet sorted along groups, fixing PR#15842.

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

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

    • hist() no longer integer overflows in very rare cases, fixing
      PR#17450.

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

    • zapsmall(x) now works for more “number-like” objects.

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

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

    • Parse data now have deterministic parent nodes (PR#16041).

    • Calling match() with length one x and POSIXlt table gave a
      segfault (PR#17459).

    • Fork clusters could hang due to a race condition in cluster
      initialization (makeCluster()).

    • nextn(n) now also works for larger n and no longer loops
      infinitely for e.g, n <- 214e7.

    • cooks.distance() and rstandard() now work correctly for multiple
      linear models ("mlm").

    • polym() and corresponding lm() prediction now also work for a
      boundary "vector" case fixing PR#17474, reported by Alexandre
      Courtiol.

    • With a very large number of variables terms() could segfault
      (PR#17480).

    • cut(rep(0, 7)) now works, thanks to Joey Reid and Benjamin Tyner
      (PR#16802).

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

    • duplicated(<dataframe with 'f'>) now works, too, thanks to
      Andreas Kersting's PR#17485; ditto for anyDuplicated().

    • legend(*, cex = 1:2) now works less badly.

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

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

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

    • seq.int(*, by=by, length=n) no longer wrongly “drops fractional
      parts” when by is integer, thanks to Suharto Anggono's report
      PR#17506.

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

CHANGES IN R 3.5.1:

  BUG FIXES:

    • file("stdin") is no longer considered seekable.

    • dput() and dump() are no longer truncating when
      options(deparse.max.lines = *) is set.

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

    • Allow file argument of Rscript to include space even when it is
      first on the command line.

    • callNextMethod() uses the generic from the environment of the
      calling method. Reported by Hervé Pagès with well documented
      examples.

    • Compressed file connections are marked as blocking.

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

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

    • simulate.lm(glm(*, gaussian(link = <non-default>))) has been
      corrected, fixing PR#17415 thanks to Alex Courtiol.

    • unlist(x) no longer fails in some cases of nested empty lists.
      Reported by Steven Nydick.

    • qr.coef(qr(<all 0, w/ colnames>)) now works.  Reported by Kun
      Ren.

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

    • Terminal connections (e.g., stdin) are no longer buffered. Fixes
      PR#17432.

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

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

    • .Renviron on Windows with Rgui is again by default searched for
      in user documents directory when invoked _via_ the launcher icon.
      Reported by Jeroen Ooms.

    • printCoefmat() now also works with explicit right=TRUE.

    • print.noquote() now also works with explicit quote=FALSE.

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

    • agrep("..|..", .., fixed=FALSE) now matches when it should,
      thanks to a reminder by Andreas Kolter.

    • str(ch) now works for more invalid multibyte strings.

CHANGES IN R 3.5.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • All packages are by default byte-compiled on installation.  This
      makes the installed packages larger (usually marginally so) and
      may affect the format of messages and tracebacks (which often
      exclude .Call and similar).

  NEW FEATURES:

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

    • diag() gets an optional names argument: this may require updates
      to packages defining S4 methods for it.

    • chooseCRANmirror() and chooseBioCmirror() no longer have a
      useHTTPS argument, not needed now all R builds support https://
      downloads.

    • New summary() method for warnings() with a (somewhat
      experimental) print() method.

    • (methods package.) .self is now automatically registered as a
      global variable when registering a reference class method.

    • tempdir(check = TRUE) recreates the tempdir() directory if it is
      no longer valid (e.g. because some other process has cleaned up
      the /tmp directory).

    • New askYesNo() function and "askYesNo" option to ask the user
      binary response questions in a customizable but consistent way.
      (Suggestion of PR#17242.)

    • New low level utilities ...elt(n) and ...length() for working
      with ... parts inside a function.

    • isTRUE() is more tolerant and now true in

         x <- rlnorm(99)
         isTRUE(median(x) == quantile(x)["50%"])
      
      New function isFALSE() defined analogously to isTRUE().

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

    • line() gets a new option iter = 1.

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

    • order() is smarter about picking a default sort method when its
      arguments are objects.

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

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

    • packageStatus()'s upgrade() method no longer ignores its ...
      argument but passes it to install.packages().

    • installed.packages() gains a ... argument to allow arguments
      (including noCache) to be passed from new.packages(),
      old.packages(), update.packages() and packageStatus().

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

    • Attempting to use names<-() on an S4 derivative of a basic type
      no longer emits a warning.

    • The list method of within() gains an option keepAttrs = FALSE for
      some speed-up.

    • system() and system2() now allow the specification of a maximum
      elapsed time (‘timeout’).

    • debug() supports debugging of methods on any object of S4 class
      "genericFunction", including group generics.

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

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

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

    • print() methods for "xgettext" and "xngettext" now use
      encodeString() which keeps, e.g. "\n", visible.  (Wish of
      PR#17298.)

    • package.skeleton() gains an optional encoding argument.

    • approx(), spline(), splinefun() and approxfun() also work for
      long vectors.

    • deparse() and dump() are more useful for S4 objects, dput() now
      using the same internal C code instead of its previous imperfect
      workaround R code.  S4 objects now typically deparse perfectly,
      i.e., can be recreated identically from deparsed code.

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

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

      m:n now also deparses nicely when m > n.

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

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

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

    • mclapply() gets an option affinity.list which allows more
      efficient execution with heterogeneous processors, thanks to
      Helena Kotthaus.

    • The character methods for as.Date() and as.POSIXlt() are more
      flexible _via_ new arguments tryFormats and optional: see their
      help pages.

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

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

    • Command line completion on :: now also includes lazy-loaded data.

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

    • There is now a [ method for class "DLLInfoList".

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

    • aspell() gains a filter for Markdown (.md and .Rmd) files.

    • intToUtf8(multiple = FALSE) gains an argument to allow surrogate
      pairs to be interpreted.

    • The maximum number of DLLs that can be loaded into R e.g. _via_
      dyn.load() has been increased up to 614 when the OS limit on the
      number of open files allows.

    • Sys.timezone() on a Unix-alike caches the value at first use in a
      session: _inter alia_ this means that setting TZ later in the
      session affects only the _current_ time zone and not the _system_
      one.

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

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

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

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

    • coef() methods (for lm etc) also gain a complete = TRUE optional
      argument for consistency with vcov().
      For "aov", both coef() and vcov() methods remain back-compatibly
      consistent, using the _other_ default, complete = FALSE.

    • attach(*, pos = 1) is now an error instead of a warning.

    • New function getDefaultCluster() in package parallel to get the
      default cluster set via setDefaultCluster().

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

    • gc() gets new argument full.

    • write.dcf() gets optional argument useBytes.

    • New, partly experimental packageDate() which tries to get a valid
      "Date" object from a package DESCRIPTION file, thanks to
      suggestions in PR#17324.

    • tools::resaveRdaFiles() gains a version argument, for use when
      packages should remain compatible with earlier versions of R.

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

    • New warnErrList() utility (from package nlme, improved).

    • By default the (arbitrary) signs of the loadings from princomp()
      are chosen so the first element is non-negative.

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

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

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

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

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

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

    • Single components of "POSIXlt" objects can now be extracted and
      replaced via [ indexing with 2 indices.

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

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

    • Finalizers are now run with interrupts suspended.

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

    • scale.default(x, center, scale) now also allows center or scale
      to be “numeric-alike”, i.e., such that as.numeric(.) coerces them
      correctly.  This also eliminates a wrong error message in such
      cases.

    • par*apply and par*applyLB gain an optional argument chunk.size
      which allows to specify the granularity of scheduling.

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

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

    • The "Date" and “date-time” classes "POSIXlt" and "POSIXct" now
      have a working length<-() method, as wished in PR#17387.

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

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

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

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

  UTILITIES:

    • install.packages() for source packages now has the possibility to
      set a ‘timeout’ (elapsed-time limit).  For serial installs this
      uses the timeout argument of system2(): for parallel installs it
      requires the timeout utility command from GNU coreutils.

    • It is now possible to set ‘timeouts’ (elapsed-time limits) for
      most parts of R CMD check _via_ environment variables documented
      in the ‘R Internals’ manual.

    • The ‘BioC extra’ repository which was dropped from Bioconductor
      3.6 and later has been removed from setRepositories().  This
      changes the mapping for 6-8 used by setRepositories(ind=).

    • R CMD check now also applies the settings of environment
      variables _R_CHECK_SUGGESTS_ONLY_ and _R_CHECK_DEPENDS_ONLY_ to
      the re-building of vignettes.

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

  INSTALLATION on a UNIX-ALIKE:

    • Support for a system Java on macOS has been removed - install a
      fairly recent Oracle Java (see ‘R Installation and
      Administration’ §C.3.2).

    • configure works harder to set additional flags in SAFE_FFLAGS
      only where necessary, and to use flags which have little or no
      effect on performance.

      In rare circumstances it may be necessary to override the setting
      of SAFE_FFLAGS.

    • C99 functions expm1, hypot, log1p and nearbyint are now required.

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

  C-LEVEL FACILITIES:

    • ‘Writing R Extensions’ documents macros MAYBE_REFERENCED,
      MAYBE_SHARED and MARK_NOT_MUTABLE that should be used by package
      C code instead NAMED or SET_NAMED.

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

    • ‘Writing R Extensions’ now documents the R_tryCatch,
      R_tryCatchError, and R_UnwindProtect functions.

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

  DEPRECATED AND DEFUNCT:

    • Sys.timezone(location = FALSE) is defunct, and is ignored (with a
      warning).

    • methods:::bind_activation() is defunct now; it typically has been
      unneeded for years.

      The undocumented ‘hidden’ objects .__H__.cbind and .__H__.rbind
      in package base are deprecated (in favour of cbind and rbind).

    • The declaration of pythag() in Rmath.h has been removed - the
      entry point has not been provided since R 2.14.0.

  BUG FIXES:

    • printCoefmat() now also works without column names.

    • The S4 methods on Ops() for the "structure" class no longer cause
      infinite recursion when the structure is not an S4 object.

    • nlm(f, ..) for the case where f() has a "hessian" attribute now
      computes LL' = H + µI correctly.  (PR#17249).

    • An S4 method that “rematches” to its generic and overrides the
      default value of a generic formal argument to NULL no longer
      drops the argument from its formals.

    • Rscript can now accept more than one argument given on the #!
      line of a script. Previously, one could only pass a single
      argument on the #! line in Linux.

    • Connections are now written correctly with encoding "UTF-16LE".
      (PR#16737).

    • Evaluation of ..0 now signals an error.  When ..1 is used and ...
      is empty, the error message is more appropriate.

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

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

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

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

    • Extending S4 classes with slots corresponding to special
      attributes like dim and dimnames now works.

    • Fix for legend() when fill has multiple values the first of which
      is NA (all colours used to default to par(fg)).  (PR#17288)

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

    • The documentation for installed.packages(noCache = TRUE)
      incorrectly claimed it would refresh the cache.

    • aggregate(<data.frame>) no longer uses spurious names in some
      cases.  (PR#17283)

    • object.size() now also works for long vectors.

    • packageDescription() tries harder to solve re-encoding issues,
      notably seen in some Windows locales.  This fixes the citation()
      issue in PR#17291.

    • poly(<matrix>, 3) now works, thanks to prompting by Marc
      Schwartz.

    • readLines() no longer segfaults on very large files with embedded
      '\0' (aka ‘nul’) characters.  (PR#17311)

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

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

    • methods:::cbind() and methods:::rbind() avoid deep recursion,
      thanks to Suharto Anggono via PR#17300.

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

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

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

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

    • Reverted unintended change in behavior of return calls in on.exit
      expressions introduced by stack unwinding changes in R 3.3.0.

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

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

    • The methods package no longer directly copies slots (attributes)
      into a prototype that is of an “abnormal” (reference) type, like
      a symbol.

    • The methods package no longer attempts to call length<-() on NULL
      (during the bootstrap process).

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

    • sys.on.exit() is now always evaluated in the right frame. (From
      Lionel Henry.)

    • seq.POSIXt(*, by = "<n> DSTdays") now should work correctly in
      all cases and is faster.  (PR#17342)

    • .C() when returning a logical vector now always maps values other
      than FALSE and NA to TRUE (as documented).

    • Subassignment with zero length vectors now coerces as documented
      (PR#17344).
      Further, x <- numeric(); x[1] <- character() now signals an error
      ‘replacement has length zero’ (or a translation of that) instead
      of doing nothing.

    • (Package parallel.)  mclapply(), pvec() and mcparallel() (when
      mccollect() is used to collect results) no longer leave zombie
      processes behind.

    • R CMD INSTALL <pkg> now produces the intended error message when,
      e.g., the LazyData field is invalid.

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

    • mclapply(X, mc.cores) now follows its documentation and calls
      lapply() in case mc.cores = 1 also in the case mc.preschedule is
      false.  (PR#17373)

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

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

    • Calling names() on an S4 object derived from "environment"
      behaves (by default) like calling names() on an ordinary
      environment.

    • read.table() with a non-default separator now supports quotes
      following a non-whitespace character, matching the behavior of
      scan().

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

    • Indexing a list using dollar and empty string (l$"") returns
      NULL.

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

    • match.arg() more carefully chooses the environment for
      constructing default choices, fixing PR#17401 as proposed by
      Duncan Murdoch.

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

CHANGES IN R 3.4.4:

  NEW FEATURES:

    • Sys.timezone() tries more heuristics on Unix-alikes and so is
      more likely to succeed (especially on Linux).  For the slowest
      method, a warning is given recommending that TZ is set to avoid
      the search.

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

    • parallel::detectCores(logical = FALSE) is ignored on Linux
      systems, since the information is not available with virtualized
      OSes.

  INSTALLATION on a UNIX-ALIKE:

    • configure will use pkg-config to find the flags to link to jpeg
      if available (as it should be for the recently-released jpeg-9c
      and libjpeg-turbo).  (This amends the code added in R 3.3.0 as
      the module name in jpeg-9c is not what that tested for.)

  DEPRECATED AND DEFUNCT:

    • Sys.timezone(location = FALSE) (which was a stop-gap measure for
      Windows long ago) is deprecated.  It no longer returns the value
      of environment variable TZ (usually a location).

    • Legacy support of make macros such as CXX1X is formally
      deprecated: use the CXX11 forms instead.

  BUG FIXES:

    • power.prop.test() now warns when it cannot solve the problem,
      typically because of impossible constraints. (PR#17345)

    • removeSource() no longer erroneously removes NULL in certain
      cases, thanks to Dénes Tóth.

    • nls(`NO [mol/l]` ~ f(t)) and nls(y ~ a) now work.  (Partly from
      PR#17367)

    • R CMD build checks for GNU cp rather than assuming Linux has it.
      (PR#17370 says ‘Alpine Linux’ does not.)

    • Non-UTF-8 multibyte character handling fixed more permanently
      (PR#16732).

    • sum(<large ints>, <stuff>) is more consistent.  (PR#17372)

    • rf() and rbeta() now also work correctly when ncp is not scalar,
      notably when (partly) NA.  (PR#17375)

    • is.na(NULL) no longer warns.  (PR#16107)

    • R CMD INSTALL now correctly sets C++ compiler flags when all
      source files are in sub-directories of src.

CHANGES IN R 3.4.3:

  INSTALLATION on a UNIX-ALIKE:

    • A workaround has been added for the changes in location of
      time-zone files in macOS 10.13 ‘High Sierra’ and again in
      10.13.1, so the default time zone is deduced correctly from the
      system setting when R is configured with --with-internal-tzcode
      (the default on macOS).

    • R CMD javareconf has been updated to recognize the use of a Java
      9 SDK on macOS.

  BUG FIXES:

    • raw(0) & raw(0) and raw(0) | raw(0) again return raw(0) (rather
      than logical(0)).

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

    • Fix calling of methods on S4 generics that dispatch on ... when
      the call contains ....

    • Following Unicode ‘Corrigendum 9’, the UTF-8 representations of
      U+FFFE and U+FFFF are now regarded as valid by utf8ToInt().

    • range(c(TRUE, NA), finite = TRUE) and similar no longer return
      NA. (Reported by Lukas Stadler.)

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

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

CHANGES IN R 3.4.2:

  NEW FEATURES:

    • Setting the LC_ALL category in Sys.setlocale() invalidates any
      cached locale-specific day/month names and the AM/PM indicator
      for strptime() (as setting LC_TIME has since R 3.1.0).

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

    • The default for tools::write_PACKAGES(rds_compress=) has been
      changed to "xz" to match the compression used by CRAN.

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

  UTILITIES:

    • R CMD check checks for and R CMD build corrects CRLF line endings
      in shell scripts configure and cleanup (even on Windows).

  INSTALLATION on a UNIX-ALIKE:

    • The order of selection of OpenMP flags has been changed: Oracle
      Developer Studio 12.5 accepts -fopenmp and -xopenmp but only the
      latter enables OpenMP so it is now tried first.

  BUG FIXES:

    • within(List, rm(x1, x2)) works correctly again, including when
      List[["x2"]] is NULL.

    • regexec(pattern, text, *) now applies as.character(.) to its
      first two arguments, as documented.

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

    • rt() assumed the ncp parameter was a scalar.  (PR#17306)

    • menu(choices) with more than 10 choices which easily fit into one
      getOption("width")-line no longer erroneously repeats choices.
      (PR#17312)

    • length()<- on a pairlist succeeds.  (<URL:
      https://stat.ethz.ch/pipermail/r-devel/2017-July/074680.html>)

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

    • Construction of names() for very large objects in c() and
      unlist() now works, thanks to Suharto Anggono's patch proposals
      in PR#17292.

    • Resource leaks (and similar) reported by Steve Grubb fixed.
      (PR#17314, PR#17316, PR#17317, PR#17318, PR#17319, PR#17320)

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

    • sigma(fm) now takes the correct denominator degrees of freedom
      for a fitted model with NA coefficients.  (PR#17313)

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

    • callNextMethod() works for ... methods.

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

    • Setting options(device = *) to an invalid function no longer
      segfaults when plotting is initiated.  (PR#15883)

    • encodeString(<very large string>) no longer segfaults.
      (PR#15885)

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

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

    • readRDS(textConnection(.)) works again.  (PR#17325)

    • (1:n)[-n] no longer segfaults for n <- 2.2e9 (on a platform with
      enough RAM).

    • x <- 1:2; tapply(x, list(x, x), function(x) "")[1,2] now
      correctly returns NA.  (PR#17333)

    • Running of finalizers after explicit GC request moved from the R
      interface do_gc to the C interface R_gc.  This helps with
      reclaiming inaccessible connections.

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

    • The X11 device no longer uses the Xlib backing store (PR#16497).

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

    • splineDesign(.., derivs = 4) no longer segfaults.

    • fisher.test(*, hybrid=TRUE) now (again) will use the hybrid
      method when Cochran's conditions are met, fixing PR#16654.

CHANGES IN R 3.4.1:

  INSTALLATION on a UNIX-ALIKE:

    • The deprecated support for PCRE versions older than 8.20 has been
      removed.

  BUG FIXES:

    • getParseData() gave incorrect column information when code
      contained multi-byte characters.  (PR#17254)

    • Asking for help using expressions like ?stats::cor() did not
      work.  (PR#17250)

    • readRDS(url(....)) now works.

    • R CMD Sweave again returns status = 0 on successful completion.

    • Vignettes listed in .Rbuildignore were not being ignored
      properly.  (PR#17246)

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

    • R CMD INSTALL Windows .zip file obeys --lock and --pkglock flags.

    • (Windows only) The choose.files() function could return incorrect
      results when called with multi = FALSE.  (PR#17270)

    • aggregate(<data.frame>, drop = FALSE) now also works in case of
      near-equal numbers in by.  (PR#16918)

    • fourfoldplot() could encounter integer overflow when calculating
      the odds ratio. (PR#17286)

    • parse() no longer gives spurious warnings when extracting srcrefs
      from a file not encoded in the current locale.

      This was seen from R CMD check with inst/doc/*.R files, and check
      has some additional protection for such files.

    • print.noquote(x) now always returns its argument x (invisibly).

    • Non-UTF-8 multibyte character sets were not handled properly in
      source references.  (PR#16732)

CHANGES IN R 3.4.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

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

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

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

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

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

    • Arithmetic, logic (&, |) and comparison (aka ‘relational’, e.g.,
      <, ==) operations with arrays now behave consistently, notably
      for arrays of length zero.

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

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

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

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

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

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

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

  NEW FEATURES:

    • User errors such as integrate(f, 0:1, 2) are now caught.

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

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

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

    • str() and strOptions() get a new option drop.deparse.attr with
      improved but _changed_ default behaviour for expressions.  For
      expression objects x, str(x) now may remove extraneous white
      space and truncate long lines.

    • str(<looooooooong_string>) is no longer very slow; inspired by
      Mikko Korpela's proposal in PR#16527.

    • str(x)'s default method is more “accurate” and hence somewhat
      more generous in displaying character vectors; this will
      occasionally change R outputs (and need changes to some
      *.Rout(.save) files).

      For a classed integer vector such as x <- xtabs(~ c(1,9,9,9)),
      str(x) now shows both the class and "int", instead of only the
      latter.

    • isSymmetric(m) is much faster for large asymmetric matrices m
      _via_ pre-tests and a new option tol1 (with which strict back
      compatibility is possible but not the default).

    • The result of eigen() now is of class "eigen" in the default case
      when eigenvectors are computed.

    • Zero-length date and date-time objects (of classes "POSIX[cl]?t")
      now print() “recognizably”.

    • xy.coords() and xyz.coords() get a new setLab option.

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

    • stopifnot(E, ..) now reports differences when E is a call to
      all.equal() and that is not true.

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

    • The plot() method for ppr() has enhanced default labels (xmin and
      main).

    • sample.int() gains an explicit useHash option (with a back
      compatible default).

    • identical() gains an ignore.srcref option which drops "srcref"
      and similar attributes when true (as by default).

    • diag(x, nrow = n) now preserves typeof(x), also for logical,
      integer and raw x (and as previously for complex and numeric).

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

    • addNA() is faster now, e.g. when applied twice.  (Part of
      PR#16895.)

    • New option rstandard(<lm>, type = "predicted") provides the
      “PRESS”-related leave-one-out cross-validation errors for linear
      models.

    • After seven years of deprecation, duplicated factor levels now
      produce a warning when printed and an error in levels<- instead
      of a warning.

    • Invalid factors, e.g., with duplicated levels (invalid but
      constructable) now give a warning when printed, _via_ new
      function .valid.factor().

    • sessionInfo() has been updated for Apple's change in OS naming as
      from ‘10.12’ (‘macOS Sierra’ _vs_ ‘OS X El Capitan’).

      Its toLatex() method now includes the running component.

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

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

    • Radix sort is now chosen by method = "auto" for sort.int() for
      double vectors (and hence used for sort() for unclassed double
      vectors), excluding ‘long’ vectors.

      sort.int(method = "radix") no longer rounds double vectors.

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

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

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

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

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

    • citation() supports inst/CITATION files from package source
      trees, with lib.loc pointing to the directory containing the
      package.

    • try() gains a new argument outFile with a default that can be
      modified _via_ options(try.outFile = .), useful notably for
      Sweave.

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

    • Connections now print() without error even if invalid, e.g. after
      having been destroyed.

    • apropos() and find(simple.words = FALSE) no longer match object
      names starting with . which are known to be internal objects
      (such as .__S3MethodsTable__.).

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

    • strcapture() no longer fixes column names nor coerces strings to
      factors (suggested by Bill Dunlap).

    • strcapture() returns NA for non-matching values in x (suggested
      by Bill Dunlap).

    • source() gets new optional arguments, notably exprs; this is made
      use of in the new utility function withAutoprint().

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

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

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

    • The license check enabled by options(checkPackageLicense = TRUE)
      is now done when the package's namespace is first loaded.

    • ppr() and supsmu() get an optional trace argument, and ppr(..,
      sm.method = ..spline) is no longer limited to sample size n <=
      2500.

    • The POSIXct method for print() gets optional tz and usetz
      arguments, thanks to a report from Jennifer S. Lyon.

    • New function check_packages_in_dir_details() in package tools for
      analyzing package-check log files to obtain check details.

    • Package tools now exports function CRAN_package_db() for
      obtaining information about current packages in the CRAN package
      repository, and several functions for obtaining the check status
      of these packages.

    • The (default) Stangle driver Rtangle allows annotate to be a
      function and gets a new drop.evalFALSE option.

    • The default method for quantile(x, prob) should now be monotone
      in prob, even in border cases, see PR#16672.

    • bug.report() now tries to extract an email address from a
      BugReports field, and if there is none, from a Contacts field.

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

    • If a reference class has a validity method, validObject will be
      called automatically from the default initialization method for
      reference classes.

    • tapply() gets new option default = NA allowing to change the
      previously hardcoded value.

    • read.dcf() now consistently interprets any ‘whitespace’ to be
      stripped to include newlines.

    • The maximum number of DLLs that can be loaded into R e.g. _via_
      dyn.load() can now be increased by setting the environment
      variable R_MAX_NUM_DLLS before starting R.

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

    • Loading the parallel package namespace no longer sets or changes
      the .Random.seed, even if R_PARALLEL_PORT is unset.

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

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

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

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

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

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

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

      This is controlled by a new option PCRE_use_JIT.

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

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

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

    • getGraphicsEvent() now works on X11(type = "cairo") devices.
      Thanks to Frederick Eaton (for reviving an earlier patch).

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

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

    • median() gains a formal ... argument, so methods with extra
      arguments can be provided.

    • strwrap() reduces indent if it is more than half width rather
      than giving an error.  (Suggested by Bill Dunlap.)

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

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

  C-LEVEL FACILITIES:

    • Entry points R_MakeExternalPtrFn and R_ExternalPtrFn are now
      declared in header Rinternals.h to facilitate creating and
      retrieving an R external pointer from a C function pointer
      without ISO C warnings about the conversion of function pointers.

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

      Because it is needed by about 70 CRAN packages, headers R.h and
      Rmath.h still declare

      use namespace std;
      
      when included on Solaris.

    • When included from C++, the R headers now use forms such as
      std::FILE directly rather than including the line

      using std::FILE;
      
      C++ code including these headers might be relying on the latter.

    • Headers R_ext/BLAS.h and R_ext/Lapack.h have many improved
      declarations including const for double-precision complex
      routines. _Inter alia_ this avoids warnings when passing ‘string
      literal’ arguments from C++11 code.

    • Headers for Unix-only facilities R_ext/GetX11Image.h,
      R_ext/QuartzDevice.h and R_ext/eventloop.h are no longer
      installed on Windows.

    • No-longer-installed headers GraphicsBase.h, RGraphics.h,
      Rmodules/RX11.h and Rmodules/Rlapack.h which had a LGPL license
      no longer do so.

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

    • Package tools has a new function
      package_native_routine_registration_skeleton() to assist adding
      native-symbol registration to a package.  See its help and §5.4.1
      of ‘Writing R Extensions’ for how to use it.  (At the time it was
      added it successfully automated adding registration to over 90%
      of CRAN packages which lacked it.  Many of the failures were
      newly-detected bugs in the packages, e.g. 50 packages called
      entry points with varying numbers of arguments and 65 packages
      called entry points not in the package.)

  INSTALLATION on a UNIX-ALIKE:

    • readline headers (and not just the library) are required unless
      configuring with --with-readline=no.

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

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

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

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

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

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

    • configure checks that the compiler specified by $CXX $CXXFLAGS is
      able to compile C++ code.

    • configure checks for the required header sys/select.h (or
      sys/time.h on legacy systems) and system call select and aborts
      if they are not found.

    • If available, the POSIX 2008 system call utimensat will be used
      by Sys.setFileTime() and file.copy(copy.date = TRUE).  This may
      result in slightly more accurate file times.  (It is available on
      Linux and FreeBSD but not macOS.)

    • The minimum version requirement for libcurl has been reduced to
      7.22.0, although at least 7.28.0 is preferred and earlier
      versions are little tested.  (This is to support Debian 7
      ‘Wheezy’ LTS and Ubuntu ‘Precise’ 12.04 LTS, although the latter
      is close to end-of-life.)

    • configure tests for a C++17-compliant compiler.  The tests are
      experimental and subject to change in the future.

  INCLUDED SOFTWARE:

    • (Windows only) Tcl/Tk version 8.6.4 is now included in the binary
      builds.  The tcltk*.chm help file is no longer included; please
      consult the online help at <URL: http://www.tcl.tk/man/> instead.

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

  PACKAGE INSTALLATION:

    • There is support for compiling C++14 or C++17 code in packages on
      suitable platforms: see ‘Writing R Extensions’ for how to request
      this.

    • The order of flags when LinkingTo other packages has been changed
      so their include directories come earlier, before those specified
      in CPPFLAGS.  This will only have an effect if non-system include
      directories are included with -I flags in CPPFLAGS (and so not
      the default -I/usr/local/include which is treated as a system
      include directory on most platforms).

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

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

  UTILITIES:

    • Running R CMD check --as-cran with _R_CHECK_CRAN_INCOMING_REMOTE_
      false now skips tests that require remote access.  The remaining
      (local) tests typically run quickly compared to the remote tests.

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

    • R CMD config gains a --all option for printing names and values
      of all basic configure variables.

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

    • R CMD check now checks that output files in inst/doc are newer
      than the source files in vignettes.

    • For consistency with other package subdirectories, files named
      *.r in the tests directory are now recognized as tests by R CMD
      check. (Wish of PR#17143.)

    • R CMD build and R CMD check now use the _union_ of R_LIBS and
      .libPaths().  They may not be equivalent, e.g., when the latter
      is determined by R_PROFILE.

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

    • The new option R CMD check --no-stop-on-test-error allows running
      the remaining tests (under tests/) even if one gave an error.

    • Check customization _via_ environment variables to detect side
      effects of .Call() and .External() calls which alter their
      arguments is described in §8 of the ‘R Internals’ manual.

    • R CMD check now checks any BugReports field to be non-empty and a
      suitable single URL.

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

  DEPRECATED AND DEFUNCT:

    • (Windows only) Function setInternet2() is defunct.

    • Installation support for readline emulations based on editline
      (aka libedit) is deprecated.

    • Use of the C/C++ macro NO_C_HEADERS is defunct and silently
      ignored.

    • unix.time(), a traditional synonym for system.time(), has been
      deprecated.

    • structure(NULL, ..) is now deprecated as you cannot set
      attributes on NULL.

    • Header Rconfig.h no longer defines SUPPORT_OPENMP; instead use
      _OPENMP (as documented for a long time).

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

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

  BUG FIXES:

    • Getting or setting body() or formals() on non-functions for now
      signals a warning and may become an error for setting.

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

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

    • Rotated symbols in plotmath expressions are now positioned
      correctly on x11(type = "Xlib"). (PR#16948)

    • as<-() avoids an infinite loop when a virtual class is interposed
      between a subclass and an actual superclass.

    • Fix level propagation in unlist() when the list contains
      zero-length lists or factors.

    • Fix S3 dispatch on S4 objects when the methods package is not
      attached.

    • Internal S4 dispatch sets .Generic in the method frame for
      consistency with standardGeneric().  (PR#16929)

    • Fix order(x, decreasing = TRUE) when x is an integer vector
      containing MAX_INT.  Ported from a fix Matt Dowle made to
      data.table.

    • Fix caching by callNextMethod(), resolves PR#16973 and PR#16974.

    • grouping() puts NAs last, to be consistent with the default
      behavior of order().

    • Point mass limit cases: qpois(-2, 0) now gives NaN with a warning
      and qgeom(1, 1) is 0.  (PR#16972)

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

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

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

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

    • droplevels(f) now keeps <NA> levels when present.

    • In integer arithmetic, NULL is now treated as integer(0) whereas
      it was previously treated as double(0).

    • The radix sort considers NA_real_ and NaN to be equivalent in
      rank (like the other sort algorithms).

    • When index.return=TRUE is passed to sort.int(), the radix sort
      treats NAs like sort.list() does (like the other sort
      algorithms).

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

    • as.character.factor() respects S4 inheritance when checking the
      type of its argument. (PR#17141)

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

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

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

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

    • Asking for methods() on "|" returns only S3 methods. See <URL:
      https://stat.ethz.ch/pipermail/r-devel/2016-December/073476.html>.

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

    • seq("2", "5") now works too, equivalently to "2":"5" and
      seq.int().

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

    • rep(x, times) and rep.int(x, times) now work when times is larger
      than the largest value representable in an integer vector.
      (PR#16932)

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

    • Bandwidth selectors bw.ucv(), bw.bcv() and bw.SJ() now avoid
      integer overflow for large sample sizes.

    • str() no longer shows "list output truncated", in cases that list
      was not shown at all.  Thanks to Neal Fultz (PR#17219)

    • Fix for cairo_pdf() (and svg() and cairo_ps()) when replaying a
      saved display list that contains a mix of grid and graphics
      output.  (Report by Yihui Xie.)

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

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

    • If a vignette in the vignettes directory is listed in
      .Rbuildignore, R CMD build would not include it in the tarball,
      but would include it in the vignette database, leading to a check
      warning.  (PR#17246)

    • tools::latexToUtf8() infinite looped on certain inputs.
      (PR#17138)

    • terms.formula() ignored argument names when determining whether
      two terms were identical.  (PR#17235)

    • callNextMethod() was broken when called from a method that
      augments the formal arguments of a primitive generic.

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

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

CHANGES IN R 3.3.3:

  NEW FEATURES:

    • Changes when redirection of a http:// URL to a https:// URL is
      encountered:

        • The internal methods of download.file() and url() now report
          that they cannot follow this (rather than failing silently).

        • (Unix-alike) download.file(method = "auto") (the default)
          re-tries with method = "libcurl".

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

  INSTALLATION on a UNIX-ALIKE:

    • The configure check for the zlib version is now robust to
      versions longer than 5 characters, including 1.2.11.

  UTILITIES:

    • Environmental variable _R_CHECK_TESTS_NLINES_ controls how R CMD
      check reports failing tests (see §8 of the ‘R Internals’ manual).

  DEPRECATED AND DEFUNCT:

    • (C-level Native routine registration.)  The undocumented styles
      field of the components of R_CMethodDef and R_FortranMethodDef is
      deprecated.

  BUG FIXES:

    • vapply(x, *) now works with long vectors x.  (PR#17174)

    • isS3method("is.na.data.frame") and similar are correct now.
      (PR#17171)

    • grepRaw(<long>, <short>, fixed = TRUE) now works, thanks to a
      patch by Mikko Korpela.  (PR#17132)

    • Package installation into a library where the package exists
      _via_ symbolic link now should work wherever Sys.readlink()
      works, resolving PR#16725.

    • "Cincinnati" was missing an "n" in the precip dataset.

    • Fix buffer overflow vulnerability in pdf() when loading an
      encoding file.  Reported by Talos (TALOS-2016-0227).

    • getDLLRegisteredRoutines() now produces its warning correctly
      when multiple DLLs match, thanks to Matt Dowle's PR#17184.

    • Sys.timezone() now returns non-NA also on platforms such as
      Ubuntu 14.04.5 LTS, thanks to Mikko Korpela's PR#17186.

    • format(x) for an illegal "POSIXlt" object x no longer segfaults.

    • methods(f) now also works for f "(" or "{".

    • (Windows only) dir.create() did not check the length of the path
      to create, and so could overflow a buffer and crash R.
      (PR#17206)

    • On some systems, very small hexadecimal numbers in hex notation
      would underflow to zero.  (PR#17199)

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

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

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

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

    • findMethod() failed if the active signature had expanded beyond
      what a particular package used. (Example with packages XR and
      XRJulia on CRAN.)

    • qbeta() underflowed too early in some very asymmetric cases.
      (PR#17178)

    • R CMD Rd2pdf had problems with packages with non-ASCII titles in
      .Rd files (usually the titles were omitted).

CHANGES IN R 3.3.2:

  NEW FEATURES:

    • extSoftVersion() now reports the version (if any) of the readline
      library in use.

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

    • Use options(deparse.max.lines=) to limit the number of lines
      recorded in .Traceback and other deparsing activities.

    • format(<AsIs>) looks more regular, also for non-character atomic
      matrices.

    • abbreviate() gains an option named = TRUE.

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

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

  INSTALLATION and INCLUDED SOFTWARE:

    • Versions of the readline library >= 6.3 had been changed so that
      terminal window resizes were not signalled to readline: code has
      been added using a explicit signal handler to work around that
      (when R is compiled against readline >= 6.3).  (PR#16604)

    • configure works better with Oracle Developer Studio 12.5.

  UTILITIES:

    • R CMD check reports more dubious flags in files
      src/Makevars[.in], including -w and -g.

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

    • R CMD config works better with paths containing spaces, even
      those of home directories (as reported by Ken Beath).

  DEPRECATED AND DEFUNCT:

    • Use of the C/C++ macro NO_C_HEADERS is deprecated (no C headers
      are included by R headers from C++ as from R 3.3.0, so it should
      no longer be needed).

  BUG FIXES:

    • The check for non-portable flags in R CMD check could be stymied
      by src/Makevars files which contained targets.

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

    • pretty(d, ..) behaves better for date-time d (PR#16923).

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

    • sample(NA_real_) now works.

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

    • merge(df1, df2) now also works for data frames with column names
      "na.last", "decreasing", or "method".  (PR#17119)

    • contour() caused a segfault if the labels argument had length
      zero.  (Reported by Bill Dunlap.)

    • unique(warnings()) works more correctly, thanks to a new
      duplicated.warnings() method.

    • findInterval(x, vec = numeric(), all.inside = TRUE) now returns
      0s as documented.  (Reported by Bill Dunlap.)

    • (Windows only) R CMD SHLIB failed when a symbol in the resulting
      library had the same name as a keyword in the .def file.
      (PR#17130)

    • pmax() and pmin() now work with (more ?)  classed objects, such
      as "Matrix" from the Matrix package, as documented for a long
      time.

    • axis(side, x = D) and hence Axis() and plot() now work correctly
      for "Date" and time objects D, even when “time goes backward”,
      e.g., with decreasing xlim.  (Reported by William May.)

    • str(I(matrix(..))) now looks as always intended.

    • plot.ts(), the plot() method for time series, now respects cex,
      lwd and lty.  (Reported by Greg Werbin.)

    • parallel::mccollect() now returns a named list (as documented)
      when called with wait = FALSE.  (Reported by Michel Lang.)

    • If a package added a class to a class union in another package,
      loading the first package gave erroneous warnings about
      “undefined subclass”.

    • c()'s argument use.names is documented now, as belonging to the
      (C internal) default method.  In “parallel”, argument recursive
      is also moved from the generic to the default method, such that
      the formal argument list of base generic c() is just (...).

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

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

    • split(<very_long>, *) now works even when the split off parts are
      long. (PR#17139)

    • min() and max() now also work correctly when the argument list
      starts with character(0).  (PR#17160)

    • Subsetting very large matrices (prod(dim(.)) >= 2^31) now works
      thanks to Michael Schubmehl's PR#17158.

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

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

    • xtabs(~ exclude) no longer fails from wrong scope, thanks to
      Suharto Anggono's PR#17147.

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

    • findInterval(x, vec, left.open = TRUE) misbehaved in some cases.
      (Reported by Dmitriy Chernykh.)

CHANGES IN R 3.3.1:

  BUG FIXES:

    • R CMD INSTALL and hence install.packages() gave an internal error
      installing a package called description from a tarball on a
      case-insensitive file system.

    • match(x, t) (and hence x %in% t) failed when x was of length one,
      and either character and x and t only differed in their Encoding
      or when x and t where complex with NAs or NaNs.  (PR#16885.)

    • unloadNamespace(ns) also works again when ns is a ‘namespace’, as
      from getNamespace().

    • rgamma(1, Inf) or rgamma(1, 0, 0) no longer give NaN but the
      correct limit.

    • length(baseenv()) is correct now.

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

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

    • as.factor(c(a = 1L)) preserves names() again as in R < 3.1.0.

    • strtrim(""[0], 0[0]) now works.

    • Use of Ctrl-C to terminate a reverse incremental search started
      by Ctrl-R in the readline-based Unix terminal interface is now
      supported when R was compiled against readline >= 6.0 (Ctrl-G
      always worked).  (PR#16603)

    • diff(<difftime>) now keeps the "units" attribute, as subtraction
      already did, PR#16940.

CHANGES IN R 3.3.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • nchar(x, *)'s argument keepNA governing how the result for NAs in
      x is determined, gets a new default keepNA = NA which returns NA
      where x is NA, except for type = "width" which still returns 2,
      the formatting / printing width of NA.

    • All builds have support for https: URLs in the default methods
      for download.file(), url() and code making use of them.

      Unfortunately that cannot guarantee that any particular https:
      URL can be accessed.  For example, server and client have to
      successfully negotiate a cryptographic protocol (TLS/SSL, ...)
      and the server's identity has to be verifiable _via_ the
      available certificates.  Different access methods may allow
      different protocols or use private certificate bundles: we
      encountered a https: CRAN mirror which could be accessed by one
      browser but not by another nor by download.file() on the same
      Linux machine.

  NEW FEATURES:

    • The print method for methods() gains a byclass argument.

    • New functions validEnc() and validUTF8() to give access to the
      validity checks for inputs used by grep() and friends.

    • Experimental new functionality for S3 method checking, notably
      isS3method().

      Also, the names of the R ‘language elements’ are exported as
      character vector tools::langElts.

    • str(x) now displays "Time-Series" also for matrix (multivariate)
      time-series, i.e. when is.ts(x) is true.

    • (Windows only) The GUI menu item to install local packages now
      accepts *.tar.gz files as well as *.zip files (but defaults to
      the latter).

    • New programmeR's utility function chkDots().

    • D() now signals an error when given invalid input, rather than
      silently returning NA.  (Request of John Nash.)

    • formula objects are slightly more “first class”: e.g., formula()
      or new("formula", y ~ x) are now valid.  Similarly, for "table",
      "ordered" and "summary.table".  Packages defining S4 classes with
      the above S3/S4 classes as slots should be reinstalled.

    • New function strrep() for repeating the elements of a character
      vector.

    • rapply() preserves attributes on the list when how = "replace".

    • New S3 generic function sigma() with methods for extracting the
      estimated standard deviation aka “residual standard deviation”
      from a fitted model.

    • news() now displays R and package news files within the HTML help
      system if it is available.  If no news file is found, a visible
      NULL is returned to the console.

    • as.raster(x) now also accepts raw arrays x assuming values in
      0:255.

    • Subscripting of matrix/array objects of type "expression" is now
      supported.

    • type.convert("i") now returns a factor instead of a complex value
      with zero real part and missing imaginary part.

    • Graphics devices cairo_pdf() and cairo_ps() now allow non-default
      values of the cairographics ‘fallback resolution’ to be set.

      This now defaults to 300 on all platforms: that is the default
      documented by cairographics, but apparently was not used by all
      system installations.

    • file() gains an explicit method argument rather than implicitly
      using getOption("url.method", "default").

    • Thanks to a patch from Tomas Kalibera, x[x != 0] is now typically
      faster than x[which(x != 0)] (in the case where x has no NAs, the
      two are equivalent).

    • read.table() now always uses the names for a named colClasses
      argument (previously names were only used when colClasses was too
      short). (In part, wish of PR#16478.)

    • (Windows only) download.file() with default method = "auto" and a
      ftps:// URL chooses "libcurl" if that is available.

    • The out-of-the box Bioconductor mirror has been changed to one
      using https://: use chooseBioCmirror() to choose a http:// mirror
      if required.

    • The data frame and formula methods for aggregate() gain a drop
      argument.

    • available.packages() gains a repos argument.

    • The undocumented switching of methods for url() on https: and
      ftps: URLs is confined to method = "default" (and documented).

    • smoothScatter() gains a ret.selection argument.

    • qr() no longer has a ... argument to pass additional arguments to
      methods.

    • [ has a method for class "table".

    • It is now possible (again) to replayPlot() a display list
      snapshot that was created by recordPlot() in a different R
      session.

      It is still not a good idea to use snapshots as a persistent
      storage format for R plots, but it is now not completely silly to
      use a snapshot as a format for transferring an R plot between two
      R sessions.

      The underlying changes mean that packages providing graphics
      devices (e.g., Cairo, RSvgDevice, cairoDevice, tikzDevice) will
      need to be reinstalled.

      Code for restoring snapshots was contributed by Jeroen Ooms and
      JJ Allaire.

      Some testing code is available at <URL:
      https://github.com/pmur002/R-display-list>.

    • tools::undoc(dir = D) and codoc(dir = D) now also work when D is
      a directory whose normalizePath()ed version does not end in the
      package name, e.g. from a symlink.

    • abbreviate() has more support for multi-byte character sets - it
      no longer removes bytes within characters and knows about Latin
      vowels with accents.  It is still only really suitable for (most)
      European languages, and still warns on non-ASCII input.

      abbreviate(use.classes = FALSE) is now implemented, and that is
      more suitable for non-European languages.

    • match(x, table) is faster (sometimes by an order of magnitude)
      when x is of length one and incomparables is unchanged, thanks to
      Peter Haverty (PR#16491).

    • More consistent, partly not back-compatible behavior of NA and
      NaN coercion to complex numbers, operations less often resulting
      in complex NA (NA_complex_).

    • lengths() considers methods for length and [[ on x, so it should
      work automatically on any objects for which appropriate methods
      on those generics are defined.

    • The logic for selecting the default screen device on OS X has
      been simplified: it is now quartz() if that is available even if
      environment variable DISPLAY has been set by the user.

      The choice can easily be overridden _via_ environment variable
      R_INTERACTIVE_DEVICE.

    • On Unix-like platforms which support the getline C library
      function, system(*, intern = TRUE) no longer truncates (output)
      lines longer than 8192 characters, thanks to Karl Millar.
      (PR#16544)

    • rank() gains a ties.method = "last" option, for convenience (and
      symmetry).

    • regmatches(invert = NA) can now be used to extract both
      non-matched and matched substrings.

    • data.frame() gains argument fix.empty.names; as.data.frame.list()
      gets new cut.names, col.names and fix.empty.names.

    • plot(x ~ x, *) now warns that it is the same as plot(x ~ 1, *).

    • recordPlot() has new arguments load and attach to allow package
      names to be stored as part of a recorded plot.  replayPlot() has
      new argument reloadPkgs to load/attach any package names that
      were stored as part of a recorded plot.

    • S4 dispatch works within calls to .Internal(). This means
      explicit S4 generics are no longer needed for unlist() and
      as.vector().

    • Only font family names starting with "Hershey" (and not "Her" as
      before) are given special treatment by the graphics engine.

    • S4 values are automatically coerced to vector (_via_ as.vector)
      when subassigned into atomic vectors.

    • findInterval() gets a left.open option.

    • The version of LAPACK included in the sources has been updated to
      3.6.0, including those ‘deprecated’ routines which were
      previously included.  _Ca_ 40 double-complex routines have been
      added at the request of a package maintainer.

      As before, the details of what is included are in
      src/modules/lapack/README and this now gives information on
      earlier additions.

    • tapply() has been made considerably more efficient without
      changing functionality, thanks to proposals from Peter Haverty
      and Suharto Anggono.  (PR#16640)

    • match.arg(arg) (the one-argument case) is faster; so is
      sort.int().  (PR#16652)

    • The format method for object_size objects now also accepts
      “binary” units such as "KiB" and e.g., "Tb".  (Partly from
      PR#16649.)

    • Profiling now records calls of the form foo::bar and some similar
      cases directly rather than as calls to <Anonymous>.  Contributed
      by Winston Chang.

    • New string utilities startsWith(x, prefix) and endsWith(x,
      suffix).  Also provide speedups for some grepl("^...", *) uses
      (related to proposals in PR#16490).

    • Reference class finalizers run at exit, as well as on garbage
      collection.

    • Avoid parallel dependency on stats for port choice and random
      number seeds.  (PR#16668)

    • The radix sort algorithm and implementation from data.table
      (forder) replaces the previous radix (counting) sort and adds a
      new method for order().  Contributed by Matt Dowle and Arun
      Srinivasan, the new algorithm supports logical, integer (even
      with large values), real, and character vectors.  It outperforms
      all other methods, but there are some caveats (see ?sort).

    • The order() function gains a method argument for choosing between
      "shell" and "radix".

    • New function grouping() returns a permutation that stably
      rearranges data so that identical values are adjacent.  The
      return value includes extra partitioning information on the
      groups.  The implementation came included with the new radix
      sort.

    • rhyper(nn, m, n, k) no longer returns NA when one of the three
      parameters exceeds the maximal integer.

    • switch() now warns when no alternatives are provided.

    • parallel::detectCores() now has default logical = TRUE on all
      platforms - as this was the default on Windows, this change only
      affects Sparc Solaris.

      Option logical = FALSE is now supported on Linux and recent
      versions of OS X (for the latter, thanks to a suggestion of Kyaw
      Sint).

    • hist() for "Date" or "POSIXt" objects would sometimes give
      misleading labels on the breaks, as they were set to the day
      before the start of the period being displayed.  The display
      format has been changed, and the shift of the start day has been
      made conditional on right = TRUE (the default).  (PR#16679)

    • R now uses a new version of the logo (donated to the R Foundation
      by RStudio).  It is defined in .svg format, so will resize
      without unnecessary degradation when displayed on HTML
      pages-there is also a vector PDF version.  Thanks to Dirk
      Eddelbuettel for producing the corresponding X11 icon.

    • New function .traceback() returns the stack trace which
      traceback() prints.

    • lengths() dispatches internally.

    • dotchart() gains a pt.cex argument to control the size of points
      separately from the size of plot labels.  Thanks to Michael
      Friendly and Milan Bouchet-Valat for ideas and patches.

    • as.roman(ch) now correctly deals with more diverse character
      vectors ch; also arithmetic with the resulting roman numbers
      works in more cases.  (PR#16779)

    • prcomp() gains a new option rank. allowing to directly aim for
      less than min(n,p) PC's.  The summary() and its print() method
      have been amended, notably for this case.

    • gzcon() gains a new option text, which marks the connection as
      text-oriented (so e.g. pushBack() works).  It is still always
      opened in binary mode.

    • The import() namespace directive now accepts an argument except
      which names symbols to exclude from the imports. The except
      expression should evaluate to a character vector (after
      substituting symbols for strings). See Writing R Extensions.

    • New convenience function Rcmd() in package tools for invoking R
      CMD tools from within R.

    • New functions makevars_user() and makevars_site() in package
      tools to determine the location of the user and site specific
      Makevars files for customizing package compilation.

  UTILITIES:

    • R CMD check has a new option --ignore-vignettes for use with
      non-Sweave vignettes whose VignetteBuilder package is not
      available.

    • R CMD check now by default checks code usage (_via_ codetools)
      with only the base package attached.  Functions from default
      packages other than base which are used in the package code but
      not imported are reported as undefined globals, with a suggested
      addition to the NAMESPACE file.

    • R CMD check --as-cran now also checks DOIs in package CITATION
      and Rd files.

    • R CMD Rdconv and R CMD Rd2pdf each have a new option
      --RdMacros=pkglist which allows Rd macros to be specified before
      processing.

  DEPRECATED AND DEFUNCT:

    • The previously included versions of zlib, bzip2, xz and PCRE have
      been removed, so suitable external (usually system) versions are
      required (see the ‘R Installation and Administration’ manual).

    • The unexported and undocumented Windows-only devices cairo_bmp(),
      cairo_png() and cairo_tiff() have been removed.  (These devices
      should be used as e.g. bmp(type = "cairo").)

    • (Windows only) Function setInternet2() has no effect and will be
      removed in due course.  The choice between methods "internal" and
      "wininet" is now made by the method arguments of url() and
      download.file() and their defaults can be set _via_ options.  The
      out-of-the-box default remains "wininet" (as it has been since R
      3.2.2).

    • [<- with an S4 value into a list currently embeds the S4 object
      into its own list such that the end result is roughly equivalent
      to using [[<-.  That behavior is deprecated.  In the future, the
      S4 value will be coerced to a list with as.list().

    • Package tools' functions package.dependencies(), pkgDepends(),
      etc are deprecated now, mostly in favor of package_dependencies()
      which is both more flexible and efficient.

  INSTALLATION and INCLUDED SOFTWARE:

    • Support for very old versions of valgrind (e.g., 3.3.0) has been
      removed.

    • The included libtool script (generated by configure) has been
      updated to version 2.4.6 (from 2.2.6a).

    • libcurl version 7.28.0 or later with support for the https
      protocol is required for installation (except on Windows).

    • BSD networking is now required (except on Windows) and so
      capabilities("http/ftp") is always true.

    • configure uses pkg-config for PNG, TIFF and JPEG where this is
      available.  This should work better with multiple installs and
      with those using static libraries.

    • The minimum supported version of OS X is 10.6 (‘Snow Leopard’):
      even that has been unsupported by Apple since 2012.

    • The configure default on OS X is --disable-R-framework: enable
      this if you intend to install under /Library/Frameworks and use
      with R.app.

    • The minimum preferred version of PCRE has since R 3.0.0 been 8.32
      (released in Nov 2012).  Versions 8.10 to 8.31 are now deprecated
      (with warnings from configure), but will still be accepted until
      R 3.4.0.

    • configure looks for C functions __cospi, __sinpi and __tanpi and
      uses these if cospi _etc_ are not found.  (OS X is the main
      instance.)

    • (Windows) R is now built using gcc 4.9.3.  This build will
      require recompilation of at least those packages that include C++
      code, and possibly others.  A build of R-devel using the older
      toolchain will be temporarily available for comparison purposes.

      During the transition, the environment variable R_COMPILED_BY has
      been defined to indicate which toolchain was used to compile R
      (and hence, which should be used to compile code in packages).
      The COMPILED_BY variable described below will be a permanent
      replacement for this.

    • (Windows) A make and R CMD config variable named COMPILED_BY has
      been added.  This indicates which toolchain was used to compile R
      (and hence, which should be used to compile code in packages).

  PACKAGE INSTALLATION:

    • The make macro AWK which used to be made available to files such
      as src/Makefile is no longer set.

  C-LEVEL FACILITIES:

    • The API call logspace_sum introduced in R 3.2.0 is now remapped
      as an entry point to Rf_logspace_sum, and its first argument has
      gained a const qualifier.  (PR#16470)

      Code using it will need to be reinstalled.

      Similarly, entry point log1pexp also defined in Rmath.h is
      remapped there to Rf_log1pexp

    • R_GE_version has been increased to 11.

    • New API call R_orderVector1, a faster one-argument version of
      R_orderVector.

    • When R headers such as R.h and Rmath.h are called from C++ code
      in packages they include the C++ versions of system headers such
      as <cmath> rather than the legacy headers such as <math.h>.
      (Headers Rinternals.h and Rinterface.h already did, and inclusion
      of system headers can still be circumvented by defining
      NO_C_HEADERS, including as from this version for those two
      headers.)

      The manual has long said that R headers should *not* be included
      within an extern "C" block, and almost all the packages affected
      by this change were doing so.

    • Including header S.h from C++ code would fail on some platforms,
      and so gives a compilation error on all.

    • The deprecated header Rdefines.h is now compatible with defining
      R_NO_REMAP.

    • The connections interface now includes a function
      R_GetConnection() which allows packages implementing connections
      to convert R connection objects to Rconnection handles. Code
      which previously used the low-level R-internal getConnection()
      entry point should switch.

  BUG FIXES:

    • C-level asChar(x) is fixed for when x is not a vector, and it
      returns "TRUE"/"FALSE" instead of "T"/"F" for logical vectors.

    • The first arguments of .colSums() etc (with an initial dot) are
      now named x rather than X (matching colSums()): thus error
      messages are corrected.

    • A coef() method for class "maov" has been added to allow vcov()
      to work with multivariate results. (PR#16380)

    • method = "libcurl" connections signal errors rather than
      retrieving HTTP error pages (where the ISP reports the error).

    • xpdrows.data.frame() was not checking for unique row names; in
      particular, this affected assignment to non-existing rows _via_
      numerical indexing. (PR#16570)

    • tail.matrix() did not work for zero rows matrices, and could
      produce row “labels” such as "[1e+05,]".

    • Data frames with a column named "stringsAsFactors" now format and
      print correctly.  (PR#16580)

    • cor() is now guaranteed to return a value with absolute value
      less than or equal to 1. (PR#16638)

    • Array subsetting now keeps names(dim(.)).

    • Blocking socket connection selection recovers more gracefully on
      signal interrupts.

    • The data.frame method of rbind() construction row.names works
      better in borderline integer cases, but may change the names
      assigned.  (PR#16666)

    • (X11 only) getGraphicsEvent() miscoded buttons and missed mouse
      motion events.  (PR#16700)

    • methods(round) now also lists round.POSIXt.

    • tar() now works with the default files = NULL.  (PR#16716)

    • Jumps to outer contexts, for example in error recovery, now make
      intermediate jumps to contexts where on.exit() actions are
      established instead of trying to run all on.exit() actions before
      jumping to the final target. This unwinds the stack gradually,
      releases resources held on the stack, and significantly reduces
      the chance of a segfault when running out of C stack space. Error
      handlers established using withCallingHandlers() and
      options("error") specifications are ignored when handling a C
      stack overflow error as attempting one of these would trigger a
      cascade of C stack overflow errors.  (These changes resolve
      PR#16753.)

    • The spacing could be wrong when printing a complex array.
      (Report and patch by Lukas Stadler.)

    • pretty(d, n, min.n, *) for date-time objects d works again in
      border cases with large min.n, returns a labels attribute also
      for small-range dates and in such cases its returned length is
      closer to the desired n.  (PR#16761) Additionally, it finally
      does cover the range of d, as it always claimed.

    • tsp(x) <- NULL did not handle correctly objects inheriting from
      both "ts" and "mts".  (PR#16769)

    • install.packages() could give false errors when
      options("pkgType") was "binary".  (Reported by Jose Claudio
      Faria.)

    • A bug fix in R 3.0.2 fixed problems with locator() in X11, but
      introduced problems in Windows.  Now both should be fixed.
      (PR#15700)

    • download.file() with method = "wininet" incorrectly warned of
      download file length difference when reported length was unknown.
      (PR#16805)

    • diag(NULL, 1) crashed because of missed type checking.
      (PR#16853)

CHANGES IN R 3.2.5:

  BUG FIXES:

    • format.POSIXlt() behaved incorrectly in R 3.2.4.  E.g. the output
      of format(as.POSIXlt(paste0(1940:2000, "-01-01"), tz = "CET"),
      usetz = TRUE) ended in two "CEST" time formats.

CHANGES IN R 3.2.4:

  NEW FEATURES:

    • install.packages() and related functions now give a more
      informative warning when an attempt is made to install a base
      package.

    • summary(x) now prints with less rounding when x contains infinite
      values. (Request of PR#16620.)

    • provideDimnames() gets an optional unique argument.

    • shQuote() gains type = "cmd2" for quoting in cmd.exe in Windows.
      (Response to PR#16636.)

    • The data.frame method of rbind() gains an optional argument
      stringsAsFactors (instead of only depending on
      getOption("stringsAsFactors")).

    • smooth(x, *) now also works for long vectors.

    • tools::texi2dvi() has a workaround for problems with the texi2dvi
      script supplied by texinfo 6.1.

      It extracts more error messages from the LaTeX logs when in
      emulation mode.

  UTILITIES:

    • R CMD check will leave a log file build_vignettes.log from the
      re-building of vignettes in the .Rcheck directory if there is a
      problem, and always if environment variable
      _R_CHECK_ALWAYS_LOG_VIGNETTE_OUTPUT_ is set to a true value.

  DEPRECATED AND DEFUNCT:

    • Use of SUPPORT_OPENMP from header Rconfig.h is deprecated in
      favour of the standard OpenMP define _OPENMP.

      (This has been the recommendation in the manual for a while now.)

    • The make macro AWK which is long unused by R itself but recorded
      in file etc/Makeconf is deprecated and will be removed in R
      3.3.0.

    • The C header file S.h is no longer documented: its use should be
      replaced by R.h.

  BUG FIXES:

    • kmeans(x, centers = <1-row>) now works. (PR#16623)

    • Vectorize() now checks for clashes in argument names.  (PR#16577)

    • file.copy(overwrite = FALSE) would signal a successful copy when
      none had taken place.  (PR#16576)

    • ngettext() now uses the same default domain as gettext().
      (PR#14605)

    • array(.., dimnames = *) now warns about non-list dimnames and,
      from R 3.3.0, will signal the same error for invalid dimnames as
      matrix() has always done.

    • addmargins() now adds dimnames for the extended margins in all
      cases, as always documented.

    • heatmap() evaluated its add.expr argument in the wrong
      environment.  (PR#16583)

    • require() etc now give the correct entry of lib.loc in the
      warning about an old version of a package masking a newer
      required one.

    • The internal deparser did not add parentheses when necessary,
      e.g. before [] or [[]].  (Reported by Lukas Stadler; additional
      fixes included as well).

    • as.data.frame.vector(*, row.names=*) no longer produces
      ‘corrupted’ data frames from row names of incorrect length, but
      rather warns about them.  This will become an error.

    • url connections with method = "libcurl" are destroyed properly.
      (PR#16681)

    • withCallingHandler() now (again) handles warnings even during S4
      generic's argument evaluation.  (PR#16111)

    • deparse(..., control = "quoteExpressions") incorrectly quoted
      empty expressions.  (PR#16686)

    • format()ting datetime objects ("POSIX[cl]?t") could segfault or
      recycle wrongly.  (PR#16685)

    • plot.ts(<matrix>, las = 1) now does use las.

    • saveRDS(*, compress = "gzip") now works as documented.
      (PR#16653)

    • (Windows only) The Rgui front end did not always initialize the
      console properly, and could cause R to crash.  (PR#16698)

    • dummy.coef.lm() now works in more cases, thanks to a proposal by
      Werner Stahel (PR#16665).  In addition, it now works for
      multivariate linear models ("mlm", manova) thanks to a proposal
      by Daniel Wollschlaeger.

    • The as.hclust() method for "dendrogram"s failed often when there
      were ties in the heights.

    • reorder() and midcache.dendrogram() now are non-recursive and
      hence applicable to somewhat deeply nested dendrograms, thanks to
      a proposal by Suharto Anggono in PR#16424.

    • cor.test() now calculates very small p values more accurately
      (affecting the result only in extreme not statistically relevant
      cases).  (PR#16704)

    • smooth(*, do.ends=TRUE) did not always work correctly in R
      versions between 3.0.0 and 3.2.3.

    • pretty(D) for date-time objects D now also works well if range(D)
      is (much) smaller than a second.  In the case of only one unique
      value in D, the pretty range now is more symmetric around that
      value than previously.

      Similarly, pretty(dt) no longer returns a length 5 vector with
      duplicated entries for Date objects dt which span only a few
      days.

    • The figures in help pages such as ?points were accidentally
      damaged, and did not appear in R 3.2.3.  (PR#16708)

    • available.packages() sometimes deleted the wrong file when
      cleaning up temporary files.  (PR#16712)

    • The X11() device sometimes froze on Red Hat Enterprise Linux 6.
      It now waits for MapNotify events instead of Expose events,
      thanks to Siteshwar Vashisht. (PR#16497)

    • [dpqr]nbinom(*, size=Inf, mu=.) now works as limit case, for
      ‘dpq’ as the Poisson.  (PR#16727)
      pnbinom() no longer loops infinitely in border cases.

    • approxfun(*, method="constant") and hence ecdf() which calls the
      former now correctly “predict” NaN values as NaN.

    • summary.data.frame() now displays NAs in Date columns in all
      cases.  (PR#16709)

CHANGES IN R 3.2.3:

  NEW FEATURES:

    • Some recently-added Windows time zone names have been added to
      the conversion table used to convert these to Olson names.
      (Including those relating to changes for Russia in Oct 2014, as
      in PR#16503.)

    • (Windows) Compatibility information has been added to the
      manifests for Rgui.exe, Rterm.exe and Rscript.exe.  This should
      allow win.version() and Sys.info() to report the actual Windows
      version up to Windows 10.

    • Windows "wininet" FTP first tries EPSV / PASV mode rather than
      only using active mode (reported by Dan Tenenbaum).

    • which.min(x) and which.max(x) may be much faster for logical and
      integer x and now also work for long vectors.

    • The ‘emulation’ part of tools::texi2dvi() has been somewhat
      enhanced, including supporting quiet = TRUE.  It can be selected
      by texi2dvi = "emulation".

      (Windows) MiKTeX removed its texi2dvi.exe command in Sept 2015:
      tools::texi2dvi() tries texify.exe if it is not found.

    • (Windows only) Shortcuts for printing and saving have been added
      to menus in Rgui.exe.  (Request of PR#16572.)

    • loess(..., iterTrace=TRUE) now provides diagnostics for
      robustness iterations, and the print() method for
      summary(<loess>) shows slightly more.

    • The included version of PCRE has been updated to 8.38, a bug-fix
      release.

    • View() now displays nested data frames in a more friendly way.
      (Request with patch in PR#15915.)

  INSTALLATION and INCLUDED SOFTWARE:

    • The included configuration code for libintl has been updated to
      that from gettext version 0.19.5.1 - this should only affect how
      an external library is detected (and the only known instance is
      under OpenBSD).  (Wish of PR#16464.)

    • configure has a new argument --disable-java to disable the checks
      for Java.

    • The configure default for MAIN_LDFLAGS has been changed for the
      FreeBSD, NetBSD and Hurd OSes to one more likely to work with
      compilers other than gcc (FreeBSD 10 defaults to clang).

    • configure now supports the OpenMP flags -fopenmp=libomp (clang)
      and -qopenmp (Intel C).

    • Various macros can be set to override the default behaviour of
      configure when detecting OpenMP: see file config.site.

    • Source installation on Windows has been modified to allow for
      MiKTeX installations without texi2dvi.exe.  See file
      MkRules.dist.

  BUG FIXES:

    • regexpr(pat, x, perl = TRUE) with Python-style named capture did
      not work correctly when x contained NA strings.  (PR#16484)

    • The description of dataset ToothGrowth has been
      improved/corrected.  (PR#15953)

    • model.tables(type = "means") and hence TukeyHSD() now support
      "aov" fits without an intercept term.  (PR#16437)

    • close() now reports the status of a pipe() connection opened with
      an explicit open argument.  (PR#16481)

    • Coercing a list without names to a data frame is faster if the
      elements are very long. (PR#16467)

    • (Unix-only) Under some rare circumstances piping the output from
      Rscript or R -f could result in attempting to close the input
      file twice, possibly crashing the process.  (PR#16500)

    • (Windows) Sys.info() was out of step with win.version() and did
      not report Windows 8.

    • topenv(baseenv()) returns baseenv() again as in R 3.1.0 and
      earlier.  This also fixes compilerJIT(3) when used in .Rprofile.

    • detach()ing the methods package keeps .isMethodsDispatchOn()
      true, as long as the methods namespace is not unloaded.

    • Removed some spurious warnings from configure about the
      preprocessor not finding header files.  (PR#15989)

    • rchisq(*, df=0, ncp=0) now returns 0 instead of NaN, and
      dchisq(*, df=0, ncp=*) also no longer returns NaN in limit cases
      (where the limit is unique).  (PR#16521)

    • pchisq(*, df=0, ncp > 0, log.p=TRUE) no longer underflows (for
      ncp > ~60).

    • nchar(x, "w") returned -1 for characters it did not know about
      (e.g. zero-width spaces): it now assumes 1.  It now knows about
      most zero-width characters and a few more double-width
      characters.

    • Help for which.min() is now more precise about behavior with
      logical arguments.  (PR#16532)

    • The print width of character strings marked as "latin1" or
      "bytes" was in some cases computed incorrectly.

    • abbreviate() did not give names to the return value if minlength
      was zero, unlike when it was positive.

    • (Windows only) dir.create() did not always warn when it failed to
      create a directory.  (PR#16537)

    • When operating in a non-UTF-8 multibyte locale (e.g. an East
      Asian locale on Windows), grep() and related functions did not
      handle UTF-8 strings properly.  (PR#16264)

    • read.dcf() sometimes misread lines longer than 8191 characters.
      (Reported by Hervé Pagès with a patch.)

    • within(df, ..) no longer drops columns whose name start with a
      ".".

    • The built-in HTTP server converted entire Content-Type to
      lowercase including parameters which can cause issues for
      multi-part form boundaries (PR#16541).

    • Modifying slots of S4 objects could fail when the methods package
      was not attached. (PR#16545)

    • splineDesign(*, outer.ok=TRUE) (splines) is better now
      (PR#16549), and interpSpline() now allows sparse=TRUE for speedup
      with non-small sizes.

    • If the expression in the traceback was too long, traceback() did
      not report the source line number.  (Patch by Kirill Müller.)

    • The browser did not truncate the display of the function when
      exiting with options("deparse.max.lines") set.  (PR#16581)

    • When bs(*, Boundary.knots=) had boundary knots inside the data
      range, extrapolation was somewhat off.  (Patch by Trevor Hastie.)

    • var() and hence sd() warn about factor arguments which are
      deprecated now. (PR#16564)

    • loess(*, weights = *) stored wrong weights and hence gave
      slightly wrong predictions for newdata.  (PR#16587)

    • aperm(a, *) now preserves names(dim(a)).

    • poly(x, ..) now works when either raw=TRUE or coef is specified.
      (PR#16597)

    • data(package=*) is more careful in determining the path.

    • prettyNum(*, decimal.mark, big.mark): fixed bug introduced when
      fixing PR#16411.

CHANGES IN R 3.2.2:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • It is now easier to use secure downloads from https:// URLs on
      builds which support them: no longer do non-default options need
      to be selected to do so.  In particular, packages can be
      installed from repositories which offer https:// URLs, and those
      listed by setRepositories() now do so (for some of their
      mirrors).

      Support for https:// URLs is available on Windows, and on other
      platforms if support for libcurl was compiled in and if that
      supports the https protocol (system installations can be expected
      to do).  So https:// support can be expected except on rather old
      OSes (an example being OS X ‘Snow Leopard’, where a non-system
      version of libcurl can be used).

      (Windows only) The default method for accessing URLs _via_
      download.file() and url() has been changed to be "wininet" using
      Windows API calls.  This changes the way proxies need to be set
      and security settings made: there have been some reports of ftp:
      sites being inaccessible under the new default method (but the
      previous methods remain available).

  NEW FEATURES:

    • cmdscale() gets new option list. for increased flexibility when a
      list should be returned.

    • configure now supports texinfo version 6.0, which (unlike the
      change from 4.x to 5.0) is a minor update.  (Wish of PR#16456.)

    • (Non-Windows only) download.file() with default method = "auto"
      now chooses "libcurl" if that is available and a https:// or
      ftps:// URL is used.

    • (Windows only) setInternet2(TRUE) is now the default.  The
      command-line option --internet2 and environment variable
      R_WIN_INTERNET2 are now ignored.

      Thus by default the "internal" method for download.file() and
      url() uses the "wininet" method: to revert to the previous
      default use setInternet2(FALSE).

      This means that https:// URLs can be read by default by
      download.file() (they have been readable by file() and url()
      since R 3.2.0).

      There are implications for how proxies need to be set (see
      ?download.file).

    • chooseCRANmirror() and chooseBioCmirror() now offer HTTPS mirrors
      in preference to HTTP mirrors.  This changes the interpretation
      of their ind arguments: see their help pages.

    • capture.output() gets optional arguments type and split to pass
      to sink(), and hence can be used to capture messages.

  C-LEVEL FACILITIES:

    • Header Rconfig.h now defines HAVE_ALLOCA_H if the platform has
      the alloca.h header (it is needed to define alloca on Solaris and
      AIX, at least: see ‘Writing R Extensions’ for how to use it).

  INSTALLATION and INCLUDED SOFTWARE:

    • The libtool script generated by configure has been modified to
      support FreeBSD >= 10 (PR#16410).

  BUG FIXES:

    • The HTML help page links to demo code failed due to a change in R
      3.2.0.  (PR#16432)

    • If the na.action argument was used in model.frame(), the original
      data could be modified. (PR#16436)

    • getGraphicsEvent() could cause a crash if a graphics window was
      closed while it was in use. (PR#16438)

    • matrix(x, nr, nc, byrow = TRUE) failed if x was an object of type
      "expression".

    • strptime() could overflow the allocated storage on the C stack
      when the timezone had a non-standard format much longer than the
      standard formats. (Part of PR#16328.)

    • options(OutDec = s) now signals a warning (which will become an
      error in the future) when s is not a string with exactly one
      character, as that has been a documented requirement.

    • prettyNum() gains a new option input.d.mark which together with
      other changes, e.g., the default for decimal.mark, fixes some
      format()ting variants with non-default getOption("OutDec") such
      as in PR#16411.

    • download.packages() failed for type equal to either "both" or
      "binary".  (Reported by Dan Tenenbaum.)

    • The dendrogram method of labels() is much more efficient for
      large dendrograms, now using rapply().  (Comment #15 of PR#15215)

    • The "port" algorithm of nls() could give spurious errors.
      (Reported by Radford Neal.)

    • Reference classes that inherited from reference classes in
      another package could invalidate methods of the inherited class.
      Fixing this requires adding the ability for methods to be
      “external”, with the object supplied explicitly as the first
      argument, named .self. See "Inter-Package Superclasses" in the
      documentation.

    • readBin() could fail on the SPARC architecture due to alignment
      issues.  (Reported by Radford Neal.)

    • qt(*, df=Inf, ncp=.) now uses the natural qnorm() limit instead
      of returning NaN. (PR#16475)

    • Auto-printing of S3 and S4 values now searches for print() in the
      base namespace and show() in the methods namespace instead of
      searching the global environment.

    • polym() gains a coefs = NULL argument and returns class "poly"
      just like poly() which gets a new simple=FALSE option.  They now
      lead to correct predict()ions, e.g., on subsets of the original
      data.  (PR#16239)

    • rhyper(nn, <large>) now works correctly. (PR#16489)

    • ttkimage() did not (and could not) work so was removed. Ditto for
      tkimage.cget() and tkimage.configure(). Added two Ttk widgets and
      missing subcommands for Tk's image command: ttkscale(),
      ttkspinbox(), tkimage.delete(), tkimage.height(),
      tkimage.inuse(), tkimage.type(), tkimage.types(),
      tkimage.width(). (PR#15372, PR#16450)

    • getClass("foo") now also returns a class definition when it is
      found in the cache more than once.

CHANGES IN R 3.2.1:

  NEW FEATURES:

    • utf8ToInt() now checks that its input is valid UTF-8 and returns
      NA if it is not.

    • install.packages() now allows type = "both" with repos = NULL if
      it can infer the type of file.

    • nchar(x, *) and nzchar(x) gain a new argument keepNA which
      governs how the result for NAs in x is determined.  For nzchar()
      in general and nchar() in the R 3.2.x series, the default remains
      FALSE which is fully back compatible.  From R 3.3.0, nchar()'s
      default will change to keepNA = NA and you are advised to
      consider this for code portability.

    • news() more flexibly extracts dates from package NEWS.Rd files.

    • lengths(x) now also works (trivially) for atomic x and hence can
      be used more generally as an efficient replacement of sapply(x,
      length) and similar.

    • The included version of PCRE has been updated to 8.37, a bug-fix
      release.

    • diag() no longer duplicates a matrix when extracting its
      diagonal.

    • as.character.srcref() gains an argument to allow characters
      corresponding to a range of source references to be extracted.

  BUG FIXES:

    • acf() and ccf() now guarantee values strictly in [-1,1] (instead
      of sometimes very slightly outside). PR#15832.

    • as.integer("111111111111") now gives NA (with a warning) as it
      does for the corresponding numeric or negative number coercions.
      Further, as.integer(M + 0.1) now gives M (instead of NA) when M
      is the maximal representable integer.

    • On some platforms nchar(x, "c") and nchar(x, "w") would return
      values (possibly NA) for inputs which were declared to be UTF-8
      but were not, or for invalid strings without a marked encoding in
      a multi-byte locale, rather than give an error.  Additional
      checks have been added to mitigate this.

    • apply(a, M, function(u) c(X = ., Y = .)) again has dimnames
      containing "X" and "Y" (as in R < 3.2.0).

    • (Windows only) In some cases, the --clean option to R CMD INSTALL
      could fail.  (PR#16178)

    • (Windows only) choose.files() would occasionally include
      characters from the result of an earlier call in the result of a
      later one.  (PR#16270)

    • A change in RSiteSearch() in R 3.2.0 caused it to submit invalid
      URLs.  (PR#16329)

    • Rscript and command line R silently ignored incomplete statements
      at the end of a script; now they are reported as parse errors.
      (PR#16350)

    • Parse data for very long strings was not stored.  (PR#16354)

    • plotNode(), the workhorse of the plot method for "dendrogram"s is
      no longer recursive, thanks to Suharto Anggono, and hence also
      works for deeply nested dendrograms.  (PR#15215)

    • The parser could overflow internally when given numbers in
      scientific format with extremely large exponents.  (PR#16358)

    • If the CRAN mirror was not set, install.packages(type = "both")
      and related functions could repeatedly query the user for it.
      (Part of PR#16362)

    • The low-level functions .rowSums() etc. did not check the length
      of their argument, so could segfault. (PR#16367)

    • The quietly argument of library() is now correctly propagated
      from .getRequiredPackages2().

    • Under some circumstances using the internal PCRE when building R
      from source would cause external libs such as -llzma to be
      omitted from the main link.

    • The .Primitive default methods of the logic operators, i.e., !, &
      and |, now give correct error messages when appropriate, e.g.,
      for `&`(TRUE) or `!`().  (PR#16385)

    • cummax(x) now correctly propagates NAs also when x is of type
      integer and begins with an NA.

    • summaryRprof() could fail when the profile contained only two
      records.  (PR#16395)

    • HTML vignettes opened using vignette() did not support links into
      the rest of the HTML help system.  (Links worked properly when
      the vignette was opened using browseVignettes() or from within
      the help system.)

    • arima(*, xreg = .) (for d >= 1) computes estimated variances
      based on a the number of effective observations as in R version
      3.0.1 and earlier.  (PR#16278)

    • slotNames(.) is now correct for "signature" objects (mostly used
      internally in methods).

    • On some systems, the first string comparison after a locale
      change would result in NA.

CHANGES IN R 3.2.0:

  NEW FEATURES:

    • anyNA() gains a recursive argument.

    • When x is missing and names is not false (including the default
      value), Sys.getenv(x, names) returns an object of class "Dlist"
      and hence prints tidily.

    • (Windows.)  shell() no longer consults the environment variable
      SHELL: too many systems have been encountered where it was set
      incorrectly (usually to a path where software was compiled, not
      where it was installed).  R_SHELL, the preferred way to select a
      non-default shell, can be used instead.

    • Some unusual arguments to embedFonts() can now be specified as
      character vectors, and the defaults have been changed
      accordingly.

    • Functions in the Summary group duplicate less.  (PR#15798)

    • (Unix-alikes.) system(cmd, input = ) now uses
      ‘shell-execution-environment’ redirection, which will be more
      natural if cmd is not a single command (but requires a
      POSIX-compliant shell). (Wish of PR#15508)

    • read.fwf() and read.DIF() gain a fileEncoding argument, for
      convenience.

    • Graphics devices can add attributes to their description in
      .Device and .Devices.  Several of those included with R use a
      "filepath" attribute.

    • pmatch() uses hashing in more cases and so is faster at the
      expense of using more memory. (PR#15697)

    • pairs() gains new arguments to select sets of variables to be
      plotted against each other.

    • file.info(, extra_cols = FALSE) allows a minimal set of columns
      to be computed on Unix-alikes: on some systems without
      properly-configured caching this can be significantly faster with
      large file lists.

    • New function dir.exists() in package base to test efficiently
      whether one or more paths exist and are directories.

    • dput() and friends gain new controls hexNumeric and digits17
      which output double and complex quantities as, respectively,
      binary fractions (exactly, see sprintf("%a")) and as decimals
      with up to 17 significant digits.

    • save(), saveRDS() and serialize() now support ascii = NA which
      writes ASCII files using sprintf("%a") for double/complex
      quantities.  This is read-compatible with ascii = TRUE but avoids
      binary->decimal->binary conversions with potential loss of
      precision.  Unfortunately the Windows C runtime's lack of C99
      compliance means that the format cannot be read correctly there
      in R before 3.1.2.

    • The default for formatC(decimal.mark =) has been changed to be
      getOption("OutDec"); this makes it more consistent with format()
      and suitable for use in print methods, e.g. those for classes
      "density", "ecdf", "stepfun" and "summary.lm".

      getOption("OutDec") is now consulted by the print method for
      class "kmeans", by cut(), dendrogram(), plot.ts() and quantile()
      when constructing labels and for the report from legend(trace =
      TRUE).

      (In part, wish of PR#15819.)

    • printNum() and hence format() and formatC() give a warning if
      big.mark and decimal.mark are set to the same value (period and
      comma are not uncommonly used for each, and this is a check that
      conventions have not got mixed).

    • merge() can create a result which uses long vectors on 64-bit
      platforms.

    • dget() gains a new argument keep.source which defaults to FALSE
      for speed (dput() and dget() are most often used for data objects
      where this can make dget() many times faster).

    • Packages may now use a file of common macro definitions in their
      help files, and may import definitions from other packages.

    • A number of macros have been added in the new share/Rd directory
      for use in package overview help pages, and promptPackage() now
      makes use of them.

    • tools::parse_Rd() gains a new permissive argument which converts
      unrecognized macros into text.  This is used by
      utils:::format.bibentry to allow LaTeX markup to be ignored.

    • options(OutDec =) can now specify a multi-byte character, e.g.,
      options(OutDec = "\u00b7") in a UTF-8 locale.

    • is.recursive(x) is no longer true when x is an external pointer,
      a weak reference or byte code; the first enables all.equal(x, x)
      when x <- getClass(.).

    • ls() (aka objects()) and as.list.environment() gain a new
      argument sorted.

    • The "source" attribute (which has not been added to functions by
      R since before R version 2.14.0) is no longer treated as special.

    • Function returnValue() has been added to give on.exit() code
      access to a function's return value for debugging purposes.

    • crossprod(x, y) allows more matrix coercions when x or y are
      vectors, now equalling t(x) %*% y in these cases (also reported
      by Radford Neal).  Similarly, tcrossprod(x,y) and %*% work in
      more cases with vector arguments.

    • Utility function dynGet() useful for detecting cycles, aka
      infinite recursions.

    • The byte-code compiler and interpreter include new instructions
      that allow many scalar subsetting and assignment and scalar
      arithmetic operations to be handled more efficiently. This can
      result in significant performance improvements in scalar
      numerical code.

    • apply(m, 2, identity) is now the same as the matrix m when it has
      _named_ row names.

    • A new function debuggingState() has been added, allowing to
      temporarily turn off debugging.

    • example() gets a new optional argument run.donttest and
      tools::Rd2ex() a corresponding commentDonttest, with a default
      such that example(..) in help examples will run \donttest code
      only if used interactively (a change in behaviour).

    • rbind.data.frame() gains an optional argument make.row.names, for
      potential speedup.

    • New function extSoftVersion() to report on the versions of
      third-party software in use in this session.  Currently reports
      versions of zlib, bzlib, the liblzma from xz, PCRE, ICU, TRE and
      the iconv implementation.

      A similar function grSoftVersion() in package grDevices reports
      on third-party graphics software.

      Function tcltk::tclVersion() reports the Tcl/Tk version.

    • Calling callGeneric() without arguments now works with primitive
      generics to some extent.

    • vapply(x, FUN, FUN.VALUE) is more efficient notably for large
      length(FUN.VALUE); as extension of PR#16061.

    • as.table() now allows tables with one or more dimensions of
      length 0 (such as as.table(integer())).

    • names(x) <- NULL now clears the names of call and ... objects.

    • library() will report a warning when an insufficient dependency
      version is masking a sufficient one later on the library search
      path.

    • A new plot() method for class "raster" has been added.

    • New check_packages_in_dir_changes() function in package tools for
      conveniently analyzing how changing sources impacts the check
      results of their reverse dependencies.

    • Speed-up from Peter Haverty for ls() and
      methods:::.requirePackage() speeding up package loading.
      (PR#16133)

    • New get0() function, combining exists() and get() in one call,
      for efficiency.

    • match.call() gains an envir argument for specifying the
      environment from which to retrieve the ... in the call, if any;
      this environment was wrong (or at least undesirable) when the
      definition argument was a function.

    • topenv() has been made .Internal() for speedup, based on Peter
      Haverty's proposal in PR#16140.

    • getOption() no longer calls options() in the main case.

    • Optional use of libcurl (version 7.28.0 from Oct 2012 or later)
      for Internet access:

        • capabilities("libcurl") reports if this is available.

        • libcurlVersion() reports the version in use, and other
          details of the "libcurl" build including which URL schemes it
          supports.

        • curlGetHeaders() retrieves the headers for http://, https://,
          ftp:// and ftps:// URLs: analysis of these headers can
          provide insights into the `existence' of a URL (it might for
          example be permanently redirected) and is so used in R CMD
          check --as-cran.

        • download.file() has a new optional method "libcurl" which
          will handle more URL schemes, follow redirections, and allows
          simultaneous downloads of multiple URLs.

        • url() has a new method "libcurl" which handles more URL
          schemes and follows redirections.  The default method is
          controlled by a new option url.method, which applies also to
          the opening of URLs _via_ file() (which happens implicitly in
          functions such as read.table.)

        • When file() or url() is invoked with a https:// or ftps://
          URL which the current method cannot handle, it switches to a
          suitable method if one is available.

    • (Windows.) The DLLs internet.dll and internet2.dll have been
      merged.  In this version it is safe to switch (repeatedly)
      between the internal and Windows internet functions within an R
      session.

      The Windows internet functions are still selected by flag
      --internet2 or setInternet2().  This can be overridden for an
      url() connection _via_ its new method argument.

      download.file() has new method "wininet", selected as the default
      by --internet2 or setInternet2().

    • parent.env<- can no longer modify the parent of a locked
      namespace or namespace imports environment.  Contributed by Karl
      Millar.

    • New function isNamespaceLoaded() for readability and speed.

    • names(env) now returns all the object names of an environment
      env, equivalently to ls(env, all.names = TRUE, sorted = FALSE)
      and also to the names of the corresponding list,
      names(as.list(env, all.names = TRUE)).  Note that although
      names() returns a character vector, the names have no particular
      ordering.

    • The memory manager now grows the heap more aggressively. This
      reduces the number of garbage collections, in particular while
      data or code are loaded, at the expense of slightly increasing
      the memory footprint.

    • New function trimws() for removing leading/trailing whitespace.

    • cbind() and rbind() now consider S4 inheritance during S3
      dispatch and also obey deparse.level.

    • cbind() and rbind() will delegate recursively to methods::cbind2
      (methods::rbind2) when at least one argument is an S4 object and
      S3 dispatch fails (due to ambiguity).

    • (Windows.)  download.file(quiet = FALSE) now uses text rather
      than Windows progress bars in non-interactive use.

    • New function hsearch_db() in package utils for building and
      retrieving the help search database used by help.search(), along
      with functions for inspecting the concepts and keywords in the
      help search database.

    • New function .getNamespaceInfo(), a no-check version of
      getNamespaceInfo() mostly for internal speedups.

    • The help search system now takes \keyword entries in Rd files
      which are not standard keywords (as given in KEYWORDS in the R
      documentation directory) as concepts.  For standard keyword
      entries the corresponding descriptions are additionally taken as
      concepts.

    • New lengths() function for getting the lengths of all elements in
      a list.

    • New function toTitleCase() in package tools, tailored to package
      titles.

    • The matrix methods of cbind() and rbind() allow matrices as
      inputs which have 2^31 or more elements.  (For cbind(), wish of
      PR#16198.)

    • The default method of image() has an explicit check for a numeric
      or logical matrix (which was always required).

    • URLencode() will not by default encode further URLs which appear
      to be already encoded.

    • BIC(mod) and BIC(mod, mod2) now give non-NA numbers for arima()
      fitted models, as nobs(mod) now gives the number of “used”
      observations for such models.  This fixes PR#16198, quite
      differently than proposed there.

    • The print() methods for "htest", "pairwise.htest" and
      "power.htest" objects now have a digits argument defaulting to (a
      function of) getOption("digits"), and influencing all printed
      numbers coherently.  Unavoidably, this changes the display of
      such test results in some cases.

    • Code completion for namespaces now recognizes all loaded
      namespaces, rather than only the ones that are also attached.

    • The code completion mechanism can now be replaced by a
      user-specified completer function, for (temporary) situations
      where the usual code completion is inappropriate.

    • unzip() will now warn if it is able to detect truncation when
      unpacking a file of 4GB or more (related to PR#16243).

    • methods() reports S4 in addition to S3 methods; output is
      simplified when the class argument is used.  .S3methods() and
      methods::.S4methods() report S3 and S4 methods separately.

    • Higher order functions such as the apply functions and Reduce()
      now force arguments to the functions they apply in order to
      eliminate undesirable interactions between lazy evaluation and
      variable capture in closures.  This resolves PR#16093.

  INSTALLATION and INCLUDED SOFTWARE:

    • The \donttest sections of R's help files can be tested by
      make check TEST_DONTTEST=TRUE .

    • It is possible to request the use of system valgrind headers
      _via_ configure option --with-system-valgrind-headers: note the
      possible future incompatibility of such headers discussed in the
      'R Installation and Administration' manual. (Wish of PR#16068.)

    • The included version of liblzma has been updated to xz-utils
      5.0.7 (minor bug fixes from 5.0.5).

    • configure options --with-system-zlib, --with-system-bzlib and
      --with-system-pcre are now the default.  For the time being there
      is fallback to the versions included in the R sources if no
      system versions are found or (unlikely) if they are too old.

      Linux users should check that the -devel or -dev versions of
      packages zlib, bzip2/libbz2 and pcre as well as
      xz-devel/liblzma-dev (or similar names) are installed.

    • configure by default looks for the texi2any script from texinfo
      5.1 or later, rather than the makeinfo program.  (makeinfo is a
      link to the Perl script texi2any in texinfo 5.x.)

    • R CMD INSTALL gains an option --built-timestamp=STAMP allowing
      100% reproducible package building, thanks to Dirk Eddelbuettel.

  UTILITIES:

    • There is support for testing the \dontrun and \donttest parts of
      examples in packages.

      tools::testInstalledPackage() accepts new arguments
      commentDontrun = FALSE and commentDonttest = FALSE.

      R CMD check gains options --run-dontrun and --run-donttest.

    • The HTML generated by tools::Rd2HTML() and tools::toHTML()
      methods is now ‘XHTML 1.0 Strict’.

    • The compiler package's utility function setCompilerOptions() now
      returns the old values invisibly. The initial optimization level
      can also be set with the environment variable
      R_COMPILER_OPTIMIZE.

    • R CMD build adds a NeedsCompilation field if one is not already
      present in the DESCRIPTION file.

    • R CMD check gains option --test-dir to specify an alternative set
      of tests to run.

    • R CMD check will now by default continue with testing after many
      types of errors, and will output a summary count of errors at the
      end if any have occurred.

    • R CMD check now checks that the Title and Description fields are
      correctly terminated.

    • R CMD check --as-cran now:

        • checks a README.md file can be processed: this needs pandoc
          installed.

        • checks the existence and accessibility of URLs in the
          DESCRIPTION, CITATION, NEWS.Rd and README.md files and in the
          help files (provided the build has libcurl support).

        • reports non-ASCII characters in R source files when there is
          no package encoding declared in the DESCRIPTION file.

        • reports (apparent) S3 methods exported but not registered.

        • reports overwriting registered S3 methods from
          base/recommended packages.  (Such methods are replaced in the
          affected package for the rest of the session, even if the
          replacing namespace is unloaded.)

        • reports if the Title field does not appear to be in title
          case (see ‘Writing R Extensions’: there may be false
          positives, but note that technical words should be
          single-quoted and will then be accepted).

      Most of these checks can also be selected by environment
      variables: see the ‘R Internals’ manual.

  C-LEVEL FACILITIES:

    • New C API utility logspace_sum(logx[], n).

    • Entry points rbinom_mu, rnbinom_mu and rmultinom are remapped (by
      default) to Rf_rbinom_mu etc.  This requires packages using them
      to be re-installed.

    • .C(DUP = FALSE) and .Fortran(DUP = FALSE) are now ignored, so
      arguments are duplicated if DUP = TRUE would do so.  As their
      help has long said, .Call() is much preferred.

    • New entry point R_allocLD, like R_alloc but guaranteed to have
      sufficient alignment for long double pointers.

    • isPairList() now returns TRUE for DOTSXP.

  WINDOWS BUILD CHANGES:

  A number of changes to the Windows build system are in development.
  The following are currently in place.

    • Installation using external binary distributions of zlib, bzip2,
      liblzma, pcre, libpng, jpeglib and libtiff is now required, and
      the build instructions have been revised.

    • A new make target rsync-extsoft has been added to obtain copies
      of the external libraries from CRAN.

    • Building the manuals now requires texi2any from texinfo 5.1 or
      later.  CRAN binary builds include the manuals, but by default
      builds from source will not, and they will be accessed from CRAN.
      See the comments in src/gnuwin32/MkRules.dist for how to specify
      the location of texi2any.

    • (Windows) Changes have been made to support an experimental
      Windows toolchain based on GCC 4.9.2.  The default toolchain
      continues to be based on GCC 4.6.3, as the new toolchain is not
      yet stable enough.  A change to a new toolchain is expected
      during the R 3.2.x lifetime.

  PACKAGE INSTALLATION:

    • (Windows) The use of macro ZLIB_LIBS in file src/Makevars.win
      (which has not been documented for a long time) now requires an
      external libz.a to be available (it is part of the ‘goodies’ used
      to compile Windows binary packages).  It would be simpler to use
      -lz instead.

    • The default for option pkgType on platforms using binary packages
      is now "both", so source packages will be tried if binary
      versions are not available or not up to date.

      There are options for what install.packages(type = "both")
      (possibly called _via_ update.packages()) will do if compilation
      of a source package is desirable: see ?options (under utils).

      If you intend not to accept updates as source packages, you
      should use update.packages(type = "binary").

  DEPRECATED AND DEFUNCT:

    • download.file(method = "lynx") is defunct.

    • Building R using the included versions of zlib, bzip2, xz and
      PCRE is deprecated: these are frozen (bar essential bug-fixes)
      and will be removed for R 3.3.0.

    • The configure option --with-valgrind-instrumentation=3 has been
      withdrawn, as it did not work with recent valgrind headers: it is
      now treated as level 2.

    • The MethodsList class in package methods had been deprecated in R
      2.11.0 and is defunct now.  Functions using it are defunct if
      they had been deprecated in R 2.11.0, and are deprecated now,
      otherwise.

  BUG FIXES:

    • Fixed two obscure bugs in pairlist subassignment, reported by
      Radford Neal as part of pqR issue 16.

    • Fixes for bugs in handling empty arguments and argument matching
      by name in log().

    • all.equal() gains methods for environments and refClasses.

    • [<- and [[<- gain S4 data.frame methods to avoid corruption of S4
      class information by the S3 methods.

    • callNextMethod() should now work within a .local call when ... is
      absent from formals(.local).

    • dput(pairlist(x)) generates a call to the pairlist constructor
      instead of the list constructor.

    • Fix missing() when arguments are propagated through ... .
      (PR#15707)

    • eigen(m) now defaults to symmetric = TRUE even when the dimnames
      are asymmetric if the matrix is otherwise symmetric.  (PR#16151)

    • Fix issues with forwarding ... through callGeneric() and
      callNextMethod().  (PR#16141)

    • callGeneric() now works after a callNextMethod().

    • Subclass information is kept consistent when replacing an
      ordinary S4 class with an “old class” _via_ the S4Class argument
      to setOldClass(). Thus, for example, a data.frame is valid for a
      list argument in the signature, and a factor is valid for vector
      arguments.

    • In qbeta() the inversion of pbeta() is much more sophisticated.
      This works better in corner cases some of which failed completely
      previously (PR#15755), or were using too many iterations.

    • Auto-printing no longer duplicates objects when printing is
      dispatched to a method.

    • kmeans(x, k) would fail when nrow(x) >= 42949673.  (Comment 6 of
      PR#15364)

    • ‘Abbreviated’ locale-specific day and month names could have been
      truncated in those rare locales where there are the same as the
      full names.

    • An irrelevant warning message from updating subclass information
      was silenced (the namespace would not be writable in this case).

CHANGES IN R 3.1.3:

  NEW FEATURES:

    • The internal method of download.file() can now handle files
      larger than 2GB on 32-bit builds which support such files (tested
      on 32-bit R running on 64-bit Windows).

    • kruskal.test() warns on more types of suspicious input.

    • The as.dendrogram() method for "hclust" objects gains a check
      argument protecting against memory explosion for invalid inputs.

    • capabilities() has a new item long.double which indicates if the
      build uses a long double type which is longer than double.

    • nlm() no longer modifies the callback argument in place (a new
      vector is allocated for each invocation, which mimics the
      implicit duplication that occurred in R < 3.1.0); note that this
      is a change from the previously documented behavior. (PR#15958)

    • icuSetCollate() now accepts locale = "ASCII" which uses the basic
      C function strcmp and so collates strings byte-by-byte in
      numerical order.

    • sessionInfo() tries to report the OS version in use (not just
      that compiled under, and including details of Linux
      distributions).

    • model.frame() (used by lm() and many other modelling functions)
      now warns when it drops contrasts from factors.  (Wish of
      PR#16119)

    • install.packages() and friends now accept the value type =
      "binary" as a synonym for the native binary type on the platform
      (if it has one).

    • Single source or binary files can be supplied for
      install.packages(type = "both") and the appropriate type and
      repos = NULL will be inferred.

    • New function pcre_config() to report on some of the configuration
      options of the version of PCRE in use.  In particular, this
      reports if regular expressions using \p{xx} are supported.

    • (Windows.) download.file(cacheOK = FALSE) is now supported when
      internet2.dll is used.

    • browseURL() has been updated to work with Firefox 36.0 which has
      dropped support for the -remote interface.

  INSTALLATION and INCLUDED SOFTWARE:

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

    • configure accepts MAKEINFO=texi2any as another way to ensure
      texinfo 5.x is used when both 5.x and 4.x are installed.

  UTILITIES:

    • R CMD check now checks the packages used in \donttest sections of
      the examples are specified in the DESCRIPTION file.  (These are
      needed to run the examples interactively.)

    • R CMD check checks for the undeclared use of GNU extensions in
      Makefiles, and for Makefiles with a missing final linefeed.

      R CMD build will correct line endings in all Makefiles, not just
      those in the src directory.

    • R CMD check notes uses of library() and require() in package
      code: see the section ‘Suggested packages’ of ‘Writing R
      Extensions’ for good practice.

  DEPRECATED AND DEFUNCT:

    • The configure option --with-valgrind-instrumentation=3 is
      deprecated and will be removed in R 3.2.0.

  BUG FIXES:

    • (Windows.) Rscript.exe was missing a manifest specifying the
      modern style for common controls (e.g., the download progress
      bar).

    • If a package had extra documentation files but no vignette, the
      HTML help system produced an empty index page.

    • The parser now gives an error if a null character is included in
      a string using Unicode escapes. (PR#16046)

    • qr.Q() failed on complex arguments due to pre-3.0(!) typo.
      (PR#16054)

    • abs() failed with named arguments when the argument was complex.
      (PR#16047)

    • "noquote" objects may now be used as columns in data frames.
      (PR#15997)

    • Some values with extremely long names were printed incorrectly.
      (PR#15999)

    • Extremely large exponents on zero expressed in scientific
      notation (e.g. 0.0e50000) could give NaN.  (PR#15976)

    • download.file() reported downloaded sizes as 0KB if less than
      1MB, only for R 3.1.2 and only on big-endian platforms.

    • prompt() did not escape percent signs in the automatically
      generated usage section of help files.

    • drop.terms() dropped some of the attributes of the object it was
      working with.  (PR#16029)

    • (Windows.) The command completion in Rgui.exe messed up the
      console.  (PR#15791)

    • (Windows.) The choose.files() command returned a blank string
      when the user asked for a single file but cancelled the request.
      (PR#16074)

    • Math2 S4 group generics failed to correctly dispatch "structure"-
      and "nonStructure"-derived classes.

    • loadNamespace() imposed undocumented restrictions on the
      versionCheck parameter.  (Reported by Geoff Lee.)

    • Rare over-runs detected by AddressSanitizer in substr() and its
      replacement version have been avoided.

      _Inter alia_ that fix gives the documented behaviour for
      substr(x, 1, 2) <- "" (subsequently reported as PR#16214).

    • Loading packages incorrectly defining an S4 generic followed by a
      function of the same name caused an erroneous cyclic namespace
      dependency error.

    • Declared vignette encodings are now always passed to the vignette
      engine.

    • Port Tomas Kalibera's fix from R-devel that restores the
      loadMethod() fast path, effectively doubling the speed of S4
      dispatch.

    • power.t.test() and power.prop.test() now make use of the
      extendInt option of uniroot() and hence work in more extreme
      cases.  (PR#15792)

    • If a package was updated and attached when its namespace was
      already loaded, it could end up with parts from one version and
      parts from the other.  (PR#16120)

    • tools:::.Rdconv() didn't accept --encoding= due to a typo.
      (PR#16121)

    • Unix-alike builds without a suitable makeinfo were documented to
      link the missing HTML manuals to CRAN, but did not.

    • save(*, ascii=TRUE) and load() now correctly deal with NaN's.
      (PR#16137)

    • split.Date() retains fractional representations while avoiding
      incomplete class propagation.

    • R_ext/Lapack.h had not been updated for changes made by LAPACK to
      the argument lists of its (largely internal) functions dlaed2 and
      dlaed3.  (PR#16157)

    • RShowDoc("NEWS", "txt") had not been updated for the layout
      changes of R 3.1.0.

    • The xtfrm() method for class "Surv" has been corrected and its
      description expanded.

    • mode(x) <- y would incorrectly evaluate x before changing its
      mode. (PR#16215)

    • besselJ(1, 2^64) and besselY(..) now signal a warning, returning
      NaN instead of typically segfaulting. (Issue 3 of PR#15554)

    • HTML conversion of \href markup in .Rd files did not remove the
      backslash from \% and so gave an invalid URL.  In a related
      change, the \ escape is now required in such URLs.

CHANGES IN R 3.1.2:

  NEW FEATURES:

    • embedFonts() now defaults to format = "ps2write" for .ps and .eps
      files.  This is available in Ghostscript 9.x (since 2010) whereas
      the previous default, format = "pswrite", was removed in
      Ghostscript 9.10.

    • For consistency with [dpqr]norm(), [dp]lnorm(sdlog = 0) model a
      point mass at exp(mulog) rather than return NaN (for an error).

    • capabilities() now reports if ICU is compiled in for use for
      collation (it is only actually used if a suitable locale is set
      for collation, and never for a C locale).

    • (OS X only.) Package tcltk checks when loaded if it is linked
      against the CRAN X11-based Tcl/Tk and if so that the Tcl/Tk
      component and the X11 libraries are installed.  This allows more
      informative error messages to be given advising the installation
      of the missing component or of XQuartz.

      The X11() device and X11-based versions of the data editor and
      viewer (invoked by edit() and View() for data frames and matrices
      from command-line R) check that the X11 libraries are installed
      and if not advises installing XQuartz.

    • icuSetCollate() allows locale = "default", and locale = "none" to
      use OS services rather than ICU for collation.

      Environment variable R_ICU_LOCALE can be used to set the default
      ICU locale, in case the one derived from the OS locale is
      inappropriate (this is currently necessary on Windows).

    • New function icuGetCollate() to report on the ICU collation
      locale in use (if any).

    • utils::URLencode() was updated to use unreserved and reserved
      characters from RFC 3986 (<URL:
      http://tools.ietf.org/html/rfc3986>) instead of RFC 1738.

    • unique(warnings()) and c(warnings()) are now supported.

    • The Bioconductor ‘version’ used by setRepositories() now defaults
      to 3.0. (It can be set at runtime _via_ environment variable
      R_BIOC_VERSION.)

    • Omegahat is no longer listed as providing Windows binary
      packages, e.g. by setRepositories().  It has no binary packages
      available for R 3.1.x and those for earlier versions were 32-bit
      only.

  INSTALLATION and INCLUDED SOFTWARE:

    • The configure script reports on the more important
      capabilities/options which will not be compiled in.

      More types of external BLAS are recognized by name in that
      report.

    • When building R as a shared library, the -L${R_HOME}/lib${R_ARCH}
      flag is placed earlier in the link commands used during
      installation and when packages are installed: this helps ensure
      that the current build has priority if an R shared library has
      already been installed by e.g. install-libR in a library
      mentioned in LDFLAGS (and not in ‘your system's library
      directory’ as documented). (Wish of PR#15790.)

    • LaTeX package upquote is no longer required for R's use of
      inconsolata.

    • (Windows only) If both 32- and 64-bit versions of R are
      installed, the bin/R.exe and bin/Rscript.exe executables now run
      64-bit R.  (To run 32-bit R, overwrite these files with copies of
      bin/i386/Rfe.exe.)

  UTILITIES:

    • Running R CMD check with _R_CHECK_DEPENDS_ONLY_ true now makes
      the VignetteBuilder packages available even if they are listed in
      Suggests, since they are needed to recognise and process
      non-Sweave vignettes.

    • R CMD check now reports empty importFrom declarations in a
      NAMESPACE file, as these are common errors (writing
      importFrom(Pkg) where import(Pkg) was intended).

    • R CMD check now by default checks code usage directly on the
      package namespace without loading and attaching the package and
      its suggests and enhances.  For good practice with packages in
      the Suggests field, see §1.1.3.1 of ‘Writing R Extensions’.  For
      use of lazy-data objects in the package's own code, see ?data.

  BUG FIXES:

    • dmultinom() did not handle non-finite probabilities correctly.

    • prettyNum(x, zero.print=*) now also works when x contains NAs.

    • A longstanding bug exhibited by nlminb() on Windows was traced to
      a compiler bug in gcc 4.6.3; a workaround has been put in place.
      (PR#15244 and PR#15914).

    • Rendering of \command in HTML versions of help pages has been
      improved: this is particularly evident on the help page for
      INSTALL.

    • as.hexmode(x) and as.octmode(x) now behave correctly for some
      numeric x, e.g., c(NA, 1) or c(1, pi).

    • drop1() failed if the scope argument had no variables to drop.
      (PR#15935)

    • edit() (and hence fix()) failed if an object had a non-character
      attribute named "source" (an attribute that had been used in R
      prior to version 2.14.0).

    • callGeneric() could fail if the generic had ... as a formal
      argument. (PR#15937).

    • Forking in package parallel called C entry point exit in the
      child.  This was unsafe (_exit should have been called), and
      could flush stdin of the main R process (seen most often on
      Solaris).

      As good practice, stdout is now flushed before forking a child.

    • R objects such as list(`a\b` = 1) now print correctly.

    • getAnywhere("C_pbinom") now returns correctly a single object
      (rather than unlisting it).

    • The confint() method for nls() fits failed it these has specified
      parameter limits despite using an algorithm other than "port".
      (PR#15960)

    • Subclassing an S4 class failed if the class required arguments to
      the generator, through its initialize() method.

    • removeSource() did not properly handle expressions containing
      arguments that were supplied as missing, e.g.  x[i,]. (PR#15957)

    • as.environment(list()) now works, and as.list() of such an
      environment is now the same as list(). (PR#15926)

    • Several tcltk functions failed when run in unusual environments.
      (PR#15970)

    • options(list()) now works (trivially). (PR#15979)

    • merge(<dendrogram>, ..) now works correctly for two `independent'
      dendrograms (PR#15648), and still compatibly _via_ adjust =
      "auto" e.g. for two branches of an existing dendrogram.

    • The plot method for "hclust" objects gets an optional argument
      check; when that is true (the default) it checks more carefully
      for valid input.

    • (Windows only) If a user chose to install 64 bit R but not 32 bit
      R, the bin/R and bin/Rscript executables failed to run.
      (PR#15981)

    • Various possible buffer overruns have been prevented, and missed
      memory protection added. (PR#15990)

    • Rscript no longer passes --args to R when there are no extra
      (“user”) arguments.

    • objects like getClass("refClass")@prototype now print() and str()
      without error.

    • identical() now also looks at the S4 bit.

    • hist(x, breaks) is more robust in adding a small fuzz to few
      breaks when some are very large. (PR#15988)

    • sub() and gsub() did not handle regular expressions like "\s{2,}"
      properly if the text contained NA or non-ASCII elements in a
      UTF-8 locale.  Part of this was due to a bug in the TRE library.
      (PR#16009)

    • RShowDoc("NEWS") now displays the PDF version.

    • Matrices and arrays with last dimension zero did not print at all
      or incompletely.  (PR#16012)

    • plot.histogram() and hence hist() now respect the xaxs, yaxs and
      lab graphics parameters.  (PR#16021)

    • bw.SJ(x) and other bw.*() no longer segfault when x contains
      non-finite values. (PR#16024)

    • R CMD Rd2pdf unintentionally ignored its --os option.

    • The internal method of download.file() was not reporting file
      sizes and progress correctly on files larger than 2GB (inherited
      from libxml2).  This is corrected for 64-bit builds (32-bit
      platforms may not support such files, but where possible will be
      supported in future versions of R).

    • Work around a bug in OS X Yosemite where key environment
      variables may be duplicated causing issues in subprocesses. The
      duplicates are now removed on R startup (_via_ Rprofile).
      (PR#16042)

    • Adjust X11 auto-launch detection in DISPLAY on OS X to recognize
      latest XQuartz.

CHANGES IN R 3.1.1:

  NEW FEATURES:

    • When attach() reports conflicts, it does so compatibly with
      library() by using message().

    • R CMD Sweave no longer cleans any files by default, compatibly
      with versions of R prior to 3.1.0.  There are new options
      --clean, --clean=default and --clean=keepOuts.

    • tools::buildVignette() and tools::buildVignettes() with clean =
      FALSE no longer remove any created files.  buildvignette() gains
      a keep argument for more cleaning customization.

    • The Bioconductor ‘version’ used by setRepositories() can now be
      set by environment variable R_BIOC_VERSION at runtime, not just
      when R is installed.  (It has been stated that Bioconductor will
      switch from ‘version’ 2.14 to ‘version’ 3.0 during the lifetime
      of the R 3.1 series.)

    • Error messages from bugs in embedded Sexpr code in Sweave
      documents now report the source location.

    • type.convert(), read.table() and similar read.*() functions get a
      new numerals argument, specifying how numeric input is converted
      when its conversion to double precision loses accuracy.  The
      default value, "allow.loss" allows accuracy loss, as in R
      versions before 3.1.0.

    • For some compilers, integer addition could overflow without a
      warning.  R's internal code for both integer addition and
      subtraction is more robust now.  (PR#15774)

    • The function determining the default number of knots for
      smooth.spline() is now exported, as .nknots.smspl().

    • dbeta(, a,b), pbeta(), qbeta() and rbeta() are now defined also
      for a = 0, b = 0, or infinite a and b (where they typically
      returned NaN before).

    • Many package authors report that the RStudio graphics device does
      not work correctly with their package's use of dev.new().  The
      new option dev.new(noRStudioGD = TRUE) replaces the RStudio
      override by the default device as selected by R itself, still
      respecting environment variables R_INTERACTIVE_DEVICE and
      R_DEFAULT_DEVICE.

    • readRDS() now returns visibly.

    • Modifying internal logical scalar constants now results in an
      error instead of a warning.

    • install.packages(repos = NULL) now accepts http:// or ftp:// URLs
      of package archives as well as file paths, and will download as
      required.  In most cases repos = NULL can be deduced from the
      extension of the URL.

    • The warning when using partial matching with the $ operator on
      data frames is now only given when
      options("warnPartialMatchDollar") is TRUE.

    • Package help requests like package?foo now try the package foo
      whether loaded or not.

    • General help requests now default to trying all loaded packages,
      not just those on the search path.

    • Added a new function promptImport(), to generate a help page for
      a function that was imported from another package (and presumably
      re-exported, or help would not be needed).

  INSTALLATION and INCLUDED SOFTWARE:

    • configure option --with-internal-tzcode can now be used with
      variable rsharedir.

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

    • There is a new target make uninstall-libR to remove an installed
      shared/static libR.

      make install-libR now works if a sub-architecture is used,
      although the user will need to specify libdir differently for
      different sub-architectures.

    • There is more extensive advice on which LaTeX packages are
      required to install R or to make package manuals (as done by R
      CMD check) in the ‘Writing R Extensions’ manual.

    • Compilers/linkers were handling the visibility control in
      src/extra/xz inconsistently (and apparently in some cases
      incorrectly), so it has been simplified.  (PR#15327)

    • (Windows) There is updated support for the use of ICU for
      collation: see the ‘R Installation and Administration Manual’.

  BUG FIXES:

    • dbinom(x, n), pbinom(), dpois(), etc, are slightly less
      restrictive in checking if n is integer-valued.  (Wish of
      PR#15734.)

    • pchisq(x, df, ncp, log.p = TRUE) is more accurate and no longer
      underflows for small x and ncp < 80, e.g, for pchisq(1e-5, df =
      100, ncp = 1, log = TRUE).  (Based on PR#15635 and a suggestion
      by Roby Joehanes.)

    • The s (“step into”) command in the debugger would cause R to step
      into expressions evaluated there, not just into functions being
      debugged.  (PR#15770)

    • The C code used by strptime() rejected time-zone offsets of more
      than +1200 (+1245, +1300 and +1400 can occur).  (PR#15768)

    • (Windows only.)  png(type = "cairo", antialias = "gray") was not
      accepted.  (PR#15760)

    • Use of save(..., envir=) with named objects could fail.
      (PR#15758)

    • Sweave() mis-parsed Sexpr expressions that contained backslashes.
      (PR#15779)

    • The return value from options(foo = NULL) was not the previous
      value of the option.  (PR#15781)

    • enc2utf8() and enc2native() did not always mark the encoding of
      the return values when it was known.

    • dnbinom(x, size = <large>, mu, log = TRUE) no longer underflows
      to -Inf for large mu, thanks to a suggestion from Alessandro
      Mammana (MPI MolGen, Berlin).

    • pbeta(x, a, b, log = TRUE) no longer behaves discontinuously (in
      a small x-region) because of denormalized numbers.  Also,
      pbeta(1-1e-12, 1e30, 1.001, log=TRUE) now terminates “in real
      time”.

    • The "CRAN" filter (see available.packages()) no longer removes
      duplicates other than of packages on CRAN, and does not fail if
      there is no CRAN repository in getOption("repos").

    • The device listing from dev2bitmap() and bitmap() was truncated
      to 1000 characters: modern versions of GhostScript on most
      platforms have many more devices.

    • (Windows.)  Commands such as Sys.which() and pipe() which needed
      to find the full path to a command could segfault if the ‘long’
      path name was much longer than the ‘short’ path name (which
      Sys.which() returns), as the behaviour of the Windows API call
      had changed.

    • R CMD build will fail with an error if one of the packages
      specified in the VignetteBuilder field is not installed.
      (Without loading those packages it cannot be ascertained which
      files are intended to be vignettes. This means that the
      VignetteBuilder packages have to be installed for package
      checking too.)  (Wish of PR#15775.)

    • Misguided attempts to use chull() with non-finite points now give
      an error (related to PR#15777).

    • For a formula with exactly 32 variables the 32nd variable was
      aliased to the intercept in some C-level computations of terms,
      so that for example attempting to remove it would remove the
      intercept instead (and leave a corrupt internal structure).
      (PR#15735)

    • anyDuplicated() silently returned wrong values when the first
      duplicate was at an index which was too large to be stored in an
      integer vector (although a lot of RAM and patience would have
      been needed to encounter this).

    • tools::Rd2ex(commentDontrun = FALSE) failed if the block had only
      one line.

    • Hexadecimal constants such as 0x110p-5L which were incorrectly
      qualified by L were parsed incorrectly since R 3.0.0, with a
      slightly garbled warning. (PR#15753)

    • system() returned success on some platforms even if the system
      was unable to launch a process. (PR#15796)

    • (Windows Rgui console.)  Unbuffered output was sometimes not
      output immediately if the prompt was not on the last line of the
      console.

    • The built-in help server did not declare the encoding for the
      DESCRIPTION or other text files to be the package encoding, so
      non-ASCII characters could be displayed incorrectly.

    • R is now trying harder to not cleanup child processes that were
      not spawned by mcparallel() on platforms that provide information
      about the source process of the SIGCHLD signal. This allows 3rd
      party libraries to manage the exit status of children that they
      spawn without R interfering.

    • mcmapply() was only parallelizing if the number of jobs was
      bigger than the number of cores. It now parallelizes if the
      number of jobs is more than one.

    • Auto-printing would re-evaluate its argument when trying to
      dispatch to a print method.  This is now avoided when possible.

    • Unserializing (including load() and readRDS()) could silently
      return incorrect numeric values from ASCII saves if there was a
      read error.

    • getParseData() could return incorrect values for the parents of
      some elements. (Reported by Andrew Redd.)

    • Attempting to use data frames of 2^31 or more rows with merge()
      or to create a merged data frame of that size now gives a clearer
      error message.

    • parse() did not check its file argument was a connection if it
      was not a character string, so e.g. parse(FALSE) attempted to
      read from stdin.

      Nor did dump() and dput().

    • The "help.try.all.packages" option was ignored when the shortcut
      syntax for help was used, e.g. ?foo.

    • A potential segfault in string allocation has been fixed.  (Found
      by Radford Neal.)

    • Potential memory protection errors in sort() and D() have been
      fixed. (Found by Radford Neal.)

    • Fixed a lack of error checking in graphics event functions.
      (Found by Radford Neal; a different patch used here than the one
      in pqR.)

    • numericDeriv() sometimes miscalculated the gradient.  (PR#15849,
      reported originally by Radford Neal)

CHANGES IN R 3.1.0:

  NEW FEATURES:

    • type.convert() (and hence by default read.table()) returns a
      character vector or factor when representing a numeric input as a
      double would lose accuracy.  Similarly for complex inputs.

      If a file contains numeric data with unrepresentable numbers of
      decimal places that are intended to be read as numeric, specify
      colClasses in read.table() to be "numeric".

    • tools::Rdiff(useDiff = FALSE) is closer to the POSIX definition
      of diff -b (as distinct from the description in the man pages of
      most systems).

    • New function anyNA(), a version of any(is.na(.)) which is fast
      for atomic vectors, based on a proposal by Tim Hesterberg. (Wish
      of PR#15239.)

    • arrayInd(*, useNames = TRUE) and, analogously, which(*, arr.ind =
      TRUE) now make use of names(.dimnames) when available.

    • is.unsorted() now also works for raw vectors.

    • The "table" method for as.data.frame() (also useful as
      as.data.frame.table()) now passes sep and base arguments to
      provideDimnames().

    • uniroot() gets new optional arguments, notably extendInt,
      allowing to auto-extend the search interval when needed.  The
      return value has an extra component, init.it.

    • switch(f, ...) now warns when f is a factor, as this typically
      happens accidentally where the useR meant to pass a character
      string, but f is treated as integer (as always documented).

    • The parser has been modified to use less memory.

    • The way the unary operators (+ - !) handle attributes is now more
      consistent.  If there is no coercion, all attributes (including
      class) are copied from the input to the result: otherwise only
      names, dims and dimnames are.

    • colorRamp() and colorRampPalette() now allow non-opaque colours
      and a ramp in opacity _via_ the new argument alpha = TRUE.
      (Suggested by Alberto Krone-Martins, but optionally as there are
      existing uses which expect only RGB values.)

    • grid.show.layout() and grid.show.viewport() get an optional vp.ex
      argument.

    • There is a new function find_gs_cmd() in the tools package to
      locate a GhostScript executable.  (This is an enhanced version of
      a previously internal function there.)

    • object.size() gains a format() method.

    • There is a new family, "ArialMT", for the pdf() and postscript()
      devices.  This will only be rendered correctly on viewers which
      have access to Monotype TrueType fonts (which are sometimes
      requested by journals).

    • The text and PDF news files, including NEWS and NEWS.2, have been
      moved to the doc directory.

    • combn(x, simplify = TRUE) now gives a factor result for factor
      input x (previously user error).  (Related to PR#15442.)

    • Added utils::fileSnapshot() and utils::changedFiles() functions
      to allow snapshots and comparison of directories of files.

    • make.names(names, unique=TRUE) now tries to preserve existing
      names. (Suggestion of PR#15452.)

    • New functions cospi(x), sinpi(x), and tanpi(x), for more accurate
      computation of cos(pi*x), etc, both in R and the C API.  Using
      these gains accuracy in some cases, e.g., inside lgamma() or
      besselI().  (Suggested by Morten Welinder in PR#15529.)

    • print.table(x, zero.print = ".") now also has an effect when x is
      not integer-valued.

    • There is more support to explore the system's idea of time-zone
      names.  Sys.timezone() tries to give the current system setting
      by name (and succeeds at least on Linux, OS X, Solaris and
      Windows), and OlsonNames() lists the names in the system's Olson
      database. Sys.timezone(location = FALSE) gives the previous
      behaviour.

    • Platforms with a 64-bit time_t type are allowed to handle
      conversions between the "POSIXct" and "POSIXlt" classes for
      date-times outside the 32-bit range (before 1902 or after 2037):
      the existing workarounds are used on other platforms.  (Note that
      time-zone information for post-2037 is speculative at best, and
      the OS services are tested for known errors and so not used on OS
      X.)

      Currently time_t is usually long and hence 64-bit on Unix-alike
      64-bit platforms: however in several cases the time-zone database
      is 32-bit.  For R for Windows it is 64-bit (for both
      architectures as from this version).

    • The "save.defaults" option can include a value for
      compression_level.  (Wish of PR#15579.)

    • colSums() and friends now have support for arrays and data-frame
      columns with 2^31 or more elements.

    • as.factor() is faster when f is an unclassed integer vector (for
      example, when called from tapply()).

    • fft() now works with longer inputs, from the 12 million
      previously supported up to 2 billion.  (PR#15593)

    • Complex svd() now uses LAPACK subroutine ZGESDD, the complex
      analogue of the routine used for the real case.

    • Sweave now outputs .tex files in UTF-8 if the input encoding is
      declared to be UTF-8, regardless of the local encoding.  The
      UTF-8 encoding may now be declared using a LaTeX comment
      containing the string %\SweaveUTF8 on a line by itself.

    • file.copy() gains a copy.date argument.

    • Printing of date-times will make use of the time-zone
      abbreviation in use at the time, if known.  For example, for
      Paris pre-1940 this could be LMT, PMT, WET or WEST.  To enable
      this, the "POSIXlt" class has an optional component "zone"
      recording the abbreviation for each element.

      For platforms which support it, there is also a component
      "gmtoff" recording the offset from GMT where known.

    • (On Windows, by default on OS X and optionally elsewhere.)  The
      system C function strftime has been replaced by a more
      comprehensive version with closer conformance to the POSIX 2008
      standard.

    • dnorm(x, log = FALSE) is more accurate (but somewhat slower) for
      |x| > 5; as suggested in PR#15620.

    • Some versions of the tiff() device have further compression
      options.

    • read.table(), readLines() and scan() have a new argument to
      influence the treatment of embedded nuls.

    • Avoid duplicating the right hand side values in complex
      assignments when possible.  This reduces copying of replacement
      values in expressions such as Z$a <- a0 and ans[[i]] <- tmp: some
      package code has relied on there being copies.

      Also, a number of other changes to reduce copying of objects; all
      contributed by or based on suggestions by Michael Lawrence.

    • The fast argument of KalmanLike(), KalmanRun() and
      KalmanForecast() has been replaced by update, which instead of
      updating mod in place, optionally returns the updated model in an
      attribute "mod" of the return value.

    • arima() and makeARIMA() get a new optional argument SSinit,
      allowing the choice of a different *s*tate *s*pace initialization
      which has been observed to be more reliable close to
      non-stationarity: see PR#14682.

    • warning() has a new argument noBreaks., to simplify
      post-processing of output with options(warn = 1).

    • pushBack() gains an argument encoding, to support reading of
      UTF-8 characters using scan(), read.table() and related functions
      in a non-UTF-8 locale.

    • all.equal.list() gets a new argument use.names which by default
      labels differing components by names (if they match) rather than
      by integer index.  Saved R output in packages may need to be
      updated.

    • The methods for all.equal() and attr.all.equal() now have
      argument check.attributes after ... so it cannot be partially nor
      positionally matched (as it has been, unintentionally).

      A side effect is that some previously undetected errors of
      passing empty arguments (no object between commas) to all.equal()
      are detected and reported.

      There are explicit checks that check.attributes is logical,
      tolerance is numeric and scale is NULL or numeric.  This catches
      some unintended positional matching.

      The message for all.equal.numeric() reports a "scaled difference"
      only for scale != 1.

    • all.equal() now has a "POSIXt" method replacing the "POSIXct"
      method.

    • The "Date" and "POSIXt" methods of seq() allows by = "quarter"
      for completeness (by = "3 months" always worked).

    • file.path() removes any trailing separator on Windows, where they
      are invalid (although sometimes accepted).  This is intended to
      enhance the portability of code written by those using POSIX file
      systems (where a trailing / can be used to confine path matching
      to directories).

    • New function agrepl() which like grepl() returns a logical
      vector.

    • fifo() is now supported on Windows. (PR#15600)

    • sort.list(method = "radix") now allows negative integers (wish of
      PR#15644).

    • Some functionality of print.ts() is now available in
      .preformat.ts() for more modularity.

    • mcparallel() gains an option detach = TRUE which allows execution
      of code independently of the current session.  It is based on a
      new estranged = TRUE argument to mcfork() which forks child
      processes such that they become independent of the parent
      process.

    • The pdf() device omits circles and text at extremely small sizes,
      since some viewers were failing on such files.

    • The rightmost break for the "months", "quarters" and "years"
      cases of hist.POSIXlt() has been increased by a day.  (Inter
      alia, fixes PR#15717.)

    • The handling of DF[i,] <- a where i is of length 0 is improved.
      (Inter alia, fixes PR#15718.)

    • hclust() gains a new method "ward.D2" which implements Ward's
      method correctly.  The previous "ward" method is "ward.D" now,
      with the old name still working.  Thanks to research and
      proposals by Pierre Legendre.

    • The sunspot.month dataset has been amended and updated from the
      official source, whereas the sunspots and sunspot.year datasets
      will remain immutable. The documentation and source links have
      been updated correspondingly.

    • The summary() method for "lm" fits warns if the fit is
      essentially perfect, as most of the summary may be computed
      inaccurately (and with platform-dependent values).

      Programmers who use summary() in order to extract just a
      component which will be reliable (e.g., $cov.unscaled) should
      wrap their calls in suppressWarnings().

  INSTALLATION and INCLUDED SOFTWARE:

    • The included version of LAPACK has been updated to 3.5.0.

    • There is some support for parallel testing of an installation, by
      setting TEST_MC_CORES to an integer greater than one to indicate
      the maximum number of cores to be used in parallel. (It is worth
      specifying at least 8 cores if available.)  Most of these require
      a make program (such as GNU make and dmake) which supports the
      $MAKE -j nproc syntax.

      Except on Windows: the tests of standard package examples in make
      check are done in parallel.  This also applies to running
      tools::testInstalledPackages().

      The more time-consuming regression tests are done in parallel.

      The package checks in make check-devel and make check-recommended
      are done in parallel.

    • More of make check will work if recommended packages are not
      installed: but recommended packages remain needed for thorough
      checking of an R build.

    • The version of tzcode included in src/extra/tzone has been
      updated.  (Formerly used only on Windows.)

    • The included (64-bit) time-zone conversion code and Olson
      time-zone database can be used instead of the system version: use
      configure option --with-internal-tzcode.  This is the default on
      Windows and OS X.  (Note that this does not currently work if a
      non-default rsharedir configure variable is used.)

      (It might be necessary to set environment variable TZ on OSes
      where this is not already set, although the system timezone is
      deduced correctly on at least Linux, OS X and Windows.)

      This option also switches to the version of strftime included in
      directory src/extra/tzone.

    • configure now tests for a C++11-compliant compiler by testing
      some basic features.  This by default tries flags for the
      compiler specified by CXX, but an alternative compiler, options
      and standard can be specified by variables CXX1X, CXX1XFLAGS and
      CXX1XSTD (e.g., -std=gnu++11).

    • R can now optionally be compiled to use reference counting
      instead of the NAMED mechanism by defining SWITCH_TO_REFCNT in
      Rinternals.h. This may become the default in the future.

    • There is a new option --use-system-tre to use a suitable system
      tre library: at present this means a version from their git
      repository, after corrections.  (Wish of PR#15660.)

  PACKAGE INSTALLATION:

    • The CRANextra repository is no longer a default repository on
      Windows: all the binary versions of packages from CRAN are now on
      CRAN, although CRANextra contains packages from Omegahat and
      elsewhere used by CRAN packages.

    • Only vignettes sources in directory vignettes are considered to
      be vignettes and hence indexed as such.

    • In the DESCRIPTION file,

          License: X11
      
      is no longer recognized as valid.  Use MIT or BSD_2_clause
      instead, both of which need + file LICENSE.

    • For consistency, entries in .Rinstignore are now matched
      case-insensitively on all platforms.

    • Help for S4 methods with very long signatures now tries harder to
      split the description in the Usage field to no more than 80
      characters per line (some packages had over 120 characters).

    • R CMD INSTALL --build (not Windows) now defaults to the internal
      tar() unless R_INSTALL_TAR is set.

    • There is support for compiling C++11 code in packages on suitable
      platforms: see ‘Writing R Extensions’.

    • Fake installs now install the contents of directory inst: some
      packages use this to install e.g. C++ headers for use by other
      packages that are independent of the package itself.  Option
      --no-inst can be used to get the previous behaviour.

  DEBUGGING:

    • The behaviour of the code browser has been made more consistent,
      in part following the suggestions in PR#14985.

    • Calls to browser() are now consistent with calls to the browser
      triggered by debug(), in that Enter will default to n rather than
      c.

    • A new browser command s has been added, to “step into” function
      calls.

    • A new browser command f has been added, to “finish” the current
      loop or function.

    • Within the browser, the command help will display a short list of
      available commands.

  UTILITIES:

    • Only vignettes sources in directory vignettes are considered to
      be vignettes by R CMD check.  That has been the preferred
      location since R 2.14.0 and is now obligatory.

    • For consistency, R CMD build now matches entries in .Rbuildignore
      and vignettes/.install_extras case-insensitively on all platforms
      (not just on Windows).

    • checkFF() (called by R CMD check by default) can optionally check
      foreign function calls for consistency with the registered type
      and argument count.  This is the default for R CMD check
      --as-cran or can be enabled by setting environment variable
      _R_CHECK_FF_CALLS_ to registration (but is in any case suppressed
      by --install=no).  Because this checks calls in which .NAME is an
      R object and not just a literal character string, some other
      problems are detected for such calls.

      Functions suppressForeignCheck() and dontCheck() have been added
      to allow package authors to suppress false positive reports.

    • R CMD check --as-cran warns about a false value of the
      DESCRIPTION field BuildVignettes for Open Source packages, and
      ignores it.  (An Open Source package needs to have complete
      sources for its vignettes which should be usable on a suitably
      well-equipped system).

    • R CMD check --no-rebuild-vignettes is defunct:
      R CMD check --no-build-vignettes has been preferred since R
      3.0.0.

    • R CMD build --no-vignettes is defunct:
      R CMD build --no-build-vignettes has been preferred since R
      3.0.0.

    • R CMD Sweave and R CMD Stangle now process both Sweave and
      non-Sweave vignettes.  The tools::buildVignette() function has
      been added to do the same tasks from within R.

    • The flags returned by R CMD config --ldflags and (where
      installed) pkg-config --libs libR are now those needed to link a
      front-end against the (shared or static) R library.

    • Sweave.sty has a new option [inconsolata].

    • R CMD check customizations such as _R_CHECK_DEPENDS_ONLY_ make
      available packages only in LinkingTo only for installation, and
      not for loading/runtime tests.

    • tools::checkFF() reports on .C and .Fortran calls with DUP =
      FALSE if argument check_DUP is true.  This is selected by R CMD
      check by default.

    • R CMD check --use-gct can be tuned to garbage-collect less
      frequently using gctorture2() _via_ the setting of environment
      variable _R_CHECK_GCT_N_.

    • Where supported, tools::texi2dvi() limits the number of passes
      tried to 20.

  C-LEVEL FACILITIES:

    • (Windows only) A function R_WaitEvent() has been added (with
      declaration in headerR.h) to block execution until the next event
      is received by R.

    • Remapping in the Rmath.h header can be suppressed by defining
      R_NO_REMAP_RMATH.

    • The remapping of rround() in header Rmath.h has been removed: use
      fround() instead.

    • ftrunc() in header Rmath.h is now a wrapper for the C99 function
      trunc(), which might as well be used in C code: ftrunc() is still
      needed for portable C++ code.

    • The never-documented remapping of prec() to fprec() in header
      Rmath.h has been removed.

    • The included LAPACK subset now contains ZGESDD and ZGELSD.

    • The function LENGTH() now checks that it is only applied to
      vector arguments.  However, in packages length() should be used.
      (In R itself LENGTH() is a macro without the function overhead of
      length().)

    • Calls to SET_VECTOR_ELT() and SET_STRING_ELT() are now checked
      for indices which are in-range: several packages were writing one
      element beyond the allocated length.

    • allocVector3 has been added which allows custom allocators to be
      used for individual vector allocations.

  DEPRECATED AND DEFUNCT:

    • chol(pivot = TRUE, LINPACK = TRUE) is defunct.

      Arguments EISPACK for eigen() and LINPACK for chol(), chol2inv(),
      solve() and svd() are ignored: LAPACK is always used.

    • .find.package() and .path.package() are defunct: only the
      versions without the initial dot introduced in R 2.13.0 have ever
      been in the API.

    • Partial matching when using the $ operator _on data frames_ now
      throws a warning and may become defunct in the future. If partial
      matching is intended, replace foo$bar by foo[["bar", exact =
      FALSE]].

    • The long-deprecated use of \synopsis in the Usage section of .Rd
      files has been removed: such sections are now ignored (with a
      warning).

    • package.skeleton()'s deprecated argument namespace has been
      removed.

    • Many methods are no longer exported by package stats.  They are
      all registered on their generic, which should be called rather
      than calling a method directly.

    • Functions readNEWS() and checkNEWS() in package tools are
      defunct.

    • download.file(method = "lynx") is deprecated.

    • .C(DUP = FALSE) and .Fortran(DUP = FALSE) are now deprecated, and
      may be disabled in future versions of R.  As their help has long
      said, .Call() is much preferred.

      R CMD check notes such usages (by default).

    • The workaround of setting R_OSX_VALGRIND has been removed: it is
      not needed in current valgrind.

  BUG FIXES:

    • Calling lm.wfit() with no non-zero weights gave an array-overrun
      in the Fortran code and a not very sensible answer.  It is now
      special-cased with a simpler answer (no qr component).

    • Error messages involving non-syntactic names (e.g., as produced
      by `\r` when that object does not exist) now encode the control
      characters.  (Reported by Hadley Wickham.)

    • getGraphicsEvent() caused 100% usage of one CPU in Windows.
      (PR#15500)

    • nls() with no start argument may now work inside another function
      (scoping issue).

    • pbeta() and similar work better for very large (billions) ncp.

    • Where time zones have changed abbreviations over the years, the
      software tries to more consistently use the abbreviation
      appropriate to the time or if that is unknown, the current
      abbreviation.  On some platforms where the C function localtime
      changed the tzname variables the reported abbreviation could have
      been that of the last time converted.

    • all.equal(list(1), identity) now works.

    • Bug fix for pushing viewports in grid (reported by JJ Allaire and
      Kevin Ushey).

      NOTE for anyone poking around within the graphics engine display
      list (despite the warnings not to) that this changes what is
      recorded by grid on the graphics engine display list.

    • Extra checks have been added for unit resolution and conversion
      in grid, to catch instances of division-by-zero.  This may
      introduce error messages in existing code and/or produce a
      different result in existing code (but only where a non-finite
      location or dimension may now become zero).

    • Some bugs in TRE have been corrected by updating from the git
      repository.  This allows R to be installed on some platforms for
      which this was a blocker (PR#15087 suggests Linux on ARM and
      HP-UX).

    • ? applied to a call to an S4 generic failed in several cases.
      (PR#15680)

    • The implicit S4 generics for primitives with ... in their
      argument list were incorrect. (PR#15690)

    • Bug fixes to methods::callGeneric(). (PR#15691)

    • The bug fix to aggregrate() in PR#15004 introduced a new bug in
      the case of no grouping variables. (PR#15699)

    • In rare cases printing deeply nested lists overran a buffer by
      one byte and on a few platforms segfaulted. (PR#15679)

    • The dendrogram method of as.dendrogram() was hidden accidentally,
      (PR#15703), and order.dendrogram(d) gave too much for a leaf d.
      (PR#15702)

    • R would try to kill processes on exit that have pids ever used by
      a child process spawned by mcparallel even though the current
      process with that pid was not actually its child.

    • cophenetic() applied to a "dendrogram" object sometimes
      incorrectly returned a "Labels" attribute with dimensions.
      (PR#15706)

    • printCoefmat() called from quite a few print() methods now obeys
      small getOption("width") settings, line wrapping the "signif.
      codes" legend appropriately.  (PR#15708)

    • model.matrix() assumed that the stored dimnames for a matrix was
      NULL or length 2, but length 1 occurred.

    • The clipping region for a device was sometimes used in base
      graphics before it was set.

CHANGES IN R 3.0.3:

  NEW FEATURES:

    • On Windows there is support for making .texi manuals using
      texinfo 5.0 or later: the setting is in file
      src/gnuwin32/MkRules.dist.

      A packaging of the Perl script and modules for texinfo 5.2 has
      been made available at <URL:
      http://www.stats.ox.ac.uk/pub/Rtools/>.

    • write.table() now handles matrices of 2^31 or more elements, for
      those with large amounts of patience and disc space.

    • There is a new function, La_version(), to report the version of
      LAPACK in use.

    • The HTML version of ‘An Introduction to R’ now has links to PNG
      versions of the figures.

    • There is some support to produce manuals in ebook formats. (See
      doc/manual/Makefile.  Suggested by Mauro Cavalcanti.)

    • On a Unix-alike Sys.timezone() returns NA if the environment
      variable TZ is unset, to distinguish it from an empty string
      which on some OSes means the UTC time zone.

    • The backtick may now be escaped in strings, to allow names
      containing them to be constructed, e.g. `\``.  (PR#15621)

    • read.table(), readLines() and scan() now warn when an embedded
      nul is found in the input.  (Related to PR#15625 which was
      puzzled by the behaviour in this unsupported case.)

    • (Windows only.)  file.symlink() works around the undocumented
      restriction of the Windows system call to backslashes.  (Wish of
      PR#15631.)

    • KalmanForecast(fast = FALSE) is now the default, and the help
      contains an example of how fast = TRUE can be used in this
      version.  (The usage will change in 3.1.0.)

    • strptime() now checks the locale only when locale-specific
      formats are used and caches the locale in use: this can halve the
      time taken on OSes with slow system functions (e.g., OS X).

    • strptime() and the format() methods for classes "POSIXct",
      "POSIXlt" and "Date" recognize strings with marked encodings:
      this allows, for example, UTF-8 French month names to be read on
      (French) Windows.

    • iconv(to = "utf8") is now accepted on all platforms (some
      implementations did already, but GNU libiconv did not: however
      converted strings were not marked as being in UTF-8).  The
      official name, "UTF-8" is still preferred.

    • available.packages() is better protected against corrupt metadata
      files.  (A recurring problem with Debian package shogun-r:
      PR#14713.)

    • Finalizers are marked to be run at garbage collection, but run
      only at a somewhat safer later time (when interrupts are
      checked).  This circumvents some problems with finalizers running
      arbitrary code during garbage collection (the known instances
      being running options() and (C-level) path.expand()
      re-entrantly).

  INSTALLATION and INCLUDED SOFTWARE:

    • The included version of PCRE has been updated to 8.34.  This
      fixes bugs and makes the behaviour closer to Perl 5.18.  In
      particular, the concept of ‘space’ includes VT and hence agrees
      with POSIX's.

  PACKAGE INSTALLATION:

    • The new field SysDataCompression in the DESCRIPTION file allows
      user control over the compression used for sysdata.rda objects in
      the lazy-load database.

    • install.packages(dependencies = value) for value = NA (the
      default) or value = TRUE omits packages only in LinkingTo for
      binary package installs.

  C-LEVEL FACILITIES:

    • The long undocumented remapping of rround() to Rf_fround() in
      header Rmath.h is now formally deprecated: use fround() directly.

    • Remapping of prec() and trunc() in the Rmath.h header has been
      disabled in C++ code (it has caused breakage with libc++
      headers).

  BUG FIXES:

    • getParseData() truncated the imaginary part of complex number
      constants.  (Reported by Yihui Xie.)

    • dbeta(x, a, b) with a or b within a factor of 2 of the largest
      representable number could infinite-loop.  (Reported by Ioannis
      Kosmidis.)

    • provideDimnames() failed for arrays with a 0 dimension.
      (PR#15465)

    • rbind() and cbind() did not handle list objects correctly.
      (PR#15468)

    • replayPlot() now checks if it is replaying a plot from the same
      session.

    • rasterImage() and grid.raster() now give error on an empty
      (zero-length) raster.  (Reported by Ben North.)

    • plot.lm() would sometimes scramble the labels in plot type 5.
      (PR#15458 and PR#14837)

    • min() did not handle NA_character_ values properly.  (Reported by
      Magnus Thor Torfason.)

    • (Windows only.)  readRegistry() would duplicate default values
      for keys.  (PR#15455)

    • str(..., strict.width = "cut") did not handle it properly when
      more than one line needed to be cut.  (Reported by Gerrit
      Eichner.)

    • Removing subclass back-references when S4 classes were removed or
      their namespace unloaded had several bugs (e.g., PR#15481).

    • aggregate() could fail when there were too many levels present in
      the by argument.  (PR#15004)

    • namespaceImportFrom() needed to detect primitive functions when
      checking for duplicated imports (reported by Karl Forner).

    • getGraphicsEvent() did not exit when a user closed the graphics
      window.  (PR#15208)

    • Errors in vignettes were not always captured and displayed
      properly.  (PR#15495)

    • contour() could fail when dealing with extremely small z values.
      (PR#15454)

    • Several functions did not handle zero-length vectors properly,
      including browseEnv(), format(), gl(), relist() and
      summary.data.frame().  (E.g., PR#15499)

    • Sweave() did not restore the R output to the console if it was
      interrupted by a user in the middle of evaluating a code chunk.
      (Reported by Michael Sumner.)

    • Fake installs of packages with vignettes work again.

    • Illegal characters in the input caused parse() (and thus
      source()) to segfault.  (PR#15518)

    • The nonsensical use of nmax = 1 in duplicated() or unique() is
      now silently ignored.

    • qcauchy(p, *) is now fully accurate even when p is very close to
      1. (PR#15521)

    • The validmu() and valideta() functions in the standard glm()
      families now also report non-finite values, rather than failing.

    • Saved vignette results (in a .Rout.save file) were not being
      compared to the new ones during R CMD check.

    • Double-clicking outside of the list box (e.g., on the scrollbar)
      of a Tk listbox widget generated by tk_select.list() no longer
      causes the window to close. (PR#15407)

    • Improved handling of edge cases in parallel::splitindices().
      (PR#15552)

    • HTML display of results from help.search() and ?? sometimes
      contained badly constructed links.

    • c() and related functions such as unlist() converted raw vectors
      to invalid logical vectors. (PR#15535)

    • (Windows only) When a call to system2() specified one of stdin,
      stdout or stderr to be a file, but the command was not found
      (e.g., it contained its arguments, or the program was not on the
      PATH), it left the file open and unusable until R terminated.
      (Reported by Mathew McLean.)

    • The bmp() device was not recording res = NA correctly: it is now
      recorded as 72 ppi.

    • Several potential problems with compiler-specific behaviour have
      been identified using the ‘Undefined Behaviour Sanitizer’ in
      conjunction with the clang compiler.

    • hcl() now honours NA inputs (previously they were mapped to
      black).

    • Some translations in base packages were being looked up in the
      main catalog rather than that for the package.

    • As a result of the 3.0.2 change about ‘the last second before the
      epoch’, most conversions which should have given NA returned that
      time.  (The platforms affected include Linux and OS X, but not
      Windows nor Solaris.)

    • rowsum() has more support for matrices and data frames with 2^31
      or more elements. (PR#15587)

    • predict(<lm object>, interval = "confidence", scale =
      <something>) now works.  (PR#15564)

    • The bug fix in 3.0.2 for PR#15411 was too aggressive, and
      sometimes removed spaces that should not have been removed.
      (PR#15583)

    • Running R code in a tcltk callback failed to set the busy flag,
      which will be needed to tell OS X not to ‘App Nap’.

    • The code for date-times before 1902 assumed that the offset from
      GMT in 1902 was a whole number of minutes: that was not true of
      Paris (as recorded on some platforms).

    • Using Sys.setlocale to set LC_NUMERIC to "C" (to restore the sane
      behavior) no longer gives a warning.

    • deparse() now deparses complex vectors in a way that re-parses to
      the original values.  (PR#15534, patch based on code submitted by
      Alex Bertram.)

    • In some extreme cases (more than 10^15) integer inputs to
      dpqrxxx() functions might have been rounded up by one (with a
      warning about being non-integer).  (PR#15624)

    • Plotting symbol pch = 14 had the triangle upside down on some
      devices (typically screen devices). The triangle is supposed to
      be point up.  (Reported by Bill Venables.)

    • getSrcref() did not work on method definitions if
      rematchDefinition() had been used.

    • KalmanForecast(fast = FALSE) reported a (harmless) stack
      imbalance.

    • The count of observations used by KalmanRun() did not take
      missing values into account.

    • In locales where the abbreviated name of one month is a partial
      match for the full name of a later one, the %B format in
      strptime() could fail.  An example was French on OS X, where juin
      is abbreviated to jui and partially matches juillet.  Similarly
      for weekday names.

    • pbeta(x, a, b, log.p = TRUE) sometimes underflowed to zero for
      very small and very differently sized a, b.  (PR#15641)

    • approx() and approxfun() now handle infinite values with the
      "constant" method. (PR#15655)

    • stripchart() again respects reversed limits in xlim and ylim.
      (PR#15664)

CHANGES IN R 3.0.2:

  NEW FEATURES:

    • The NEWS files have been re-organized.

      This file contains news for R >= 3.0.0: news for the 0.x.y, 1.x.y
      and 2.x.y releases is in files NEWS.0, NEWS.1 and NEWS.2.  The
      latter files are now installed when R is installed.  An HTML
      version of news from 2.10.0 to 2.15.3 is available as
      doc/html/NEWS.2.html.

    • sum() for integer arguments now uses an integer accumulator of at
      least 64 bits and so will be more accurate in the very rare case
      that a cumulative sum exceeds 2^53 (necessarily summing more than
      4 million elements).

    • The example() and tools::Rd2ex() functions now have parameters to
      allow them to ignore \dontrun markup in examples.  (Suggested by
      Peter Solymos.)

    • str(x) is considerably faster for very large lists, or factors
      with 100,000 levels, the latter as in PR#15337.

    • col2rgb() now converts factors to character strings not integer
      codes (suggested by Bryan Hanson).

    • tail(warnings()) now works, _via_ the new `[` method.

    • There is now support for the LaTeX style file zi4.sty which has
      in some distributions replaced inconsolata.sty.

    • unlist(x) now typically returns all non-list xs unchanged, not
      just the “vector” ones.  Consequently, format(lst) now also works
      when the list lst has non-vector elements.

    • The tools::getVignetteInfo() function has been added to give
      information about installed vignettes.

    • New assertCondition(), etc. utilities in tools, useful for
      testing.

    • Profiling now records non-inlined calls from byte-compiled code
      to BUILTIN functions.

    • Various functions in stats and elsewhere that use non-standard
      evaluation are now more careful to follow the namespace scoping
      rules.  E.g., stats::lm() can now find stats::model.frame() even
      if stats is not on the search path or if some package defines a
      function of that name.

    • If an invalid/corrupt .Random.seed object is encountered in the
      workspace it is ignored with a warning rather than giving an
      error.  (This allows R itself to rely on a working RNG, e.g. to
      choose a random port.)

    • seq() and seq.int() give more explicit error messages if called
      with invalid (e.g., NaN) inputs.

    • When parse() finds a syntax error, it now makes partial parse
      information available up to the location of the error.  (Request
      of Reijo Sund.)

    • Methods invoked by NextMethod() had a different dynamic parent to
      the generic. This was causing trouble where S3 methods invoked
      _via_ lazy evaluation could lose track of their generic.
      (PR#15267)

    • Code for the negative binomial distribution now treats the case
      size == 0 as a one-point distribution at zero.

    • abbreviate() handles without warning non-ASCII input strings
      which require no abbreviation.

    • read.dcf() no longer has a limit of 8191 bytes per line. (Wish of
      PR#15250.)

    • formatC(x) no longer copies the class of x to the result, to
      avoid misuse creating invalid objects as in PR#15303.  A warning
      is given if a class is discarded.

    • Dataset npk has been copied from MASS to allow more tests to be
      run without recommended packages being installed.

    • The initialization of the regression coefficients for
      non-degenerate differenced models in arima() has been changed and
      in some examples avoids a local maximum.  (PR#15396)

    • termplot() now has an argument transform.x to control the display
      of individual terms in the plot.  (PR#15329)

    • format() now supports digits = 0, to display nsmall decimal
      places.

    • There is a new read-only par() parameter called "page", which
      returns a logical value indicating whether the next plot.new()
      call will start a new page.

    • Processing Sweave and Rd documents to PDF now renders backticks
      and single quotes better in several instances, including in \code
      and \samp expressions.

    • utils::modifyList() gets a new argument keep.null allowing NULL
      components in the replacement to be retained, instead of causing
      corresponding components to be deleted.

    • tools::pkgVignettes() gains argument check; if set to TRUE, it
      will warn when it appears a vignette requests a non-existent
      vignette engine.

  UTILITIES:

    • R CMD check --as-cran checks the line widths in usage and
      examples sections of the package Rd files.

    • R CMD check --as-cran now implies --timings.

    • R CMD check looks for command gfile if a suitable file is not
      found.  (Although file is not from GNU, OpenCSW on Solaris
      installs it as gfile.)

    • R CMD build (with the internal tar) checks the permissions of
      configure and cleanup files and adds execute permission to the
      recorded permissions for these files if needed, with a warning.
      This is useful on OSes and file systems which do not support
      execute permissions (notably, on Windows).

    • R CMD build now weaves and tangles all vignettes, so suggested
      packages are not required during package installation if the
      source tarball was prepared with current R CMD build.

    • checkFF() (used by R CMD check) does a better job of detecting
      calls from other packages, including not reporting those where a
      function has been copied from another namespace (e.g., as a
      default method).  It now reports calls where .NAME is a symbol
      registered in another package.

    • On Unix-alike systems, R CMD INSTALL now installs packages group
      writably whenever the library (lib.loc) is group writable.
      Hence, update.packages() works for other group members (suggested
      originally and from a patch by Dirk Eddelbuettel).

    • R CMD javareconf now supports the use of symbolic links for
      JAVA_HOME on platforms which have realpath.  So it is now
      possible to use

      R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-1.7.0
      
      on a Linux system and record that value rather than the
      frequently-changing full path such as
      /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25.x86_64.

    • (Windows only.) Rscript -e requires a non-empty argument for
      consistency with Unix versions of R.  (Also Rterm -e and R -e.)

    • R CMD check does more thorough checking of declared packages and
      namespaces.  It reports

        • packages declared in more than one of the Depends, Imports,
          Suggests and Enhances fields of the DESCRIPTION file.

        • namespaces declared in Imports but not imported from, neither
          in the NAMESPACE file nor using the :: nor ::: operators.

        • packages which are used in library() or requires() calls in
          the R code but were already put on the search path _via_
          Depends.

        • packages declared in Depends not imported _via_ the NAMESPACE
          file (except the standard packages).  Objects used from
          Depends packages should be imported to avoid conflicts and to
          allow correct operation when the namespace is loaded but not
          attached.

        • objects imported _via_ ::: calls where :: would do.

        • objects imported by :: which are not exported.

        • objects imported by ::: calls which do not exist.

      See ‘Writing R Extensions’ for good practice.

    • R CMD check optionally checks for non-standard top-level files
      and directories (which are often mistakes): this is enabled for
      --as-cran.

    • LaTeX style file upquote.sty is no longer included (the version
      was several years old): it is no longer used in R.  A much later
      version is commonly included in LaTeX distributions but does not
      play well with the ae fonts which are the default for Sweave
      vignettes.

    • R CMD build makes more use of the build sub-directory of package
      sources, for example to record information about the vignettes.

    • R CMD check analyses ::: calls.

  INSTALLATION and INCLUDED SOFTWARE:

    • The macros used for the texinfo manuals have been changed to work
      better with the incompatible changes made in texinfo 5.x.

    • The minimum version for a system xz library is now 5.0.3 (was
      4.999).  This is in part to avoid 5.0.2, which can compress in
      ways other versions cannot decompress.

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

    • The included version of zlib has been updated to 1.2.8, a bug-fix
      release.

    • The included version of xz utils's liblzma has been updated to
      5.0.5.

    • Since javareconf (see above) is used when R is installed, a
      stable link for JAVA_HOME can be supplied then.

    • Configuring with --disable-byte-compilation will override the
      DESCRIPTION files of recommended packages, which typically
      require byte-compilation.

    • More of the installation and checking process will work even when
      TMPDIR is set to a path containing spaces, but this is not
      recommended and external software (such as texi2dvi) may fail.

  PACKAGE INSTALLATION:

    • Installation is aborted immediately if a LinkingTo package is not
      installed.

    • R CMD INSTALL has a new option --no-byte-compile which will
      override a ByteCompile field in the package's DESCRIPTION file.

    • License BSD is deprecated: use BSD_3_clause or BSD_2_clause
      instead.

      License X11 is deprecated: use MIT or BSD_2_clause instead.

    • Version requirements for LinkingTo packages are now recognized:
      they are checked at installation.  (Fields with version
      requirements were previously silently ignored.)

    • The limit of 500 S3method entries in a NAMESPACE file has been
      removed.

    • The default ‘version’ of Bioconductor for its packages has been
      changed to the upcoming 2.13, but this can be set by the
      environment variable R_BIOC_VERSION when R is installed.

  C-LEVEL FACILITIES:

    • Rdefines.h has been tweaked so it can be included in C++ code
      after R_ext/Boolean.h (which is included by R.h).

      Note that Rdefines.h is not kept up-to-date, and Rinternals.h is
      preferred for new code.

    • eval and applyClosure are now protected against package code
      supplying an invalid rho.

  DEPRECATED AND DEFUNCT:

    • The unused namespace argument to package.skeleton() is now
      formally deprecated and will be removed in R 3.1.0.

    • plclust() is deprecated: use the plot() method for class "hclust"
      instead.

    • Functions readNEWS() and checkNEWS() in package tools are
      deprecated (and they have not worked with current NEWS files for
      a long time).

  DOCUMENTATION:

    • ‘An Introduction to R’ has a new chapter on using R as a
      scripting language including interacting with the OS.

  BUG FIXES:

    • help.request() could not determine the current version of R on
      CRAN.  (PR#15241)

    • On Windows, file.info() failed on root directories unless the
      path was terminated with an explicit ".".  (PR#15302)

    • The regmatches<-() replacement function mishandled results coming
      from regexpr().  (PR#15311)

    • The help for setClass() and representation() still suggested the
      deprecated argument representation=. (PR#15312)

    • R CMD config failed in an installed build of R 3.0.1 (only) when
      a sub-architecture was used.  (Reported by Berwin Turlach.)

    • On Windows, the installer modified the etc/Rconsole and
      etc/Rprofile.site files even when default options were chosen, so
      the MD5 sums did not refer to the installed versions.  (Reported
      by Tal Galili.)

    • plot(hclust(), cex =) respects cex again (and possibly others
      similarly).  (Reported by Peter Langfelder.)

    • If multiple packages were checked by R CMD check, and one was
      written for a different OS, it would set --no-install for all
      following packages as well as itself.

    • qr.coef() and related functions did not properly coerce real
      vectors to complex when necessary.  (PR#15332)

    • ftable(a) now fixes up empty dimnames such that the result is
      printable.

    • package.skeleton() was not starting its search for function
      objects in the correct place if environment was supplied.
      (Reported by Karl Forner.)

    • Parsing code was changing the length field of vectors and
      confusing the memory manager.  (PR#15345)

    • The Fortran routine ZHER2K in the reference BLAS had a
      comment-out bug in two places.  This caused trouble with eigen()
      for Hermitian matrices.  (PR#15345 and report from Robin Hankin)

    • vignette() and browseVignettes() did not display non-Sweave
      vignettes properly.

    • Two warning/error messages have been corrected: the (optional)
      warning produced by a partial name match with a pairlist, the
      error message from a zero-length argument to the : operator.
      (Found by Radford Neal; PR#15358, PR#15356)

    • svd() returned NULL rather than omitting components as
      documented.  (Found by Radford Neal; PR#15360)

    • mclapply() and mcparallel() with silent = TRUE could break a
      process that uses stdout output unguarded against broken pipes
      (e.g., zip will fail silently). To work around such issues, they
      now replace stdout with a descriptor pointed to /dev/null
      instead. For this purpose, internal closeStdout and closeStderr
      functions have gained the to.null flag.

    • log(), signif() and round() now raise an error if a single named
      argument is not named x.  (PR#15361)

    • deparse() now deparses raw vectors in a form that is
      syntactically correct. (PR#15369)

    • The jpeg driver in Sweave created a JPEG file, but gave it a .png
      extension. (PR#15370)

    • Deparsing of infix operators with named arguments is improved.
      (PR#15350)

    • mget(), seq.int() and numericDeriv() did not duplicate arguments
      properly. (PR#15352, PR#15353, PR#15354)

    • kmeans(algorithm = "Hartigan-Wong") now always stops iterating in
      the QTran stage. (PR#15364).

    • read.dcf() re-allocated incorrectly and so could segfault when
      called on a file with lines of more than 100 bytes.

    • On systems where mktime() does not set errno, the last second
      before the epoch could not be converted from POSIXlt to POSIXct.
      (Reported by Bill Dunlap.)

    • add1.glm() miscalculated F-statistics when df > 1. (Bill Dunlap,
      PR#15386).

    • stem() now discards infinite inputs rather than hanging.
      (PR#15376)

    • The parser now enforces C99 syntax for floating point hexadecimal
      constants (e.g., 0x1.1p0), rather than returning unintended
      values for malformed constants. (PR#15234)

    • model.matrix() now works with very long LHS names (more than 500
      bytes).  (PR#15377)

    • integrate() reverts to the pre-2.12.0 behaviour: from 2.12.0 to
      3.0.1 it sometimes failed to achieve the requested tolerance and
      reported error estimates that were exceeded.  (PR#15219)

    • strptime() now handles %W fields with value 0. (PR#15915)

    • R is now better protected against people trying to interact with
      the console in startup code.  (PR#15325)

    • Subsetting 1D arrays often lost dimnames (PR#15301).

    • Unary + on a logical vector did not coerce to integer, although
      unary - did.

    • na.omit() and na.exclude() added a row to a zero-row data frame.
      (PR#15399)

    • All the (where necessary cut-down) vignettes are installed if R
      was configured with --without-recommended-packages.

    • source() did not display filenames when reporting syntax errors.

    • Syntax error reports misplaced the caret pointing out the bad
      token.

    • (Windows only) Starting R with R (instead of Rterm or Rgui) would
      lose any zero-length strings from the command line arguments.
      (PR#15406)

    • Errors in the encoding specified on the command line _via_
      --encoding=foo were not handled properly.  (PR#15405)

    • If x is a symbol, is.vector(x, "name") now returns TRUE, since
      "name" and "symbol" should be synonyms.  (Reported by Hervé
      Pagès.)

    • R CMD rtags works on platforms (such as OS X) with a
      XSI-conformant shell command echo. (PR#15231)

    • is.unsorted(NA) returns false as documented (rather than NA).

    • R CMD LINK did not know about sub-architectures.

    • system() and system2() are better protected against users who
      misguidedly have spaces in the temporary directory path.

    • file.show() and edit() are now more likely to work on file paths
      containing spaces.  (Where external utilities are used, not the
      norm on Windows nor in R.app which should previously have
      worked.)

    • Packages using the methods package are more likely to work when
      they import it but it is not attached.  (Several parts of its C
      code were looking for its R functions on the search path rather
      than in its namespace.)

    • lgamma(-x) is no longer NaN for very small x.

    • (Windows) system2() now respects specifying stdout and stderr as
      files if called from Rgui. (PR#15393)

    • Closing an x11() device whilst locator() or identify() is in
      progress no longer hangs R.  (PR#15253)

    • list.dirs(full.names = FALSE) was not implemented.  (PR#15170)

    • format() sometimes added unnecessary spaces.  (PR#15411)

    • all.equal(check.names = FALSE) would ignore the request to ignore
      the names and would check them as attributes.

    • The symbol set by tools::Rd2txt_options(itemBullet=) was not
      respected in some locales. (PR#15435)

    • mcMap() was not exported by package parallel. (PR#15439)

    • plot() for TukeyHSD objects did not balance dev.hold() and
      dev.flush() calls on multi-page plots.  (PR#15449)

CHANGES IN R 3.0.1:

  NEW FEATURES:

    • chooseCRANmirror() and chooseBioCmirror() gain an ind argument
      (like setRepositories()).

    • mcparallel has a new argument mc.interactive which can modify the
      interactive flag in the child process. The new default is FALSE
      which makes child processes non-interactive by default (this
      prevents lock-ups due to children waiting for interactive input).

    • scan() now warns when end-of-file occurs within a quoted string.

    • count.fields() is now consistent with scan() in its handling of
      newlines in quoted strings.  Instead of triggering an error, this
      results in the current line receiving NA as the field count, with
      the next line getting the total count of the two lines.

    • The default method of image() will plot axes of the class of xlim
      and ylim (and hence of x and y if there is a suitable range()
      method).  Based on a suggestion of Michael Sumner.

    • load() now has a verbose argument for debugging support, to print
      the names of objects just before loading them.

    • When loading a serialized object encounters a reference to a
      namespace which cannot be loaded, this is replaced by a reference
      to the global environment, with a warning.

    • pairs() gains a line.main option for title placement.

    • The remaining instances in which serialization to a raw vector
      was limited to 2GB have been unlimited on a 64-bit platform, and
      in most cases serialization to a vector of more than 1GB will be
      substantially faster.

  UTILITIES:

    • R CMD config now make use of personal Makevars files under ~/.R
      and a site file Makevars.site, in the same way as R CMD SHLIB and
      R CMD INSTALL.  This makes the utility more useful in package
      configure scripts.

      On Windows finding the personal files may require the environment
      variable HOME set.

      The old behaviour can be obtained with the new options
      --no-user-files and --no-site-files.

  PACKAGE INSTALLATION:

    • Alternatives to the site and user customization files
      Makevars.site and ~/.R/Makevars can be specified _via_ the
      environment variables R_MAKEVARS_SITE and R_MAKEVARS_USER
      respectively.  These can be used to suppress the use of the
      default files by setting an empty value (where possible) or a
      non-existent path.

  BUG FIXES:

    • sys.source() did not report error locations when keep.source =
      TRUE.

    • as.POSIXct.numeric was coercing origin using the tz argument and
      not "GMT" as documented (PR#14973).

    • The active binding to assign fields in reference classes has been
      cleaned up to reduce dependence on the class' package
      environment, also fixing bug in initializing read-only fields
      (inspired by a report from Hadley Wickham).

    • str(d) no longer gives an error when names(d) contain illegal
      multibyte strings (PR#15247).

    • Profiling of built-in functions with line.profiling= TRUE did not
      record the line from which they were called.

    • citation(pkg) dropped the header and footer specified in the
      CITATION file (PR#15257).

    • Quotes were handled differently when reading the first line and
      reading the rest, so read.table() misread some files that
      contained quote characters (PR#15245).

    • cat() with sep a character vector of length greater than one and
      more than one argument was using separators inconsistently
      (PR#15261).

    • On Windows in R 3.0.0, savePlot() failed because of an incorrect
      check on the argument count.

    • unzip(list = TRUE) returned Names as a factor and not a character
      vector (as documented) for the internal method.  (Noticed by Sean
      O'Riordain.)

    • contourLines() now checks more comprehensively for conformance of
      its x, y and z arguments (it was used incorrectly in package
      R2G2).

    • Saved graphics display lists are R version-specific.  Attempting
      to load workspaces containing them (or some other
      version-specific objects) aborted the load in R 3.0.0 and
      earlier; now it does a partial load and generates a warning
      instead.

    • In R 3.0.0, identify() and locator() did not record information
      correctly, so replaying a graph (e.g., by copying it to another
      device) would fail. (PR#15271)

    • Calling file.copy() or dirname() with the invalid input "" (which
      was being used in packages, despite not being a file path) could
      have caused a segfault.

      dirname("") is now "" rather than "." (unless it segfaulted).

    • supsmu() could read/write outside its input vectors for very
      short inputs (seen in package rms for n = 4).

    • as.dendrogram()'s hclust method uses less memory and hence gets
      considerably faster for large (n ~ 1000) clusterings, thanks to
      Daniel Müllner. (PR#15174)

    • The return value when all workers failed from
      parallel::mclapply(mc.preschedule = TRUE) was a list of strings
      and not of error objects.  (Spotted by Karl Forner and Bernd
      Bischl.)

    • In R 3.0.0, when help() found multiple pages with the same alias,
      the HTML display of all the selections was not produced.
      (PR#15282)

    • splinefun(method="monoH.FC") now produces a function with first
      argument named x and allows deriv=3, as documented. (PR#15273)

    • summaryRprof() would only read the first chunksize lines of an
      Rprof file produced with line.profiling=TRUE. By default, this is
      the first 100 seconds.  (PR#15288)

    • lsfit() produced an incorrect error message when argument x had
      more columns than rows or x had a different number of rows than
      y. (Spotted by Renaud Gaujoux.)

    • Binary operations on equal length vectors copied the class name
      from the second operand when the first had no class name, but did
      not set the object bit. (PR#15299)

    • The trace() method for reference generator objects failed after
      those objects became function definitions.

    • write.table() did not check that factors were constructed
      correctly, and so caused a segment fault when writing bad ones.
      (PR#15300)

    • The internal HTTP server no longer chokes on POST requests
      without body. It will also pass-through other request types for
      custom handlers (with the method stored in Request-Method header)
      instead of failing.

CHANGES IN R 3.0.0:

  SIGNIFICANT USER-VISIBLE CHANGES:

    • Packages need to be (re-)installed under this version (3.0.0) of
      R.

    • There is a subtle change in behaviour for numeric index values
      2^31 and larger.  These never used to be legitimate and so were
      treated as NA, sometimes with a warning.  They are now legal for
      long vectors so there is no longer a warning, and x[2^31] <- y
      will now extend the vector on a 64-bit platform and give an error
      on a 32-bit one.

    • It is now possible for 64-bit builds to allocate amounts of
      memory limited only by the OS.  It may be wise to use OS
      facilities (e.g., ulimit in a bash shell, limit in csh), to set
      limits on overall memory consumption of an R process,
      particularly in a multi-user environment.  A number of packages
      need a limit of at least 4GB of virtual memory to load.

      64-bit Windows builds of R are by default limited in memory usage
      to the amount of RAM installed: this limit can be changed by
      command-line option --max-mem-size or setting environment
      variable R_MAX_MEM_SIZE.

    • Negative numbers for colours are consistently an error:
      previously they were sometimes taken as transparent, sometimes
      mapped into the current palette and sometimes an error.

  NEW FEATURES:

    • identical() has a new argument, ignore.environment, used when
      comparing functions (with default FALSE as before).

    • There is a new option, options(CBoundsCheck=), which controls how
      .C() and .Fortran() pass arguments to compiled code.  If true
      (which can be enabled by setting the environment variable
      R_C_BOUNDS_CHECK to yes), raw, integer, double and complex
      arguments are always copied, and checked for writing off either
      end of the array on return from the compiled code (when a second
      copy is made).  This also checks individual elements of character
      vectors passed to .C().

      This is not intended for routine use, but can be very helpful in
      finding segfaults in package code.

    • In layout(), the limits on the grid size have been raised
      (again).

    • New simple provideDimnames() utility function.

    • Where methods for length() return a double value which is
      representable as an integer (as often happens for package
      Matrix), this is converted to an integer.

    • Matrix indexing of data frames by two-column numeric indices is
      now supported for replacement as well as extraction.

    • setNames() now has a default for its object argument, useful for
      a character result.

    • StructTS() has a revised additive constant in the loglik
      component of the result: the previous definition is returned as
      the loglik0 component.  However, the help page has always warned
      of a lack of comparability of log-likelihoods for non-stationary
      models.  (Suggested by Jouni Helske.)

    • The logic in aggregate.formula() has been revised.  It is now
      possible to use a formula stored in a variable; previously, it
      had to be given explicitly in the function call.

    • install.packages() has a new argument quiet to reduce the amount
      of output shown.

    • Setting an element of the graphics argument lwd to a negative or
      infinite value is now an error.  Lines corresponding to elements
      with values NA or NaN are silently omitted.

      Previously the behaviour was device-dependent.

    • Setting graphical parameters cex, col, lty, lwd and pch in par()
      now requires a length-one argument.  Previously some silently
      took the first element of a longer vector, but not always when
      documented to do so.

    • Sys.which() when used with inputs which would be unsafe in a
      shell (e.g., absolute paths containing spaces) now uses
      appropriate quoting.

    • as.tclObj() has been extended to handle raw vectors.  Previously,
      it only worked in the other direction.  (Contributed by Charlie
      Friedemann, PR#14939.)

    • New functions cite() and citeNatbib() have been added, to allow
      generation of in-text citations from "bibentry" objects.  A
      cite() function may be added to bibstyle() environments.

    • A sort() method has been added for "bibentry" objects.

    • The bibstyle() function now defaults to setting the default
      bibliography style. The getBibstyle() function has been added to
      report the name of the current default style.

    • scatter.smooth() now has an argument lpars to pass arguments to
      lines().

    • pairs() has a new log argument, to allow some or all variables to
      be plotted on logarithmic scale.  (In part, wish of PR#14919.)

    • split() gains a sep argument.

    • termplot() does a better job when given a model with interactions
      (and no longer attempts to plot interaction terms).

    • The parser now incorporates code from Romain Francois' parser
      package, to support more detailed computation on the code, such
      as syntax highlighting, comment-based documentation, etc.
      Functions getParseData() and getParseText() access the data.

    • There is a new function rep_len() analogous to rep.int() for when
      speed is required (and names are not).

    • The undocumented use rep(NULL, length.out = n) for n > 0 (which
      returns NULL) now gives a warning.

    • demo() gains an encoding argument for those packages with
      non-ASCII demos: it defaults to the package encoding where there
      is one.

    • strwrap() converts inputs with a marked encoding to the current
      locale: previously it made some attempt to pass through as bytes
      inputs invalid in the current locale.

    • Specifying both rate and scale to [dpqr]gamma is a warning (if
      they are essentially the same value) or an error.

    • merge() works in more cases where the data frames include
      matrices.  (Wish of PR#14974.)

    • optimize() and uniroot() no longer use a shared parameter object
      across calls.  (nlm(), nlminb() and optim() with numerical
      derivatives still do, as documented.)

    • The all.equal() method for date-times is now documented: times
      are regarded as equal (by default) if they differ by up to 1
      msec.

    • duplicated() and unique() gain a nmax argument which can be used
      to make them much more efficient when it is known that there are
      only a small number of unique entries.  This is done
      automatically for factors.

    • Functions rbinom(), rgeom(), rhyper(), rpois(), rnbinom(),
      rsignrank() and rwilcox() now return integer (not double)
      vectors.  This halves the storage requirements for large
      simulations.

    • sort(), sort.int() and sort.list() now use radix sorting for
      factors of less than 100,000 levels when method is not supplied.
      So does order() if called with a single factor, unless na.last =
      NA.

    • diag() as used to generate a diagonal matrix has been re-written
      in C for speed and less memory usage.  It now forces the result
      to be numeric in the case diag(x) since it is said to have ‘zero
      off-diagonal entries’.

    • backsolve() (and forwardsolve()) are now internal functions, for
      speed and support for large matrices.

    • More matrix algebra functions (e.g., chol() and solve()) accept
      logical matrices (and coerce to numeric).

    • sample.int() has some support for n >= 2^31: see its help for the
      limitations.

      A different algorithm is used for (n, size, replace = FALSE, prob
      = NULL) for n > 1e7 and size <= n/2.  This is much faster and
      uses less memory, but does give different results.

    • approxfun() and splinefun() now return a wrapper to an internal
      function in the stats namespace rather than a .C() or .Call()
      call.  This is more likely to work if the function is saved and
      used in a different session.

    • The functions .C(), .Call(), .External() and .Fortran() now give
      an error (rather than a warning) if called with a named first
      argument.

    • Sweave() by default now reports the locations in the source
      file(s) of each chunk.

    • clearPushBack() is now a documented interface to a long-existing
      internal call.

    • aspell() gains filters for R code, Debian Control Format and
      message catalog files, and support for R level dictionaries.  In
      addition, package utils now provides functions
      aspell_package_R_files() and aspell_package_C_files() for spell
      checking R and C level message strings in packages.

    • bibentry() gains some support for “incomplete” entries with a
      crossref field.

    • gray() and gray.colors() finally allow alpha to be specified.

    • monthplot() gains parameters to control the look of the reference
      lines.  (Suggestion of Ian McLeod.)

    • Added support for new %~% relation (“is distributed as”) in
      plotmath.

    • domain = NA is accepted by gettext() and ngettext(), analogously
      to stop() etc.

    • termplot() gains a new argument plot = FALSE which returns
      information to allow the plots to be modified for use as part of
      other plots, but does not plot them.  (Contributed by Terry
      Therneau, PR#15076.)

    • quartz.save(), formerly an undocumented part of R.app, is now
      available to copy a device to a quartz() device.  dev.copy2pdf()
      optionally does this for PDF output: quartz.save() defaults to
      PNG.

    • The default method of pairs() now allows text.panel = NULL and
      the use of <foo>.panel = NULL is now documented.

    • setRefClass() and getRefClass() now return class generator
      functions, similar to setClass(), but still with the reference
      fields and methods as before (suggestion of Romain Francois).

    • New functions bitwNot(), bitwAnd(), bitwOr() and bitwXor(), using
      the internal interfaces previously used for classes "octmode" and
      "hexmode".

      Also bitwShiftL() and bitwShiftR() for shifting bits in elements
      of integer vectors.

    • New option "deparse.cutoff" to control the deparsing of language
      objects such as calls and formulae when printing.  (Suggested by
      a comment of Sarah Goslee.)

    • colors() gains an argument distinct.

    • New demo(colors) and demo(hclColors), with utility functions.

    • list.files() (aka dir()) gains a new optional argument no.. which
      allows to exclude "." and ".." from listings.

    • Multiple time series are also of class "matrix"; consequently,
      head(), e.g., is more useful.

    • encodeString() preserves UTF-8 marked encodings.  Thus if factor
      levels are marked as UTF-8 an attempt is made to print them in
      UTF-8 in RGui on Windows.

    • readLines() and scan() (and hence read.table()) in a UTF-8 locale
      now discard a UTF-8 byte-order-mark (BOM).  Such BOMs are allowed
      but not recommended by the Unicode Standard: however Microsoft
      applications can produce them and so they are sometimes found on
      websites.

      The encoding name "UTF-8-BOM" for a connection will ensure that a
      UTF-8 BOM is discarded.

    • mapply(FUN, a1, ..) now also works when a1 (or a further such
      argument) needs a length() method (which the documented arguments
      never do).  (Requested by Hervé Pagès; with a patch.)

    • .onDetach() is supported as an alternative to .Last.lib.  Unlike
      .Last.lib, this does not need to be exported from the package's
      namespace.

    • The srcfile argument to parse() may now be a character string, to
      be used in error messages.

    • The format() method for ftable objects gains a method argument,
      propagated to write.ftable() and print(), allowing more compact
      output, notably for LaTeX formatting, thanks to Marius Hofert.

    • The utils::process.events() function has been added to trigger
      immediate event handling.

    • Sys.which() now returns NA (not "") for NA inputs (related to
      PR#15147).

    • The print() method for class "htest" gives fewer trailing spaces
      (wish of PR#15124).

      Also print output from HoltWinters(), nls() and others.

    • loadNamespace() allows a version specification to be given, and
      this is used to check version specifications given in the Imports
      field when a namespace is loaded.

    • setClass() has a new argument, slots, clearer and less ambiguous
      than representation.  It is recommended for future code, but
      should be back-compatible.  At the same time, the allowed slot
      specification is slightly more general.  See the documentation
      for details.

    • mget() now has a default for envir (the frame from which it is
      called), for consistency with get() and assign().

    • close() now returns an integer status where available, invisibly.
      (Wish of PR#15088.)

    • The internal method of tar() can now store paths too long for the
      ustar format, using the (widely supported) GNU extension.  It can
      also store long link names, but these are much less widely
      supported.  There is support for larger files, up to the ustar
      limit of 8GB.

    • Local reference classes have been added to package methods.
      These are a technique for avoiding unneeded copying of large
      components of objects while retaining standard R functional
      behavior.  See ?LocalReferenceClasses.

    • untar() has a new argument restore_times which if false (not the
      default) discards the times in the tarball.  This is useful if
      they are incorrect (some tarballs submitted to CRAN have times in
      a local time zone or many years in the past even though the
      standard required them to be in UTC).

    • replayplot() cannot (and will not attempt to) replay plots
      recorded under R < 3.0.0.  It may crash the R session if an
      attempt is made to replay plots created in a different build of R
      >= 3.0.0.

    • Palette changes get recorded on the display list, so replaying
      plots (including when resizing screen devices and using
      dev.copy()) will work better when the palette is changed during a
      plot.

    • chol(pivot = TRUE) now defaults to LAPACK, not LINPACK.

    • The parse() function has a new parameter keep.source, which
      defaults to options("keep.source").

    • Profiling _via_ Rprof() now optionally records information at the
      statement level, not just the function level.

    • The Rprof() function now quotes function names in in its output
      file on Windows, to be consistent with the quoting in Unix.

    • Profiling _via_ Rprof() now optionally records information about
      time spent in GC.

    • The HTML help page for a package now displays non-vignette
      documentation files in a more accessible format.

    • To support options(stringsAsFactors = FALSE), model.frame(),
      model.matrix() and replications() now automatically convert
      character vectors to factors without a warning.

    • The print method for objects of class "table" now detects tables
      with 0-extents and prints the results as, e.g., < table of extent
      0 x 1 x 2 >. (Wish of PR#15198.)

    • Deparsing involving calls to anonymous functions has been made
      closer to reversible by the addition of extra parentheses.

    • The function utils::packageName() has been added as a lightweight
      version of methods::getPackageName().

    • find.package(lib.loc = NULL) now treats loaded namespaces
      preferentially in the same way as attached packages have been for
      a long time.

    • In Windows, the Change Directory dialog now defaults to the
      current working directory, rather than to the last directory
      chosen in that dialog.

    • available.packages() gains a "license/restricts_use" filter which
      retains only packages for which installation can proceed solely
      based on packages which are guaranteed not to restrict use.

    • New check_packages_in_dir() function in package tools for
      conveniently checking source packages along with their reverse
      dependencies.

    • R's completion mechanism has been improved to handle help
      requests (starting with a question mark).  In particular, help
      prefixes are now supported, as well as quoted help topics.  To
      support this, completion inside quotes are now handled by R by
      default on all platforms.

    • The memory manager now allows the strategy used to balance
      garbage collection and memory growth to be controlled by setting
      the environment variable R_GC_MEM_GROW. See ?Memory for more
      details.

    • (‘For experts only’, as the introductory manual says.)  The use
      of environment variables R_NSIZE and R_VSIZE to control the
      initial (= minimum) garbage collection trigger for number of cons
      cels and size of heap has been restored: they can be overridden
      by the command-line options --min-nsize and --min-vsize; see
      ?Memory.

    • On Windows, the device name for bitmap devices as reported by
      .Device and .Devices no longer includes the file name.  This is
      for consistency with other platforms and was requested by the
      lattice maintainer.

      win.metafile() still uses the file name: the exact form is used
      by package tkrplot.

    • set.seed(NULL) re-initializes .Random.seed as done at the
      beginning of the session if not already set.  (Suggestion of Bill
      Dunlap.)

    • The breaks argument in hist.default() can now be a function that
      returns the breakpoints to be used (previously it could only
      return the suggested number of breakpoints).

    • File share/licenses/licenses.db has some clarifications,
      especially as to which variants of ‘BSD’ and ‘MIT’ is intended
      and how to apply them to packages.  The problematic licence
      ‘Artistic-1.0’ has been removed.

  LONG VECTORS:

  This section applies only to 64-bit platforms.

    • There is support for vectors longer than 2^31 - 1 elements.  This
      applies to raw, logical, integer, double, complex and character
      vectors, as well as lists.  (Elements of character vectors remain
      limited to 2^31 - 1 bytes.)

    • Most operations which can sensibly be done with long vectors
      work: others may return the error ‘long vectors not supported
      yet’.  Most of these are because they explicitly work with
      integer indices (e.g., anyDuplicated() and match()) or because
      other limits (e.g., of character strings or matrix dimensions)
      would be exceeded or the operations would be extremely slow.

    • length() returns a double for long vectors, and lengths can be
      set to 2^31 or more by the replacement function with a double
      value.

    • Most aspects of indexing are available.  Generally double-valued
      indices can be used to access elements beyond 2^31 - 1.

    • There is some support for matrices and arrays with each dimension
      less than 2^31 but total number of elements more than that.  Only
      some aspects of matrix algebra work for such matrices, often
      taking a very long time.  In other cases the underlying Fortran
      code has an unstated restriction (as was found for complex
      svd()).

    • dist() can produce dissimilarity objects for more than 65536 rows
      (but for example hclust() cannot process such objects).

    • serialize() to a raw vector is unlimited in size (except by
      resources).

    • The C-level function R_alloc can now allocate 2^35 or more bytes.

    • agrep() and grep() will return double vectors of indices for long
      vector inputs.

    • Many calls to .C() have been replaced by .Call() to allow long
      vectors to be supported (now or in the future).  Regrettably
      several packages had copied the non-API .C() calls and so failed.

    • .C() and .Fortran() do not accept long vector inputs.  This is a
      precaution as it is very unlikely that existing code will have
      been written to handle long vectors (and the R wrappers often
      assume that length(x) is an integer).

    • Most of the methods for sort() work for long vectors.

      rank(), sort.list() and order() support long vectors (slowly
      except for radix sorting).

    • sample() can do uniform sampling from a long vector.

  PERFORMANCE IMPROVEMENTS:

    • More use has been made of R objects representing registered entry
      points, which is more efficient as the address is provided by the
      loader once only when the package is loaded.

      This has been done for packages base, methods, splines and tcltk:
      it was already in place for the other standard packages.

      Since these entry points are always accessed by the R entry
      points they do not need to be in the load table which can be
      substantially smaller and hence searched faster.  This does mean
      that .C / .Fortran / .Call calls copied from earlier versions of
      R may no longer work - but they were never part of the API.

    • Many .Call() calls in package base have been migrated to
      .Internal() calls.

    • solve() makes fewer copies, especially when b is a vector rather
      than a matrix.

    • eigen() makes fewer copies if the input has dimnames.

    • Most of the linear algebra functions make fewer copies when the
      input(s) are not double (e.g., integer or logical).

    • A foreign function call (.C() etc) in a package without a PACKAGE
      argument will only look in the first DLL specified in the
      NAMESPACE file of the package rather than searching all loaded
      DLLs.  A few packages needed PACKAGE arguments added.

    • The @<- operator is now implemented as a primitive, which should
      reduce some copying of objects when used.  Note that the operator
      object must now be in package base: do not try to import it
      explicitly from package methods.

  PACKAGE INSTALLATION:

    • The transitional support for installing packages without
      namespaces (required since R 2.14.0) has been removed.  R CMD
      build will still add a namespace, but a .First.lib() function
      will need to be converted.

      R CMD INSTALL no longer adds a namespace (so installation will
      fail), and a .First.lib() function in a package will be ignored
      (with an installation warning for now).

      As an exception, packages without a R directory and no NAMESPACE
      file can still be installed.

    • Packages can specify in their DESCRIPTION file a line like

           Biarch: yes
      
      to be installed on Windows with --force-biarch.

    • Package vignettes can now be processed by other engines besides
      Sweave; see ‘Writing R Extensions’ and the tools::vignetteEngine
      help topic for details.

    • The *.R tangled source code for vignettes is now included in
      tarballs when R CMD build is used to produce them.  In R 3.0.0,
      *.R files not in the sources will be produced at install time,
      but eventually this will be dropped.

    • The package type "mac.binary" now looks in a path in the
      repository without any Mac subtype (which used to be universal or
      leopard): it looks in bin/macosx/contrib/3.0 rather than
      bin/macosx/leopard/contrib/2.15).  This is the type used for the
      CRAN binary distribution for OS X as from R 3.0.0.

    • File etc/Makeconf makes more use of the macros $(CC), $(CXX),
      $(F77) and $(FC), so the compiler in use can be changed by
      setting just these (and if necessary the corresponding flags and
      FLIBS) in file ~/.R/Makevars.

      This is convenient for those working with binary distributions of
      R, e.g. on OS X.

  UTILITIES:

    • R CMD check now gives a warning rather than a note if it finds
      calls to abort, assert or exit in compiled code, and has been
      able to find the .o file in which the calls occur.

      Such calls can terminate the R process which loads the package.

    • The location of the build and check environment files can now be
      specified by the environment variables R_BUILD_ENVIRON and
      R_CHECK_ENVIRON, respectively.

    • R CMD Sweave gains a --compact option to control possibly
      reducing the size of the PDF file it creates when --pdf is given.

    • R CMD build now omits Eclipse's .metadata directories, and R CMD
      check warns if it finds them.

    • R CMD check now does some checks on functions defined within
      reference classes, including of .Call() etc calls.

    • R CMD check --as-cran notes assignments to the global
      environment, calls to data() which load into the global
      environment, and calls to attach().

    • R CMD build by default uses the internal method of tar() to
      prepare the tarball.  This is more likely to produce a tarball
      compatible with R CMD INSTALL and R CMD check: an external tar
      program, including options, can be specified _via_ the
      environment variable R_BUILD_TAR.

    • tools::massageExamples() is better protected against packages
      which re-define base functions such as cat() and get() and so can
      cause R CMD check to fail when checking examples.

    • R CMD javareconf has been enhanced to be more similar to the code
      used by configure.

      There is now a test that a JNI program can be compiled (like
      configure did) and only working settings are used.

      It makes use of custom settings from configuration recorded in
      etc/javaconf.

    • The --no-vignettes argument of R CMD build has been renamed to
      the more accurate --no-build-vignettes: its action has always
      been to (re)build vignettes and never omitted them.

      R CMD check accepts --no-build-vignettes as a preferred synonym
      for --no-rebuild-vignettes.

  DEPRECATED AND DEFUNCT:

    • The ENCODING argument to .C() is defunct.  Use iconv() instead.

    • The .Internal(eval.with.vis) non-API function has been removed.

    • Support for the converters for use with .C() has been removed,
      including the oft misused non-API header R_ext/RConverters.h.

    • The previously deprecated uses of array() with a 0-length dim
      argument and tapply() with a 0-length INDEX list are now errors.

    • Translation packages are defunct.

    • Calling rep() or rep.int() on a pairlist or other non-vector
      object is now an error.

    • Several non-API entry points have been transferred to packages
      (e.g., R_zeroin2) or replaced by different non-API entry points
      (e.g., R_tabulate).

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

    • The .Fortran() entry point "dqrls" which has not been used by R
      since version 2.15.1 is no longer available.

    • Functions traceOn() and traceOff() in package methods are now
      defunct.

    • Function CRAN.packages() is finally defunct.

    • Use of col2rgb(0) is defunct: use par("bg") or NA instead.

    • The long-defunct functions Rd_parse(), anovalist.lm(),
      categpry(), clearNames(), gammaCody(), glm.fit.null(),
      lm.fit.null(), lm.wfit.null(), manglePackageNames(),
      mauchley.test(), package.contents(), print.coefmat(),
      reshapeLong(), reshapeWide(), tkclose(), tkcmd(), tkfile.dir(),
      tkfile.tail(), tkopen(), tkputs(), tkread(), trySilent() and
      zip.file.extract() have been removed entirely (but are still
      documented in the help system).

    • The unused dataPath argument to attachNamespace() has been
      removed.

    • grid.prompt() has been removed: use devAskNewPage() instead.

    • The long-deprecated intensities component is no longer returned
      by hist().

    • mean() for data frames and sd() for data frames and matrices are
      defunct.

    • chol(pivot = FALSE, LINPACK = TRUE), ch2inv(LINPACK = TRUE),
      eigen(EISPACK = TRUE), solve(LINPACK = TRUE) and svd(LINPACK =
      TRUE) are defunct: LAPACK will be used, with a warning.

    • The keep.source argument to library() and require() is defunct.
      This option needs to be set at install time.

    • Documentation for real(), as.real() and is.real() has been moved
      to ‘defunct’ and the functions removed.

    • The maxRasters argument of pdf() (unused since R 2.14.0) has been
      removed.

    • The unused fontsmooth argument has been removed from the quartz()
      device.

    • All the (non-API) EISPACK entry points in R have been removed.

    • chol(pivot = TRUE, LINPACK = TRUE) is deprecated.

    • The long-deprecated use of \synopsis in the Usage section of .Rd
      files will be removed in R 3.1.0.

    • .find.package() and .path.package() are deprecated: only the
      public versions without the dot have ever been in the API.

    • In a package's DESCRIPTION file,

          License: X11
      
      is deprecated, since it includes ‘Copyright (C) 1996 X
      Consortium’ which cannot be appropriate for a current R package.
      Use ‘MIT’ or ‘BSD_2_clause’ instead.

  CODE MIGRATION:

    • The C code underlying base graphics has been migrated to the
      graphics package (and hence no longer uses .Internal() calls).

    • Most of the .Internal() calls used in the stats package have been
      migrated to C code in that package.

      This means that a number of .Internal() calls which have been
      used by packages no longer exist, including .Internal(cor)
      .Internal(cov), .Internal(optimhess) and
      .Internal(update.formula).

    • Some .External() calls to the base package (really to the R
      executable or shared library) have been moved to more appropriate
      packages.  Packages should not have been using such calls, but
      some did (mainly those used by integrate()).

  PACKAGE parallel:

    • There is a new function mcaffinity() which allows getting or
      setting the CPU affinity mask for the current R process on
      systems that supports this (currently only Linux has been tested
      successfully).  It has no effect on systems which do not support
      process affinity.  Users are not expected to use this function
      directly (with the exception of fixing libraries that break
      affinity settings like OpenBLAS) - the function is rather
      intended to support affinity control in high-level parallel
      functions.  In the future, R may supplement lack of affinity
      control in the OS by its own bookkeeping _via_ mcaffinity()
      related to processes and threads it spawns.

    • mcparallel() has a new argument mc.affinity which attempts to set
      the affinity of the child process according to the specification
      contained therein.

    • The port used by socket clusters is chosen randomly: this should
      help to avoid clashes observed when two users of a multi-user
      machine try to create a cluster at the same time.  To reproduce
      the previous behaviour set environment variable R_PARALLEL_PORT
      to 10187.

  C-LEVEL FACILITIES:

    • There has been some minor re-organization of the non-API header
      files.  In particular, Rinternals.h no longer includes the
      non-API header R_exts/PrtUtil.h, and that no longer includes
      R_exts/Print.h.

    • Passing NULL to .C() is now an error.

    • .C() and .Fortran() now warn if "single" arguments are used with
      DUP = FALSE, as changes to such arguments are not returned to the
      caller.

    • C entry points R_qsort and R_qsort_I now have start and end as
      size_t to allow them to work with longer vectors on 64-bit
      platforms.  Code using them should be recompiled.

    • A few recently added C entry points were missing the remapping to
      Rf_, notably [dpq]nbinom_mu.

    • Some of the interface pointers formerly available only to R.app
      are now available to front-ends on all Unix-alikes: one has been
      added for the interface to View().

    • PACKAGE = "" is now an error in .C() etc calls: it was always
      contrary to the documentation.

    • Entry point rcont2 has been migrated to package stats and so is
      no longer available.

    • R_SVN_REVISION in Rversion.h is now an integer (rather than a
      string) and hence usable as e.g.  #if R_SVN_REVISION < 70000.

    • The entry points rgb2hsv and hsv2rgb have been migrated to
      package grDevices and so are no longer available.

    • R_GE_version has been increased to 10 and name2col removed (use
      R_GE_str2col instead).  R internal colour codes are now defined
      using the typedef rcolor.

    • The REPROTECT macro now checks that the protect index is valid.

    • Several non-API entry points no longer used by R have been
      removed, including the Fortran entry points chol, chol2inv, cg,
      ch and rg, and the C entry points Brent_fmin, fft_factor and
      fft_work.

    • If a .External call is registered with a number of arguments
      (other than -1), the number of arguments passed is checked for
      each call (as for other foreign function calls).

    • It is now possible to write custom connection implementations
      outside core R using R_ext/Connections.h.  Please note that the
      implementation of connections is still considered internal and
      may change in the future (see the above file for details).

  INTERNATIONALIZATION:

    • The management of translations has been converted to R code: see
      ?tools::update_pkg_po.

    • The translations for the R interpreter and RGui.exe are now part
      of the base package (rather than having sources in directory po
      and being installed to share/locale).  Thus the base package
      supports three translation domains, R-base, R and RGui.

    • The compiled translations which ship with R are all installed to
      the new package translations for easier updating.  The first
      package of that name found on .libPaths() at the start of the R
      session will be used.  (It is possible messages will be used
      before .libPaths() is set up in which case the default
      translations will be used: set environment variable
      R_TRANSLATIONS to point to the location of the intended
      translations package to use this right from the start.)

    • The translations form a separate group in the Windows installer,
      so can be omitted if desired.

    • The markup for many messages has been changed to make them easier
      to translate, incorporating suggestions from Łukasz Daniel.

  INSTALLATION:

    • There is again support for building without using the C ‘long
      double’ type.  This is required by C99, but system
      implementations can be slow or flawed.  Use configure option
      --disable-long-double.

    • make pdf and make install-pdf now make and install the full
      reference index (including all base and recommended packages).

    • The 'reference manual' on the Windows GUI menu and included in
      the installer is now the full reference index, including all base
      and recommended packages.

    • R help pages and manuals have no ISBNs because ISBN rules no
      longer allow constantly changing content to be assigned an ISBN.

    • The Windows installer no longer installs a Start Menu link to the
      static help pages; as most pages are generated dynamically, this
      led to a lot of broken links.

    • Any custom settings for Java configuration are recorded in file
      etc/javaconf for subsequent use by R CMD javareconf.

    • There is now support for makeinfo version 5.0 (which requires a
      slightly different .texi syntax).

    • The minimum versions for --use-system-zlib and --use-system-pcre
      are now tested as 1.2.5 and 8.10 respectively.

    • On Windows, the stack size is reduced to 16MB on 32-bit systems:
      misguided users were launching many threads without controlling
      the stack size.

    • configure no longer looks for file ~/.Rconfig: ~/.R/config has
      long been preferred.

  BUG FIXES:

    • When R CMD build is run in an encoding other than the one
      specified in the package's DESCRIPTION file it tries harder to
      expand the authors@R field in the specified encoding.  (PR#14958)

    • If R CMD INSTALL is required to expand the authors@R field of the
      DESCRIPTION file, it tries harder to do so in the encoding
      specified for the package (rather than using ASCII escapes).

    • Fix in package grid for pushing a viewport into a layout cell,
      where the layout is within a viewport that has zero physical
      width OR where the layout has zero total relative width (likewise
      for height).  The layout column widths (or row heights) in this
      case were being calculated with non-finite values.  (Reported by
      Winston Chang.)

    • solve(A, b) for a vector b gave the answer names from colnames(A)
      for LINPACK = TRUE but not in the default case.

    • La.svd() accepts logical matrices (as documented, and as svd()
      did).

    • legend() now accepts negative pch values, in the same way
      points() long has.

    • Parse errors when installing files now correctly display the name
      of the file containing the bad code.

    • In Windows, tcltk windows were not always properly constructed.
      (PR#15150)

    • The internal functions implementing parse(), tools::parseLatex()
      and tools::parse_Rd() were not reentrant, leading to errors in
      rare circumstances such as a garbage collection triggering a
      recursive call.

    • Field assignments in reference class objects _via_ $<- were not
      being checked because the magic incantation to turn methods on
      for that primitive operator had been inadvertently omitted.

    • setHook(hookname, value, action="replace") set the hook to be the
      value, rather than a list containing the value as documented.
      (PR#15167)

    • If a package used a NEWS.Rd file, the main HTML package index
      page did not link to it.  (Reported by Dirk Eddelbuettel.)

    • The primitive implementation of @<- was not checking the class of
      the replacement.  It now does a check, quicker but less general
      than slot<-. See the help.

    • split(x, f) now recycles classed objects x in the same way as
      vectors.  (Reported by Martin Morgan.)

    • pbeta(.28, 1/2, 2200, lower.tail=FALSE, log.p=TRUE) is no longer
      -Inf; ditto for corresponding pt() and pf() calls, such as pt(45,
      df=5000, lower.tail=FALSE, log.p=TRUE). (PR#15162)

    • The Windows graphics device would crash R if a user attempted to
      load the graphics history from a variable that was not a saved
      history. (PR#15230)

    • The workspace size for the predict() method for loess() could
      exceed the maximum integer size.  (Reported by Hiroyuki
      Kawakatsu.)

    • ftable(x, row.vars, col.vars) now also works when the *.vars
      arguments are (integer or character vectors) of length zero.

    • Calling cat() on a malformed UTF-8 string could cause the Windows
      GUI to lock up. (PR#15227)

    • removeClass(cc) gave "node stack overflow" for some class
      definitions containing "array" or "matrix".

CHANGES in previous versions:

  • Older news can be found in text format in files NEWS.0, NEWS.1 and
    NEWS.2 in the doc directory.  News in HTML format for R versions
    from 2.10.0 to 2.15.3 is in doc/html/NEWS.2.html.

