The ‘Changes in R’ article from the 2016-1 issue.
CHANGES IN R 3.3.1 patched
NEW FEATURES
extSoftVersion()
now reports the version (if any) of the
readline
library in use.
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.
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.
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.
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, 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 a class name matches multiple classes in the 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
0
s 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).
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 NA
s or NaN
s.
(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 NA
s
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 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#16640)
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
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 API now includes a function R_GetConnection()
which allows packages implementing connections to convert R
connection
objects to Rconnection
handles used in the API. Code
which previously used the low-level R-internal getConnection()
entry point should switch to the official API.
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)
This article is converted from a Legacy LaTeX article using the texor package. The pdf version is the official version. To report a problem with the html, refer to CONTRIBUTE on the R Journal homepage.
Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".
For attribution, please cite this work as
Team, "Changes in R", The R Journal, 2016
BibTeX citation
@article{RJ-2016-1-r-changes, author = {Team, The R Core}, title = {Changes in R}, journal = {The R Journal}, year = {2016}, note = {https://rjournal.github.io/}, volume = {8}, issue = {1}, issn = {2073-4859}, pages = {406-415} }