R 2.9.0 is released

Peter Dalgaard P.Dalgaard at biostat.ku.dk
Mon Oct 26 16:20:58 CET 2009

I've rolled up R-2.10.0.tar.gz some hours ago. This is a development
release which contains a number of new features, notably a brand new
HTML based dynamic help system.

Also, a number of mostly minor bugs have been fixed. See the full list
of changes below.

You can get it from


or wait for it to be mirrored at a CRAN site nearer to you.

Binaries for various platforms will appear in due course.

        For the R Core Team

        Peter Dalgaard

These are the md5sums for the freshly created files, in case you wish
to check that they are uncorrupted:

70447ae7f2c35233d3065b004aa4f331  INSTALL
433182754c05c2cf7a04ad0da474a1d0  README
4f004de59e24a52d0f500063b4603bcb  OONEWS
ff4bd9073ef440b1eb43b1428ce96872  ONEWS
b80eafe743ef130e129c6d004793492f  NEWS
7abcbbc7480df75a11a00bb09783db90  THANKS
070cca21d9f8a6af15f992edb47a24d5  AUTHORS
a6f89e2100d9b6cdffcea4f398e37343  COPYING.LIB
eb723b61539feef013de476e68b5c50a  COPYING
020479f381d5f9038dcb18708997f5da  RESOURCES
9ec5df24a0d6ecb04a9817275b825027  FAQ
4486934883b1dbcd5400135e22b26a75  R-2.10.0.tar.gz
4486934883b1dbcd5400135e22b26a75  R-latest.tar.gz

This is the relevant part of the NEWS file:

                CHANGES IN R VERSION 2.10.0


    o   Package help is now converted from Rd by the R-based converters
        that were first introduced in 2.9.0.  This means

        - Packages that were installed by R-devel after 2009-08-09
          should not be used with earlier versions of R, and most
          aspects of package help (including the runnable examples)
          will be missing if they are so used.

        - Text, HTML and latex help and examples for packages
          installed under the new system are converted on-demand from
          stored parsed Rd files.  (Conversions stored in packages
          installed under R < 2.10.0 are used if no parsed Rd files
          are found.  It is recommended that such packages be

    o   HTML help is now generated dynamically using an HTTP server
        running in the R process and listening on the loopback

        - Those worried about security implications of such a server
          can disable it by setting the environment variable
          R_DISABLE_HTTPD to a non-empty value.  This disables
          help.start() and HTML help (so text help is shown instead).

        - The Java/Javascript search engine has been replaced by an
          HTML interface to help.search().  help.start() no longer has
          an argument 'searchEngine' as it is no longer needed.

        - The HTML help can now locate cross-references of the form
          \link[pkg]{foo} and \link[pkg:foo]{bar} where 'foo' is an
          alias in the package, rather than the documented (basename
          of a) filename (since the documentation has been much


    o   polygon(), pdf() and postscript() now have a parameter
        'fillOddEven' (default FALSE), which controls the mode used for
        polygon fills of self-intersecting shapes.

    o   New debugonce() function; further,
        getOption("deparse.max.lines") is now observed when debugging,
        from a code suggestion by John Brzustowski.  (PR#13647/8)

    o   plot() methods for "stepfun" and hence "ecdf" no longer plot
        points by default for n >= 1000.

    o   [g]sub(*, perl=TRUE) now also supports '\E' in order to *end*
        \U and \L case changes, thanks to a patch from Bill Dunlap.

    o   factor(), `levels<-`(), etc, now ensure that the resulting factor
        levels are unique (as was always the implied intention).  Factors
        with duplicated levels are still constructible by low-level means,
        but are now declared illegal.

    o   New print() (S3) method for class "function", also used for
        auto-printing.  Further, .Primitive functions now print and
        auto-print identically.  The new method is based on code
        suggestions by Romain François.

    o   The print() and toLatex() methods for class "sessionInfo" now
        show the locale in a nicer format and have arguments to
        suppress locale information.

    o   In addition to previously only round(), there are other 'Math'
        group (S3) methods for 'difftime', such as floor(), signif(),
        abs(), etc.

    o   For completeness, old.packages() and available.packages() allow
        'type' to be specified (you could always specify 'available'
        or 'contriburl').

    o   available.packages() by default only returns information on
        the latest versions of packages whose version requirements are
        satisified by the currently running R.

    o   tools::write_PACKAGES() has a new argument 'latestOnly', which
        defaults to TRUE when only the latest versions in the
        repository will be listed in the index.

    o   getOption() has a new argument 'default' that is returned if
        the specified option is not set. This simplifies querying a
        value and checking whether it is NULL or not.

    o   parse() now warns if the requested encoding is not supported.

    o   The "table" method of as.data.frame() gains a 'stringsAsFactors'
        argument to allow the classifying factors to be returned as
        character vectors rather than the default factor type.

    o   If model.frame.default() encounters a character variable where
        'xlev' indicates a factor, it now converts the variable to a
        factor (with a warning).

    o   curve() now returns a list containing the points that were drawn.

    o   spineplot() now accepts axes = FALSE, for consistency with
        other functions called by plot.factor().

    o   The Kendall and Spearman methods of cor.test() can optionally
        use continuity correction when not computing exact p-values.
        (The Kendall case is the wish of PR#13691.)

    o   R now keeps track of line numbers during execution for
        code sourced with options(keep.source = TRUE).  The source
        reference is displayed by debugging functions such as traceback(),
        browser(), recover(), and dump.frames(), and is stored as an
        attribute on each element returned by sys.calls(). [Experimental]

    o   More functions now have an implicit (S4) generic definition.

    o   quantile.default() now disallows factors (wish of PR#13631)
        and its help documents what numeric-like properties its input
        need to have to work correctly.

    o   weighted.mean() is now generic and has "Date", "POSIXct" and
        "POSIXlt" methods.

    o   Naming subscripts (e.g. x[i=1, j=2]) in data.frame methods for
        [ and [[ now gives a warning.  (Names are ignored in the
        default method, but could have odd semantics for other
        methods, and do for the data.frame ones.)

    o   as.data.frame() has an "aovproj" method.  (Wish of PR#13505)

    o   as.character(x) for numeric x no longer produces strings such as
        "0.30", i.e., with trailing zeros.  This change also renders
        levels construction in factor() more consistent.

    o   codocClasses(), which checks consistency of the documentation of
        S4 class slots, now does so in considerably more cases.  The
        documentation of inherited slots (from superclasses) is now
        optional.  This affects 'R CMD check <pkg>' when the package
        defines S4 classes.

    o   codoc() now also checks S4 methods for code/documentation

    o   for(), while(), and repeat() loops  now always return NULL as
        their (invisible) value.  This change was needed to address a
        reference counting bug without creating performance penalties
        for some common use cases.

    o   The print() method for ls.str() results now obeys an optional
        'digits' argument.

    o   The 'method' argument of glm() now allows user-contributed methods.

    o   More general reorder.default() replaces functionality of
        reorder.factor() and reorder.character().

    o   The function aspell() has been added to provide an interface to
        the Aspell spell-checker.

    o   Filters RdTextFilter() and SweaveTeXFilter() have been added
        to the tools package to provide support for aspell() or other
        spell checkers.

    o   xtabs() with the new option 'sparse = TRUE' now returns a sparse
        Matrix, using package 'Matrix'.

    o   contr.sum() etc gain an argument 'sparse' which allows sparse
        matrices to be returned.

        contrasts() also gains a 'sparse' argument which it passes to the
        actual contrast function if that has a formal argument 'sparse'.

        'contrasts(f, .) <- val' now also works when 'val' is a sparse
        Matrix.  It is planned that model.matrix() will work with such
        factors 'f' in the future.

    o   readNEWS() will recognize a UTF-8 byte-order mark (BOM) in the
        NEWS file. However, it is safer to use only ASCII code there
        because not all editors recognize BOMs.

    o   New utility function inheritedSlotNames() for S4 class programming.

    o   tabulate() now allows NAs to pass through (and be ignored).

    o   If debug() is called on an S3 generic function then all methods
        are debugged as well.

    o   Outlier symbols drawn by boxplot() now obey the 'outlwd'
        argument.  Reported by Jurgen Kluge.

    o   svd(x) and eigen(x) now behave analogously to qr(x) in
        accepting logical matrices x.

    o   File NEWS is now in UTF-8, and has a BOM (often invisible) on
        the first line, and Emacs local variables set for UTF-8 at the
        end.  RShowDoc("NEWS") should display this correctly, given
        suitable fonts.

    o   terms.formula(simplify = TRUE) now does not deparse the LHS and
        so preserves non-standard responses such as `a: b` (requested
        by Sundar Dorai-Raj).

    o   New function news() for building and querying R or package news

    o   z^n for integer n and complex z is more accurate now if
        |n| <= 65536.

    o   factor(NULL) now returns the same as factor(character(0))
        instead of an error, and table(NULL) consequently does

    o   as.data.frame.vector() (and its copies) is slightly faster
        by avoiding a copy if there are no names (following a
        suggestion of Tim Hesterberg).

    o   writeLines(), writeBin() and writeChar() have a new argument
        'useBytes'.  If false, character strings with marked encodings
        are translated to the current locale (as before) but if true
        they are written byte-by-byte.

    o   iconv() has a new argument 'mark' which can be used (by
        experts) to suppress the declaration of encodings.

    o   DESCRIPTION 'LinkingTo' specs are now recognized as installation
        dependencies, and included in package management computations.

    o   Standardized DESCRIPTION 'License' specs are now available for
        package management computations.

    o   "\uxxxx" and "\Uxxxxxxxx" escapes can now be parsed to a UTF-8
        encoded string even in non-UTF-8 locales (this has been
        implemented on Windows since R 2.7.0).  The semantics have
        been changed slightly: a string containing such escapes is
        always stored in UTF-8 (and hence is suitable for portably
        including Unicode text in packages).

    o   New as.raw() method for "tclObj" objects (wish of PR#13578).

    o   Rd.sty now makes a better job of setting email addresses,
        including using a monospaced font.

    o   textConnection() gains an 'encoding' argument to determine how
        input strings with marked encodings will be handled.

    o   R CMD Rd2pdf is available as a shortcut for R CMD Rd2dvi --pdf.

    o   R CMD check now checks links where a package is specified
        (\link[pkg]{file} or \link[pkg:file]{topic}), if the package
        is available.  It notes if the package is not available, as in
        many cases this is an error in the link.

    o   identical() gains three logical arguments, which allow for even
        more differentiation, notably '-0' and '0'.

    o   legend() now can specify the 'border' color of filled boxes,
        thanks to a patch from Frederic Schutz.

    o   Indexing with a vector index to [[]] has now been extended to
        all recursive types.

    o   Pairlists may now be assigned as elements of lists.  (Lists
        could always be created with pairlist elements, but [[<-
        didn't support assigning them.)

    o   The parser now supports C-preprocessor-like #line directives,
        so error messages and source references may refer to the original
        file rather than an intermediate one.

    o   New functions findLineNum() and setBreakpoint() work with the
        source references to find the location of source lines and set
        breakpoints (using trace()) at those lines.

    o   Namespace importing is more careful about warning on masked
        generics, thanks to a patch by Yohan Chalabi.

    o   detach() now has an argument 'character.only' with the same
        meaning as for library() or require().

    o   available.packages() gains a 'filters' argument for specifying
        the filtering operations performed on the packages found in the
        repositories.  A new built-in 'license/FOSS' filter only
        retains packages for which installation can proceed solely based
        on packages which can be verified as Free or Open Source
        Software (FOSS) employing the available license specifications.

    o   In registering an S3 class by a call to setOldClass(), the data
        part (e.g., the object type) required for the class can be
        included as one of the superclasses in the Classes argument.

    o   The argument 'f' to showMethods() can be an expression evaluating
        to a generic function, allowing methods to be shown for
        non-exported generics and other nonstandard cases.

    o   sprintf() now supports '%o' for octal conversions.

    o   New function Sys.readlink() for information about symbolic
        links, including if a file is a symbolic link.

    o   Package 'tools' has new functions checkRdaFiles() and
        resaveRdaFiles() to report on the format of .rda/.RData data
        files, and to re-save them in a different compressed format,
        including choosing the most compact format available.

        A new INSTALL option, --resave-data, makes use of this.

    o   File ~/.R/config is used in preference to ~/.Rconfig, and
        these are now documented in 'R Installation and Administration'.

    o   Logic operations with complex numbers now work, as they were always
        documented to, and as in S.

    o   arrows() and segments() allow one of x1 or y1 to be omitted to
        simplify the specification of vertical or horizontal lines
        (suggestion of Tim Hesterberg).

    o   approxfun() is faster by avoiding repeated NA checks (diagnosis
        and patch by Karline Soetaert & Thomas Petzoldt).

    o   There are the beginnings of a Nynorsk translation by Karl Ove

    o   stripchart() allows par 'bg' to be passed in for the
        background colour for pch = 21 (wish of PR#13984).

    o   New generic function .DollarNames() to enable class authors
        to customize completion after the $ extractor.

    o   load(), save(), dput() and dump() now open a not-yet-open
        connection in the appropriate mode (as other functions using
        connections directly already did).


    o   A different regular expression engine is used for basic and
        extended regexps and is also for approximate matching.  This is
        based on the TRE library of Ville Laurikari, a modifed copy of
        which is included in the R sources.

        This is often faster, especially in a MBCS locale.

        Some known differences are that it is less tolerant of invalid
        inputs in MBCS locales, and in its interpretation of undefined
        (extended) regexps such as "^*".  Also, the interpretation of
        ranges such as [W-z] in caseless matching is no longer to map
        the range to lower case.

        This engine may in future be used in 'literal' mode for fixed
        = TRUE, and there is a compile-time option in src/main/grep.c
        to do so.

    o   The use of repeated boundary regexps in gsub() and gregexpr() as
        warned about in the help page does not work in this engine (it
        did in the previous one since 2005).

    o   Extended (and basic) regexps now support same set of options as
        for fixed = TRUE and perl = TRUE, including 'useBytes' and
        support for UTF-8-encoded strings in non-UTF-8 locales.

    o   agrep() now has full support for MBCS locales with a modest
        speed penalty.  This enables help.search() to use approximate
        matching character-wise rather than byte-wise.

    o   [g]sub use a single-pass algorithm instead of matching twice
        and so is usually faster.

    o   The perl = TRUE versions now work correctly in a non-UTF-8 MBCS
        locale, by translating the inputs to UTF-8.

    o   useBytes = TRUE now inhibits the translation of inputs with
        marked encodings.

    o   strsplit() gains a 'useBytes' argument.

    o   The algorithm used by strsplit() has been reordered to batch by
        elements of 'split': this can be much faster for fixed = FALSE
        (as multiple compilation of regexps is avoided).

    o   The help pages, including ?regexp, have been updated and
        should be consulted for details of the new implementations.


    o   A new dynamic HTML help system is used by default, and may be
        controlled using tools::startDynamicHelp().  With this enabled,
        HTML help pages will be generated on request, resolving links
        by searching through the current .libPaths().  The user
        may set option("help.ports") to control which IP port is used
        by the server.

    o   help.start() no longer sets options(htmlhelp = TRUE) (it used
        to on Unix but not on Windows).  Nor does it on Unix reset the
        "browser" option if given an argument of that name.

        Arguments 'update' and 'remote' are now available on all
        platforms: the default is update = FALSE since the http server
        will update the package index at first use.

    o   help() has a new argument 'help_type' (with default set by the
        option of that name) to supersede 'offline', 'htmlhelp' and
        'chmhelp' (although for now they still work if 'help_type' is
        unset).  There is a new type, "PDF" to allow offline PDF
        (rather than PostScript).

        A function offline_help_helper() will be used if this exists
        in the workspace or further down the search path, otherwise
        the function of that name in the 'utils' name space is used.

    o   Plain text help is now used as the fallback for HTML help (as
        it always was for Compiled HTML help on Windows).

    o   It is possible to ask for static HTML pages to be prebuilt via
        the configure option --enable-prebuilt-html.  This may be
        useful for those who wish to make HTML help available outside
        R, e.g. on a local web site.

    o   An experimental tag \Sexpr has been added to Rd files, to
        evaluate expressions at build, install, or render time.
        Currently install time and render time evaluation are

    o   Tags \if, \ifelse and \out have been added to allow
        format-specific (or more general, using \Sexpr) conditional
        text in man pages.

    o   The parse_Rd() parser has been made more tolerant of coding
        errors in Rd files:  now all syntax errors are reported as
        warnings, and an attempt is made to continue parsing.

    o   parse_Rd() now has an argument 'fragment' (default FALSE) to
        accept small fragments of Rd files (so that \Sexpr can output
        Rd code which is then parsed).

    o   parse_Rd() now always converts its input to UTF-8.  The Rd2*
        rendering functions have a new parameter, 'outputEncoding',
        which controls how their output is encoded.

    o   parse_Rd() no longer includes the newline as part of a
        "%"-style comment.

    o   There have been various bug fixes and code reorganization in
        the Rd renderers Rd2HTML, Rd2latex, Rd2txt, and Rd2ex.

        All example files are now created with either ASCII or UTF-8
        encoding, and the encoding is only marked in the file if there
        is any non-UTF-8 code (previously it was marked if the help
        file had non-ASCII contents, possibly in other sections).

    o   print.Rd() now adds necessary escape characters so that
        printing and re-parsing an Rd object should produce an
        equivalent object.

    o   parse_Rd() was incorrectly handling multiple backslashes in
        R code strings, converting 4n+3 backslashes to 2n+1 instead
        of 2n+2.

    o   parse_Rd() now recognizes the \var tag within a quoted string
        in R-like text.

    o   parse_Rd() now treats the argument of \command as LaTeX-like,
        rather than verbatim.


    o   New function untar() to list or unpack tar archives, possibly
        compressed.  This uses either an external 'tar' command or an
        internal implementation.

    o   New function tar() to create (possibly compressed) tar archives.

    o   New functions memCompress() and memDecompress() for in-memory
        compression and decompression.

    o   bzfile() has a 'compress' argument to select the amount of
        effort put into compression when writing.

    o   New function xzfile() for use with xz-compressed files.  (This
        can also read files compressed by some versions of 'lzma'.)

    o   gzfile() looks at the file header and so can now also read
        bzip2-ed files and xz-compressed files.

    o   There are the new options of save(compress = "bzip2") and "xz"
        to use bzip2 or xz compression (which will be slower, but can
        give substantially smaller files).  Argument compression_level
        gives finer control over the space/time tradeoffs.

        load() can read such saves (but only as from this version of R).

    o   R CMD INSTALL/check and tools::writePACKAGES accept a wider
        range of compressed tar archives.  Precisely how wide depends
        on the capabilities of the host system's 'tar' command: they
        almost always include .tar.bz2 archives, and with modern
        versions of 'tar' other forms of compression such as lzma and
        xz, and arbitrary extensions.

    o   R CMD INSTALL has a new option --data-compress to control the
        compression used when lazy-loading data.  New possibilities are
        --data-compress=bzip2 which will give ca 15% better
        compression at the expense of slower installation times, and
        --data-compress=xz, often giving even better compression on
        large datasets at the expense of much longer installation
        times.  (The latter is used for the recommended packages: it is
        particularly effective for 'survival'.)

    o   file() for open = "", "r" or "rt" will automagically detect
        compressed files (from gzip, bzip2 or xz).  This means that
        compressed files can be specified by file name (rather than
        via a gzfile() connection) to read.table(), readlines(),
        scan() and so on.

    o   data() can handle compressed text files with extensions
        .{txt,tab,csv}.{gz,bz2,xz} .


    o   png(type="cairo1") is defunct: the value is no longer recognized.

    o   tools::Rd_parse() is defunct (as this version of R uses only
        Rd version 2).

    o   Use of ~/.Rconf (which was deprecated in favour of ~/.Rconfig
        in 2004) has finally been removed.

    o   Bundles of packages are deprecated.  See 'Writing R
        Extensions' for the steps needed to unbundle a bundle.

    o   help() arguments 'offline', 'htmlhelp' and 'chmhelp' are
        deprecated in favour of 'help_type'.

    o   clearNames() ('stats') is deprecated for unname().

    o   Basic regular expressions (extended = FALSE) are deprecated in
        strsplit, grep and friends.  There is a precise POSIX standard
        for them, but it is not what recent RE engines implement, and
        it seems that in almost all cases package authors intended
        fixed = TRUE when using extended = FALSE.

    o   methods::trySilent() is deprecated for  try(*, silent=TRUE) or
        - more efficiently and flexibly - something like
        tryCatch(*, error = function(e) e).

    o   index.search() is deprecated: there are no longer directories of
        types other than 'help'.


    o   cairo >= 1.2 is now required (1.2.0 was released in July 2006)
        for cairo-based graphics devices (which remain optional).

    o   A suitable iconv() is now required: support for configure option
        --without-iconv has been withdrawn (it was deprecated in R 2.5.0).

    o   Perl is no longer 'essential'.  R can be built without it, but
        scripts R CMD build, check, Rprof and Sd2d require it.

    o   A system 'glob' function is now essential (a working
        Sys.glob() has been assumed since R 2.9.0 at least).

    o   C99 support for MBCS is now required, and configure option
        --disable-mbcs has been withdrawn.

    o   Having a version of 'tar' capable of automagically detecting
        compressed archives is useful for utils::untar(), and so 'gtar'
        (a common name for GNU tar) is preferred to 'tar': set
        environment variable TAR to specify a particular 'tar' command.


    o   There is some makefile support for adding/updating translations
        in packages: see po/README and 'Writing R Extensions'.

        There is support for the use of 'dngettext' for C-level
        translations in packages: see 'Writing R Extensions'.


    o   Assigning an extra 0-length column to a data frame by
        DF[, "foo"] <- value now works in most cases (by filling with
        NAs) or fails.  (It used to give a corrupt data frame.)

    o   validObject() avoids an error during evaluation in the case
        of various incorrect slot definitions.

    o   n:m now returns a result of type "integer" in a few more
        boundary cases.

    o   The 'zap.ind' argument to printCoefmat() did not usually work as
        other code attempted to ensure that non-zero values had a
        non-zero representation.

    o   printCoefmat() formatted groups of columns together, not just
        the cs.ind group but also the zap.ind group and a residual
        group.  It now formats all columns except the cs.ind group
        separately (and zaps the zap.ind group column-by-column).  The
        main effect will be see in the output from print.anova, as
        this grouped SS-like columns in the zap.ind group.

    o   R_ReplDLLinit() initializes the top-level jump so that some
        embedded applications on Windows no longer crash on error.

    o   identical() failed to take the encoding of character strings
        into account, so identical byte patterns are not necessarily
        identical strings, and similarly Latin-1 and UTF-8 versions of
        the same string differ in byte pattern.

    o   methods(f) used to warn unnecessarily for an S4 generic 'f' which
        had been created based on an existing S3 generic.

    o   The check for consistent ordering of superclasses was not
        ignoring all conditional relations (the symptom was usually
        spurious warnings for classes extending "array").

    o   Trying to assign into a raw vector with an index vector
        containing NAs could cause a segfault.  Reported by Hervé Pagès.

    o   Rscript could segfault if (by user error) its filename argument
        was missing.  Reported by Martin Morgan.

    o   getAnywhere() (and functions that use it, including argument
        completion in the console) did not handle special built-in
        functions.  Reported by Romain Francois.

    o   order() was missing a PROTECT() call and so could segfault when
        called on character data under certain (rare) circumstances
        involving marked non-native encodings.

    o   prettyNum(z, drop0trailing=TRUE) did not work correctly when z
        was a complex vector.  Consequently, str(z, ...)  also did
        not.  (PR#13985)

    o   'make distclean' removed too many files in etc/ if
        builddir = srcdir.

    o   R CMD replaced TEXINPUTS rather than appending to it (as
        documented and intended).

    o   help.start() no longer fails on unix when "browser" is a

    o   pbeta(x, *, log.p = TRUE) is sometimes more accurate, e.g., for
        very small x.

    o   Unserializing a pre-2.8 workspace containing pure ASCII character
        objects with a LATIN1 or UTF-8 encoding would corrupt the CHARSXP

   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907

More information about the R-announce mailing list