Abstract
The ‘Changes in R’ article from the 2018-1 issue.CHANGES IN R 3.5.0 patched
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
.Call and similar).NEW FEATURES
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 + \mu 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.)