This blog is updated daily.
A general description is here.
‘methods’' internal ‘.requirePackage()’ now re-enables primitive method dispatch when needed; thanks to Ivan Krylov for demystifying CRAN package check failures on the R*devel mailing lists.
‘R CMD check’ now reports more warnings on long-deprecated/obsolete Fortran features from ‘gfortran -Wall’. For hints on how to modernize these, see <https://fortranwiki.org/fortran/show/Modernizing+Old+Fortran>.
Added function ‘sha256sum()’ in package ‘tools’ analogous to ‘md5sum()’ implementing the SHA-256 hashing algorithm.
Added ‘sha256sum()’ analogous to ‘md5sum()’, but implementing the SHA-256 hashing algorithm.
‘md5sum()’ can be used to compute an MD5 hash of a raw vector of bytes by using the ‘bytes=’ argument instead of ‘files=’. The two arguments are mutually exclusive.
‘as(*, "raw")’ now works as documented, thanks to Mikael Jagan's PR#18795.
Informational messages of e.g., ‘print(1:1e4, max=1000)’, now correctly mention ‘max’ in addition to ‘getOption("max.print")’.
Failures in building the manuals under ‘doc’ now abort the installation, removing any file which caused the failure.
The deprecated S-compatibility macros ‘F77_COM’ and ‘F77_COMDECL’ have been removed from header ‘R_ext/RS.h’.
‘xyTable()’ now handles and reports ‘NA’s fixing PR#18654. Thanks to Heather Turner and Zhian Kamvar for report and patch.
The S-compatibility macros ‘F77_COM’ and ‘F77_COMDECL’ defined in header ‘R_ext/RS.h’ are deprecated and will be removed shortly. We could find no record of their use.
Failures in building the manuals under ‘doc’ now abort the installation, removing sny file which caused the failure.
The set operations now avoid the ‘as.vector()’ transformation for same-kind apparently vector-like operands.
‘get(nam, env)’ now signals a _classed_ error, ‘"getMissingError"’, as “subclass” of ‘"missingArgError"’ where the latter is used also in similar situations, e.g., ‘f <- function(x) exp(x); try(f())’ .
‘get(nam, env)’ now signals a _classed_ error (‘"getMissingError"’)
Printing ‘ls.str()’ now shows ‘"<missing>"’ even when R's language setting is not English.
‘Sys.setLanguage()’ now works in an ‘LC_ALL=C R’ session on some platforms, warns about _some_ failures to change the language and gets an option related to these warning messages.
‘pnorm(x)’ underflows more gracefully.
‘Sys.setLanguage()’ now works in an ‘LC_ALL=C R’ session on some platforms.
Printing ‘ls.str()’ now tries harder to show ‘"<missing>"’ even when R's language setting is not English.
‘stem()’ formats correctly also in cases where rounding up, e.g., from 9.96 to 10 needs more digits; thanks to Ella Kaye and Kelly Bodwin, fixing PR#8934 during ‘R Dev Day’ at useR!2024.
Additionally, ‘stem(x)’ now works normally also when ‘length(x) == 1’.
Package ‘tools’ now exports functions ‘base_aliases_db()’ and ‘base_rdxrefs_db()’.
Package ‘tools’ now exports functions ‘CRAN_current_db()’, ‘CRAN_aliases_db()’, ‘CRAN_rdxrefs_db()’, ‘CRAN_archive_db()’, and ‘CRAN_authors_db()’.
‘findInterval()’ gets new options ‘checkSorted’ and ‘checkNA’ which allow to skip relatively costly checks; related to PR#16567.
The legecy definition of ‘PI’ in ‘R_ext/Constants.h’ (included by
‘R.h’) will be removeed shortly: use ‘M_PI’ instead.
It is intended that ‘STRICT_R_HEADERS’ will become the default prior to release. This will remove the legacy definitions of ‘PI’, ‘Calloc’, ‘Realloc’ and ‘Free’: use ‘M_PI’, ‘R_Calloc’, ‘R_Realloc’ or ‘R_Free’ instead.
The set of LAPACK (double and complex) routines in API headers ‘R_ext/Lapack.h’ and ‘R_ext/Applic.h’ has been extended, mostly to routines actually in use from packages.
It is now possible to set the background color for row and column names in the data editor on Windows (‘Rgui’).
‘Rterm’ on Windows now accepts input lines of unlimited length.
‘file.info()’ on Windows now provides file owner name and domain.
‘Sys.info()’ on Windows now provides current user domain.
Installation will define ‘STRICT_R_HEADERS’ if environment variable ‘_R_USE_STRICT_R_HEADERS_’ is set to a true value: this is done by ‘R CMD check --as-cran’.
Header ‘R_ext/Constants.h’ (included by ‘R.h’) now includes header ‘float.h’ or ‘cfloat’ for constants such as ‘DBL_MAX’ even if ‘STRICT_R_HEADERS’ is defined.
The legecy definition of ‘PI’ in ‘R_ext/Constants.h’ (included by ‘R.h’) will be removeed shortly: use ‘M_PI’ instead.
The set of Lapack (double and complex) routines in API headers ‘R_ext/Lapack.h’ and ‘R_ext/Applic.h’ has been extended, mostly to routines actually in use from packages.
Package ‘tools’ now exports functions ‘R()’ and ‘parse_URI_reference()’.
Package ‘tools’ now exports functions ‘CRAN_current_db()’, ‘CRAN_aliases_db()’, ‘CRAN_rdxrefs_db()’, and ‘CRAN_archive_db()’.
‘grDevices::glyphInfo()’ gains ‘rot’ argument to allow per-glyph rotation. (Thanks to Daniel Sabanes Bove.)
Control of symbol visibility is now supported on macOS (the previous check only worked on ELF platforms).
Control of symbol visibility is now suported on macOS (the previous check only worked on ELF platforms).
Text widths and heights were incorrectly reported by the Quartz device if the drawing context didn't exist yet (typically when drawing off-screen to a window that is yet to appear, see PR#18591).
The Quartz device could segfault in cases where paths with spaces are used in the new glyph drawing API. Thanks to Tomek Gieorgijewski (PR#18758).
The Quartz device could segfault in cases where paths with spaces are
used in the new glyph drawing API. Thanks to Tomek Gieorgijewski
(PR#18758).
Mathlib function ‘lgammacor(x)’ no longer warns about underflow to zero for large ‘x’.
The Quartz device could segfault in cases where paths with spaces are used in the new glyph drawing API. Thanks to Tomek Gieorgijewski (PR#18758).
Package ‘citation()’ results auto-generated from the package metadata now also provide package DOIs for CRAN and Bioconductor packages.
Package ‘citation()’ results auto-generated from the package metadata
now also provide package DOIs for CRAN and Bioconductor packages.
Memory allocation messages now use the (non-standard notation) ‘"Mb"’, ‘"Gb"’ , ..., and ‘"Mbytes"’ strings as _arguments_ instead of as part of the (translatable format) string. This is one step for PR#18297; from Henrik Bengtsson.
‘tools’' ‘toTitleCase()’ now works better, fixing PR#18674, thanks to Shannon Pileggi, Sarah Zeller, Reiko Okamoto, and Hugo Gruson's ‘R Dev Day’ effort.
Printing matrices (typically with many rows and or columns) now also omits columns when desirable according to option ‘max.print’, or argument ‘max’, respectively. This is primarily the work of Lorena Abad, Ekaterina Akimova, Hanne Oberman, Abhishek Ulayil, and Lionel Henry at the ‘R Dev Day’, thus fixing PR#15027.
‘methods(<pkg>:::<genfun>)’ now does report methods when neither the generic nor the methods have been exported.
‘stem()’ correctly formats also in cases where rounding up, e.g., from 9.96 to 10 needs more digits; thanks to Ella Kaye and Kelly Bodwin, fixing PR#8934 during ‘R Dev Day’ at useR!2024.
‘pdf()’ gains an ‘author’ argument to set the corresponding metadata field, and logical arguments ‘timestamp’ and ‘producer’ to optionally omit the respective metadata. (Thanks to Edzer Pebesma.)
The Quartz device could segfault in cases where paths with spaces are used in the new glyph drawing API. Thanks to Tomek Gieorgijewski (PR#18758).
New ‘qr.influence()’ function, a “bare bones” interface to the ‘lm.influence()’ leave-one-out diagnostics computations; wished for in PR#18739.
New function ‘grepv()’ identical to ‘grep()’ except with the default ‘value = TRUE’.
Building the HTML (and Info) versions of the R manuals now requires ‘texi2any’ from Texinfo 6.1 or later.
‘R CMD check --as-cran’ notes bad parts in the ‘DESCRIPTION’ file's URL fields.
‘as.data.frame.list()’ gets a new option ‘new.names’ and now preserves ‘NA’ names, thus fixing the ‘format()’ method for data frames, and also bug PR#18745. Relatedly, the ‘format()’ method gets an option ‘cut.names’.
Additional non-API entry points added to those reported by ‘R CMD check’: ‘IS_LONG_VEC’, ‘PRCODE’, ‘PRENV’, ‘PRVALUE’, ‘R_nchar’, ‘Rf_NonNullStringMatch’, ‘R_shallow_duplicate_attr’, ‘Rf_StringBlank’, ‘SET_TYPEOF’, ‘TRUELENGTH’, ‘XLENGTH_EX’, and ‘XTRUELENGTH’.
New function ‘grepv’ identical to ‘grep’ except with the default ‘value = TRUE’.
Additional non-API entry points added to those reported by ‘R CMD check’: ‘IS_LONG_VEC’, ‘PRCODE’, ‘PRENV’, ‘PRVALUE’, ‘R_nchar’, ‘Rf_NonNullStringMatch’, ‘Rf_StringBlank’, ‘SET_TYPEOF’, ‘TRUELENGTH’, ‘XLENGTH_EX’, and ‘XTRUELENGTH’.
Package ‘citation()’ results auto-generated from the package metadata now also provide package DOIs for CRAN and Bioconductor packages.
‘as.data.frame.list()’ gets new option ‘new.names’ and now preserves ‘NA’ names, thus fixing the ‘format()’ method for data frames, and also bug PR#18745. Relatedly, the ‘format()’ method gets option ‘cut.names’.
Some ‘NOTE’s for use of non-API entry points have been upgraded to ‘WARNING’s in preparation for removing declarations and, where possible, hiding these entry points.
Some non-API entry points have been added to those reported by ‘R CMD check’: ‘COMPLEX0’, ‘ddfind’, ‘DDVAL’, ‘ENSURE_NAMEDMAX’, ‘ENVFLAGS’, ‘FRAME’, ‘HASHTAB’, ‘INTERNAL’, ‘IS_ASCII’, ‘IS_UTF8’, ‘LEVELS’, ‘NAMED’, ‘PRSEEN’, ‘RDEBUG’, ‘REAL0’, ‘Rf_findVarInFrame3’, ‘SET_BODY’, ‘SET_CLOENV’, ‘SET_FORMALS’, ‘SET_PRSEEN’, ‘SET_RDEBUG’, ‘STRING_PTR’, ‘SYMVALUE’, and ‘VECTOR_PTR’. Any declarations for these in public header files will be removed in the near future, and they will be hidden where possible.
‘Writing R Extensions’ has a new section ‘Moving into C API compliance’ to help package authors move away from using non-API endpoints. This section will continue to be updated as work on clarifying and tightening the C API continues.
Some non-API entry points have been added to those reported by ‘R CMD check’: ‘COMPLEX0’, ‘ddfind’, ‘DDVAL’, ‘ENSURE_NAMEDMAX’, ‘ENVFLAGS’, ‘FRAME’, ‘HASHTAB’, ‘INTERNAL’, ‘IS_ASCII’, ‘IS_UTF8’, ‘LEVELS’, ‘NAMED’, ‘PRSEEN’, ‘RDEBUG’, ‘REAL0’, ‘SET_BODY’, ‘SET_CLOENV’, ‘SET_FORMALS’, ‘SET_PRSEEN’, ‘SET_RDEBUG’, ‘STRING_PTR’, ‘SYMVALUE’, and ‘VECTOR_PTR’. Any declarations for these in public header files will be removed in the near future, and they will be hidden where possible.
Some non-API entry points have been added to those reported by ‘R CMD check’: ‘COMPLEX0’, ‘ddfind’, ‘DDVAL’, ‘ENSURE_NAMEDMAX’, ‘ENVFLAGS’, ‘FRAME’, ‘HASHTAB’, ‘INTERNAL’, ‘IS_ASCII’, ‘IS_UTF8’, ‘LEVELS’, ‘NAMED’, ‘PRSEEN’, ‘REAL0’, ‘SET_PRSEEN’, and ‘SYMVALUE’. Any declarations for these in public header files will be removed in the near future, and they will be hidden where possible.
New ‘head()’ and ‘tail()’ methods for class ‘"ts"’ time series, proposed by Spencer Graves on R-devel.
New ‘qr.influence()’, a “bare bones” interface to the ‘lm.influence()’ leave-one-out diagnostics computations; wished for in PR#18739.
Some non-API entry points have been added to those reported by ‘R CMD check’: ‘SYMVALUE’, ‘INTERNAL’, ‘DDVAL’, ‘ENSURE_NAMEDMAX’, ‘NAMED’, ‘COMPLEX0’, ‘REAL0’, ‘LEVELS’, ‘FRAME’, ‘HASHTAB’, ‘IS_ASCII’, ‘IS_UTF8’. Any declarations for these in public header files will be removed in the near future, and they will be hidden where possible.
New API functions ‘R_ClosureFormals’, ‘R_ClosureBody’, and ‘R_ClosureEnv’ for extracting closure components. The existing functions ‘R_ClosureExpr’ and ‘R_BytecodeExpr’ have also been added to the API.
New API function ‘R_ParentEnv’.
New functions ‘check_package_urls()’ and ‘check_package_dois()’ in package ‘tools’ for checking URLs and DOIs in package sources.
New API function ‘R_mkClosure’. This checks that its arguments are valid and should be used instead of ‘allocSExp(CLOSXP’ followed by ‘SET_FORMALS’, ‘SET_BODY’, and ‘SET_CLOENV’.
New API functions ‘R_ClosureFormals’, ‘R_ClosureBody’, and ‘R_ClosureEnv’ for extrancting closure components. The existing functions ‘R_ClosureExpr’ and ‘R_BytecodeExpr’ have also been added to the API.
‘graphics’' ‘grid()’ gains optional argument ‘nintLog’.
Auto-generated ‘citation()’ entries no longer include (additional) URLs in the ‘note’ field (PR#18547).
‘R CMD check --as-cran’ notes bad parts in ‘DESCRIPTION’ file URL fields.
The new function ‘Rf_allocLang’ is now available. This provides an
alternative to the idiom of calling ‘Rf_allocList’ followed by
‘SET_TYPEOF’.
The new function ‘Rf_allocLang’ is now available. This provides an alternative to the idiom of calling ‘Rf_allocList’ followed by ‘SET_TYPEOF’.
Functions ‘R_atof’ and ‘R_strtod’ declared in header ‘R_ext/Utils.h’ are now documented in ‘Writing R Extensions’ and so formally part of the API.
The non-API entry points ‘Rf_setSVector’, ‘Rf_StringFalse’, ‘Rf_StringTrue’ and ‘Rf_isBlankString’ have been added to those reported by ‘R CMD check’.
‘R CMD check’ now reports as warnings what ‘gfortran’ calls ‘Fortran 2018 deleted features’, all of which have long been marked as ‘obsolescent’ and some of which were deleted in Fortran 2008 or earlier. Fortran compilers are no longer required to support these.
‘as.numeric()’, ‘scan()’, ‘type.convert()’ and other places which use the internal C function ‘R_strtod’ now require a _non-empty_ digit sequence in a decimal or binary exponent. This aligns with the C/POSIX standard for ‘strtod’ and with ‘?NumericConstants’.
‘as.data.frame(m, make.names=NA)’ now works correctly for a matrix ‘m’ with ‘NA’'s in row names.
The error message from ‘<POSIXlt>[["hour"]]’ and similar now mentions ‘*[[, "hour"]]’, as wished for in PR#17409 and proposed by Michael Chirico.
‘qbinom()’ and potentially ‘qpois()’, ‘qnbinom()’, no longer sometimes fail accurate inversion (of ‘pbinom()’, etc), thanks to Christopher Chang's report and patch in PR#18711.
The internal help server on Windows can again serve requests sent in quick succession, fixing a regression in R 4.4.0.
‘debugcall(<S3Generic>())’ now also works when a corresponding S4-generic version is in the ‘methods’ cache (PR#18143).
Package ‘tools’' ‘toTitleCase(ch0)’ now returns ‘character(0)’ when ‘ch0’ is of zero length; fixing PR#18724, reported by David Hugh Jones.
‘R CMD check’ is no longer broken (without a check result and no explanation in ‘00check.log’) for a package which declares an invalid ‘VignetteBuilder’ in ‘DESCRIPTION’ but has no vignettes.
The new function ‘Rf_allocLang’ is now available. This provides an alternative to the idiom of calling ‘Rf_allocList’ followed by ‘SET_TYPEOF’.
‘SET_TYPEOF’ now signals an error unless the old and new types have compatible memory structure and content. Use of ‘SET_TYPE’ in package C code should be avoided and may be deprecated in the near future. It is better to allocate an object of the proper type in the first place.
The ‘Writing R Extensions’ Texinfo source now contains very experimental annotations for more clearly identifying the API status of C entry points. These annotations are used to produce indices for API, experimental API, and embedded API entry points in the rendered versions. This is very preliminary and may be dropped if a better approach emerges.
‘R CMD check’ is no longer broken (without a check result and no explanation in ‘00check.log’) for a package which declares an invalid ‘VignetteBuilder’ in ‘DESCRIPTION’ but has no vignettes.
The internal code for changing the parent of an environment now signals an error if the new parent is not an environment or if the change would create a cycle in the parent chain.
‘R CMD check’ now reports as warnings what ‘gfortran’ calls ‘Fortran 2018 deleted features’, all of which have long been marked as ‘obsolescent’ and some of which were deleted in Fortran 2008 or earlier. Fortran compilers are no longer required to support these.
Package ‘tools’' ‘toTitleCase(ch0)’ now returns ‘character(0)’ when ‘ch0’ is of zero length; fixing PR#18724, reported by David Hugh Jones.
‘debugcall(<S3Generic>())’ now also works when a corresponding S4-generic version is in the ‘methods’ cache (PR#18143).
Deprecated (for more than 9 years!) functions ‘linearizeMlist’, ‘listFromMlist’, and ‘showMlist’ and the ‘"MethodsList"’ class for S4 method handling were removed from package ‘methods’. Deprecated functions ‘balanceMethodsList’, ‘emptyMethodsList’, ‘inheritedSubMethodLists’, ‘insertMethod’, ‘insertMethodInEmptyList’, ‘makeMethodsList’, ‘mergeMethods’, ‘MethodsList’, ‘MethodsListSelect’, and ‘SignatureMethod’ were made defunct, as were the ‘"MethodsList"’ branches of functions ‘assignMethodsMetaData’, ‘finalDefaultMethod’, and ‘MethodAddCoerce’.
The internal help server on Windows can again serve requests sent in quick succession, fixing a regression in R 4.4.0.
Several deprecated auxiliary functions and the ‘MethodsList’ class for S4 method handling are now defunct in package ‘methods’, or have even been removed.
‘qbinom()’ and potentially ‘qpois()’, ‘qnbinom()’, no longer sometimes fail accurate inversion (of ‘pbinom()’, etc), thanks to Christopher Chang's report and patch in PR#18711.
The error message from ‘<POSIXlt>[["hour"]]’ and similar now mentions ‘*[[, "hour"]]’, as wished for in PR#17409 and proposed by Michael Chirico.
The numeric version creators now stop on invalid non-character version specifications.
‘as.data.frame(m, make.names=NA)’ now works correctly for a matrix ‘m’ with ‘NA’'s in row names.
The non-API and hidden entry points ‘Rf_setIVector’, ‘Rf_setRVector’ and ‘Rf_setSVector’ have been removed.
The non-API entry points ‘Rf_setSVector’, ‘Rf_StringFalse’, ‘Rf_StringTrue’ and ‘Rf_isBlankString’ have been added to those reported by ‘R CMD check’.
Functions ‘R_atof’ and ‘R_strtod’ declared in header ‘R_ext/Utils.h’ are now documented in ‘Writing R Extensions’ and so formally part of the API.
‘as.numeric()’, ‘scan()’, ‘type.convert()’ and other places which use the internal C function ‘R_strtod’ now require a _non-empty_ digit sequence in a decimal or binary exponent. This aligns with the C/POSIX standard for ‘strtod’ and with ‘?NumericConstants’.
‘as.numeric()’, ‘scan()’, ‘type.convert()’ and other places which use the internal C function ‘R_strtod’ now require a _non-empty_ digit sequence in a decimal or binary exponent. This aligns with the C standard for ‘strtod’ and with ‘?NumericConstants’.
[None yet.]
‘as.integer(rl)’ and hence ‘as.raw(rl)’ now work for a ‘list’ of ‘raw(1)’ elements, as proposed by Michael Chirico's PR#18696.
The licence headers for the RPC code in ‘src/extra/xdr’ have been updated to use the GPL-compatible licence published by Oracle America in 2010.
New startup option ‘--max-connections’ to set the maximum number of simultaneous connections for the session. Defaults to 128 as before: allowed values up to 4096 (but resource limits may in practice restrict to smaller values).
‘kappa(., exact = TRUE, norm = *)’ now works for all norms and also for complex matrices. In symmetric / triangular cases, the new argument ‘uplo = "U" | "L"’ allows the upper or lower triangular part to be specified.
Functions ‘psmirnov()’, ‘qsmirnov()’ and ‘rsmirnov()’ in package ‘stats’ have had argument ‘two.sided’ renamed to ‘alternative’, to take into account that the permutation distributions of the one-sided statistics can be different in the case of ties. Consequence of PR#18582.
The icence headers for the RPC code in ‘src/extra/xdr’ have been updated to use the GPL-compatible licence published by Oracle America in 2010.
The default method for the directional comparison operators ‘<’, ‘>’, ‘<=’, and ‘>=’ now signals an error when one of the operands is a language object, i.e. a symbol or a call.
‘as.data.frame()’'s default method now also works fine with atomic objects inheriting from classes such as ‘"roman"’, ‘"octmode"’ and ‘"hexmode"’, thus fulfilling the wish of PR#18421, by Benjamin Feakins.
‘R CMD check --as-cran’ will compile C++ code with ‘-DR_NO_REMAP’.
‘tools::testInstalledPackage()’ is no longer silent about failures from running examples or tests and its return code no longer ignores failures from checking vignettes.
‘xtabs(Freq ~ .)’ now consistently defaults to ‘na.action = na.pass’, using ‘na.rm = FALSE’ (added as an argument) when summing over ‘Freq’ (PR#17770).
Rd comment lines no longer cause broken paragraphs in the rendered PDF and plain-text help. In code blocks, pure comment lines (starting with ‘%’) no longer produce an empty line.
New completion option ‘backtick’ (disabled by default) allows non-syntactic completions to be wrapped in backquotes. This is currently only useful for Jupyter notebooks via the ‘IRkernel’ package, and may cause problems for other backends.
New function ‘pkg2HTML()’ in ‘tools’ to create single-page HTML reference manuals for R packages.
Licence headers for the RPC code in ‘src/extra/xdr’ have been updated to use the GPL-compatible licence published by Oracle America in 2010.
The parser has been updated to work with ‘bison’ 3.8.2, which is now used for the pre-generated parsers in ‘gram.c’, ‘file.c’, and ‘gramRd.c’. A few parser error messages have changed, which may affect code that relies on exact messages.
Rtools44 has experimental support for 64-bit ARM (‘aarch64’) CPUs _via_ the LLVM 17 toolchain using ‘lld’, ‘clang’/‘flang-new’ and ‘libc++’.
The makefiles and installer scripts for Windows have been tailored to Rtools44, an update of the Rtools43 toolchain. It is based on GCC 13 and newer versions of MinGW-W64, binutils and libraries (targeting 64-bit Intel CPUs). R-devel can no longer be built using Rtools43 without changes.
The legacy graphics devices ‘pictex()’ and ‘xfig()’ are now deprecated. They do not support recent graphics enhancements and their font handling is rudimentary. The intention is to retain them for historical interest as long as they remain somewhat functional.
If the ‘libdeflate’ library and headers are available, ‘libdeflate’ rather than ‘libz’ is used to (de)compress R objects in lazy-load databases. Typically tasks spend up to 5% of their time on such operations, although creating lazy-data databases is one of the exceptions.
This can be suppressed if the library is available by the ‘configure’ option ‘--without-libdeflate-compression’.
‘mkCharLenCE’ was incorrectly documented to take a ‘size_t’ length but was implemented with ‘int’ (and character strings in R are limited to 2^31 - 1 bytes).
‘R CMD check --as-cran’ now runs \donttest examples (which are run by ‘example()’) instead of instructing the tester to do so. This can be temporarily circumvented during development by setting environment variable ‘_R_CHECK_DONTTEST_EXAMPLES_’ to a false value.
The byte code evaluator now uses less C stack space for recursive calls to byte-compiled functions. It also makes more of an effort to avoid allocations for scalar return values.
Startup banners, ‘R --version’, ‘sessionInfo()’ and ‘R CMD check’ no longer report ‘(64-bit)’ as part of the platform as this is almost universal - the increasingly rare 32-bit platforms will still report ‘(32-bit)’.
On Windows, ditto for window titles.
‘is.atomic(NULL)’ now returns ‘FALSE’, as ‘NULL’ is not an atomic vector. Strict back-compatibility would replace ‘is.atomic(foo)’ by ‘(is.null(foo) || is.atomic(foo))’ but should happen only sparingly.
The ‘confint()’ methods for ‘"glm"’ and ‘"nls"’ objects have been copied to the ‘stats’ package. Previously, they were stubs which called versions in package ‘MASS’. The ‘MASS’ namespace is no longer loaded if you invoke (say) ‘confint(glmfit)’. Further, the ‘"glm"’ method for ‘profile()’ and the ‘plot()’ and ‘pairs()’ methods for class ‘"profile"’ have been copied from ‘MASS’ to ‘stats’. (‘profile.nls()’ and ‘plot.profile.nls()’ were already in ‘stats’.)
The ‘confint()’ and ‘profile’ methods for ‘"glm"’ objects have gained a possibility to do profiling based on the \IRao Score statistic in addition to the default Likelihood Ratio. This is controlled by a new ‘test =’ argument.
The ‘pairs()’ method for ‘"profile"’ objects has been extended with a ‘which =’ argument to allow plotting only a subset of the parameters.
The ‘"glm"’ method for ‘anova()’ computes test statistics and p-values by default, using a chi-squared test or an F test depending on whether the dispersion is fixed or free. Test statistics can be suppressed by giving argument ‘test’ a false logical value.
In ‘setRepositories()’ the repositories can be set using their names via ‘name =’ instead of index ‘ind =’.
‘methods()’ and ‘.S3methods()’ gain a ‘all.names’ option for the (rare) case where functions starting with a ‘.’ should be included.
Serializations can now be interrupted (e.g., by ‘Ctrl-C’ on a Unix-alike) if they take too long, e.g., from ‘save.image()’, thanks to suggestions by \IIvan Krylov and others on R-devel.
New startup option ‘--max-connections’ to set the maximum number of connections for the session. Defaults to 128 as before: allowed values up to 4096 (but resource limits may in practice restrict to smaller values).
R on Windows (since Windows 10 2004) now uses the new Segment Heap allocator. This may improve performance of some memory-intensive applications.
When R packages are built, typically by ‘R CMD build <pkg>’, the new ‘--user=<build_user>’ option overrides the (internally determined) user name, currently ‘Sys.info()["user"]’ or ‘LOGNAME’. This is a (modified) fulfillment of Will Landau's suggestion in PR#17530.
‘tools::testInstalledBasic()’ gets new optional arguments ‘outDir’ and ‘testSrcdir’, e.g., allowing to use it in a ‘<builddir> != <srcdir>’ setup, and in standard “binary” Windows installation *if* a source ‘tests/’ folder is present.
‘range(<DT_with_Inf>, finite = TRUE)’ now work for objects of class ‘"Date"’, ‘"POSIXct"’, and ‘"POSIXlt"’ with infinite entries, analogously to ‘range.default()’, as proposed by Davis Vaughan on R-devel. Other ‘range()’-methods can make use of new function ‘.rangeNum()’.
New ‘.internalGenerics’ object complementing ‘.S3PrimitiveGenerics’, for documentation and low-level book-keeping.
‘grid()’ now invisibly returns the x- and y- coordinates at which the grid-lines were drawn.
‘norm(., type)’ now also works for complex matrices.
‘kappa(., exact = TRUE, norm = *)’ now works for all norms and also for complex matrices. In symmetric / triangular cases, new argument ‘uplo = "U" | "L"’ allows to specify the upper or lower triangular part.
‘memDecompress(type = "unknown")’ recognizes compression in the default ‘\Izlib’ format as used by ‘memCompress(type = "gzip")’.
‘memCompress()’ and ‘memDecompress()’ will use the ‘libdeflate’ library (<https://github.com/ebiggers/libdeflate>) if installed. This uses the same type of compression for ‘type = "gzip"’ but is 1.5-2x faster than the system ‘libz’ library on some common platforms: the speed-up may depend on the library version.
‘diff()’ for objects of class ‘"Date"’, ‘"POSIXct"’, and ‘"POSIXlt"’ accepts a ‘units’ argument passed via ‘...’.
Dynamic help now does a much better job of rendering package ‘DESCRIPTION’ metadata.
‘Rprof()’ gains an ‘event’ argument and support for elapsed (real) time profiling on Unix (PR#18076).
‘filled.contour()’ gains a ‘key.border’ argument.
‘tools::update_pkg_po()’ gets arguments ‘pot_make’ and ‘mo_make’ for _not_ re-making the corresponding files, and additionally a ‘verbose’ argument.
Hexadecimal string colour specifications are now accepted in short form, so, for example, we can use ‘"#123"’, which is equivalent to ‘"#112233"’.
Thanks to \IMikeFC for the original idea and \IElla Kaye, \IMalcolm Barrett, \IGeorge Stagg, and \IHanne Oberman for the patch.
Plain-text help shows \var markup by angle brackets.
The new experimental primitive function ‘declare()’ is intended to eventually allow information about R code to be communicated to the interpreter, compiler, and code analysis tools. The syntax for declarations is still being developed.
Functions ‘psmirnov()’, ‘qsmirnov()’ and ‘rsmirnov()’ in package ‘stats’ have argument ‘two.sided’ renamed to ‘alternative’, to take into account that the permutation distributions of the one-sided statistics can be different in the case of ties. Consequence of PR#18582.
‘sort()’ is now an implicit S4 generic in ‘methods’.
Formatting and printing, ‘format(z), print(z)’, of complex vectors ‘z’ no longer zap relatively small real or imaginary parts to zero, fixing PR#16752. This is an API change, as it was documented previously to round real and imaginary parts together on purpose, producing nicer looking output. As mentioned, e.g. in the PR, this change is compatible with many other “R-like” programming environments.
We have simplified the internal code and now basically format the real and imaginary parts independently of each other.
New experimental functions ‘Tailcall()’ and ‘Exec()’ to support writing stack-space-efficient recursive functions.
Where characters are attempted to be plotted by ‘pdf()’, ‘postscript()’ and ‘xfig()’ which are not in the selected 8-bit character set (most often Latin-1) and the R session is using a UTF-8 locale, the warning messages will show the UTF-8 character rather than its bytes and one dot will be substituted per character rather than per byte. (Platforms whose ‘iconv()’ does transliteration silently plot the transliteration.)
In a UTF-8 locale some transliterations are now done with a warning (e.g., dashes and Unicode minus to hyphen, ligatures are expanded, \Ipermille (‘‰’) is replaced by ‘o/oo’), although the OS may have got there first. These are warnings as they will continue to be replaced by dots in earlier versions of R.
The matrix multiplication functions ‘crossprod()’ and ‘tcrossprod()’ are now also primitive and S3 generic, as ‘%*%’ had become in R 4.3.0.
‘source()’ and ‘example()’ have a new optional argument ‘catch.aborts’ which allows continued evaluation of the R code after an error.
The non-Quartz ‘tiff()’ devices allow additional types of compression if supported by the platform's ‘libtiff’ library.
The list of base and recommended package names is now provided by ‘tools::standard_package_names()’.
‘cairo_pdf()’ and ‘cairo_ps()’ default to ‘onefile = TRUE’ to closer match ‘pdf()’ and ‘postscript()’.
New option ‘catch.script.errors’ provides a documented way to catch errors and then continue in non-interactive use.
‘L %||% R’ newly in ‘base’ is an expressive idiom for the phrases ‘if(!is.null(L)) L else R’ or ‘if(is.null(L)) R else L’.
The return value from ‘warnings()’ now always inherits from ‘"warnings"’ as documented, now also in the case of no warnings where it previously returned ‘NULL’.
‘as.complex("1i")’ now returns ‘0 + 1i’ instead of ‘NA’ with a warning.
‘z <- c(NA, 1i)’ now keeps the imaginary part ‘Im(z[1]) == 0’, no longer coercing to ‘NA_complex_’. Similarly, ‘cumsum(z)’ correctly sums real and imaginary parts separately, i.e., without “crosstalk” in case of ‘NA’s.
On Alpine Linux ‘iconv()’ now maps ‘"latin2"’, ‘"latin-2"’, ‘"latin9"’ and ‘"latin-9"’ to encoding names the OS knows about (case-insensitively).
‘iconv(sub = "Unicode")’ now always zero-pads to four (hex) digits, rather than to 4 or 8. (This seems to have become the convention once Unicode restricted the number of Unicode points to 2^21 - 1 and so will never need more than 6 digits.)
‘NCOL(NULL)’ now returns 0 instead of 1, for consistency with ‘cbind()’.
The information for the Euro glyph missing from the Adobe ‘.afm’ files for the Courier, Helvetica and Times families has been copied from their URW equivalents - this will improve vertical centring in the ‘pdf()’ and ‘postscript()’ devices.
The included BLAS sources have been updated to those shipped with LAPACK version 3.12.0. The changes are almost entirely cosmetic.
The included LAPACK sources have been updated to version 3.12.0 and some further double-complex routines added.
There are new font families for the 2014-5 URW 2.0 fonts (see ‘?pdf’) which are included in recent versions of Ghostscript. These have font widths for most Greek glyphs and a few others which were missing from the original versions (whose font families remain available for reproducibility, although Ghostscript-based viewers will render using the 2.0 versions).
Improve the large-n efficiency of ‘as.matrix(<dist>)’, thanks an R contributors effort, notably by Tim Taylor and Heather Turner, see PR#18660.
The default and ‘numeric’ methods of ‘all.equal()’ get a ‘check.class’ option.
‘zapsmall()’ gets new optional arguments, function ‘mFUN’ and ‘min.d’, for extra flexibility; fulfills a wish in PR#18199. Also, it is now an implicit S4 generic in package ‘methods’.
The Rd filter for ‘aspell()’ gains an ‘ignore’ argument.
New generic function ‘sort_by()’, primarily useful for the ‘data.frame’ method which can be used to sort rows of a data frame by one or more columns.
Licence headers for the RPC code in ‘src/extra/xdr’ have been updated to use the GPL-compatible licence published by Oracle America in 2010.
New function ‘pkg2HTML()’ in ‘tools’ to create single-page HTML reference manuals for R packages.
The parser has been updated to work with \Ibison 3.8.2, which is now used for the pre-generated parsers in ‘gram.c’, ‘file.c’, and ‘gramRd.c’. A few parser error messages have changed, which may affect code that relies on exact messages.
System \Ivalgrind headers are now required to use ‘configure’ option ‘--with-valgrind-instrumentation’ with value ‘1’ or ‘2’.
‘configure’ will warn if it encounters a 32-bit build, as that is nowadays almost untested.
Environment variable ‘R_SYSTEM_ABI’ is no longer used and so no longer recorded in ‘etc/Renviron’ (it was not on Windows and was only ever used when preparing package ‘tools’).
If the ‘libdeflate’ library and headers are available, ‘libdeflate’ rather than ‘libz’ is used to (de)compress R objects in lazy-load databases, Typically tasks spend up to 5% of their time on such operations, although creating lazy-data databases is one of the exceptions.
This can be suppressed if the library is available by the ‘configure’ option ‘--without-libdeflate-compression’.
‘configure’ option ‘--enable-lto=check’ has not worked reliably since 2019 and has been removed.
The minimum ‘autoconf’ requirement for a maintainer build has been increased to ‘autoconf’ 2.71.
It is intended to increase this to 2.72 for R 4.5.0: the distributed ‘configure’ file was generated using 2.72.
The minimum version requirement for an external LAPACK has been reduced to 3.9.0.
No default C++ compiler is set if no C++17 compiler is detected: there is no longer an automatic fallback to C++14 or C++11.
Compilers from the last five years should have sufficient support: for others macros ‘CXX’ and ‘CXXSTD’ can be set in file ‘config.site’ to provide a fallback if needed.
The ObjectiveC++ compiler now by default uses the standard selected by R for C++ (currently C++17) rather than the default standard for the C++ compiler (which on macOS is still C++98).
A new ‘configure’ option ‘--with-newAccelerate’ makes use of Apple's ‘new’ BLAS / LAPACK interfaces in their Accelerate framework. Those interfaces are only available in macOS 13.3 or later, and building requires SDK 13.3 or later (from the Command Line Tools or \IXcode 14.3 or later).
By default the option uses new Accelerate for BLAS calls: to also use it for LAPACK use option ‘--with-newAccelerate=lapack’. The later interfaces provide LAPACK 3.9.1 rather than 3.2.1: 3.9.1 is from 2021-04 and does not include the improved algorithms introduced in LAPACK 3.10.0 (including for BLAS calls).
The makefiles and installer scripts for Windows have been tailored to \IRtools44, an update of the \IRtools43 toolchain. It is based on GCC 13 and newer versions of \IMinGW-W64, \Ibinutils and libraries (targeting 64-bit Intel CPUs). R-devel can no longer be built using \IRtools43 without changes.
\IRtools44 has experimental support for 64-bit ARM (\Iaarch64) CPUs via \ILLVM 17 toolchain using ‘lld’, ‘clang’/‘flang-new’ and \Ilibc++.
‘R CMD check’ notes when S4-style exports are used without declaring a strong dependence on package ‘methods’.
‘tools::checkRd()’ (used by ‘R CMD check’) detects more problems with \Sexpr-based dynamic content, including bad nesting of \Sexprs and invalid arguments.
‘tools::checkRd()’ now reports Rd titles and section names ending in a period; this is ignored by ‘R CMD check’ unless environment variable ‘_R_CHECK_RD_CHECKRD_MINLEVEL_’ is set to -5 or smaller.
‘R CMD check’ now notes Rd files without an \alias, as long documented in ‘Writing R Extensions’ §1.3.1. The check for a missing \description has been moved from ‘tools::checkRd()’ to ‘tools::checkRdContents()’.
‘R CMD check’ now visits ‘inst/NEWS.Rd’ and OS-specific ‘man’ subdirectories when checking Rd files.
‘tools::checkDocFiles()’ and ‘tools::checkRdContents()’ now also check internal Rd files by default, but “specially” (ignoring missing documentation of arguments).
‘R CMD Rdiff’ gets option ‘--useEx’.
‘R CMD check’ now warns on non-portable uses of Fortran ‘KIND’ such as ‘INTEGER(KIND=4)’ and ‘REAL(KIND=8)’.
To see the failing lines set environment variable ‘_R_CHECK_FORTRAN_KIND_DETAILS_’ to a true value.
When checking Rd files, ‘R CMD check’ now notes some of the “lost braces” that ‘tools::checkRd()’ finds. Typical problems are Rd macros missing the initial backslash (e.g., ‘code{...}’), in-text set notation (e.g., ‘{1, 2}’, where the braces need escaping), and \itemize lists with \describe-style entries of the form \item{label}{description}.
‘R CMD INSTALL’ (and hence ‘check’) will compile C++ code with ‘-DR_NO_REMAP’ if environment variable ‘_R_CXX_USE_NO_REMAP_’ is set to a true value. It is planned that this will in future become the default for compiling C++.
The new built-in Rd macro \dontdiff{} can be used to mark example code whose output should be ignored when comparing check output to reference output (‘tests/Examples/<pkg>-Ex.Rout.save’). The \dontdiff tag, like \donttest, is _not_ shown on the rendered help page, so provides a clean alternative to ‘## IGNORE_RDIFF_(BEGIN|END)’ comments.
‘R CMD build’ when there is no ‘NAMESPACE’, now uses the recommended ‘exportPattern("^[^.]")’, instead of exporting everything.
‘R CMD check’ now warns about non-ASCII characters in the ‘NAMESPACE’ file (in addition to R files). Such packages are not portable and may fail to install on some platforms.
Headers ‘R_ext/Applic.h’ and ‘R-ext/Linpack.h’ used to include ‘R_ext/BLAS.h’ although this was undocumented and unneeded by their documented entry points. They no longer do so.
New function ‘R_missing()’, factored out from ‘do_missing()’, used to fix PR#18579.
‘SEXP’ type ‘S4SXP’ has been renamed to ‘OBJSXP’ to support experimenting with alternative object systems. The ‘S4SXP’ value can still be used in ‘C’ code but is now deprecated. Based on contributions from the R Consortium's Object-Oriented Programming Working Group.
New function ‘pow1p(x,y)’ for accurate ‘(1+x)^y’.
‘data()’ no longer handles zipped data from long-defunct (since R 2.13.0) ‘--use-zip-data’ installations.
The legacy graphics devices ‘pictex()’ and ‘xfig()’ are now deprecated. They do not support recent graphics enhancements and their font-handling is rudimentary. The intention is to retain them for historical interest as long as they remain somewhat functional.
Support for ‘encoding = "MacRoman"’ has been removed from the ‘pdf()’ and ‘postscript()’ devices - this was a legacy encoding supporting classic macOS up to 2001 and no longer has universal ‘libiconv’ support.
‘is.R()’ is deprecated as no other S dialect is known to be in use (and this could only identify historical dialects, not future ones).
Further information on calls can be obtained by setting the environment variable ‘_R_DEPRECATED_IS_R_’ to ‘error’ which turns the deprecation warning into an error and so by default gives a traceback. (This is done by ‘R CMD check --as-cran’.)
‘UseMethod()’ no longer forwards local variables assigned in the generic function into method call environments before evaluating the method body. This makes method calls behave more like standard function calls and makes method code easier to analyze correctly.
The twelve ‘as.data.frame.<class>()’ methods which were deprecated only via ‘_R_CHECK_AS_DATA_FRAME_EXPLICIT_METHOD_’ and in ‘R CMD check --as-cran’ are formally deprecated now in favour of calling ‘as.data.frame()’ or ‘as.data.frame.vector()’. The deprecation “check” now works also when ‘as.data.frame()’ is S4 generic thanks to \IIvan Krylov.
The default method for the directional comparison operators ‘<’, ‘>’, ‘<=’, and ‘>=’ now signals an error when one of the operands is a language objects, i.e. a symbol or a call.
For ‘terms.formula()’, deprecate ‘abb’ and ‘neg.out’ arguments _formally_ in addition to just documenting it.
The ‘methods’ package is more robust to not being attached to the search path. More work needs to be done.
‘pairwise.t.test()’ misbehaved when subgroups had 0 DF for variance, even with ‘pool.sd = TRUE’. (PR#18594 by Jack Berry).
Probability distribution functions ‘[dpq]<distrib>(x, *)’, but also ‘bessel[IKJY](x, .)’ now consistently preserve ‘attributes(x)’ when ‘length(x) == 0’, e.g., for a 2 x 0 matrix, thanks to \IKarolis Koncevičius' report PR#18509.
Group “Summary” computations such as ‘sum(1:3, 4, na.rm = 5, NA, 7, na.rm = LL)’ now give an error instead of either ‘17’ or ‘NN’ for ‘LL’ true or false, as proposed by \IIvan Krylov on the R-devel mailing list. (This also means it is now an error to specify ‘na.rm’ more than once.)
‘as.complex(x)’ now returns ‘complex(real = x, imaginary = 0)’ for _all_ numerical and logical ‘x’, notably also for ‘NA’ or ‘NA_integer_’.
Directories are now omitted by ‘file.copy(, recursive = FALSE)’ and in ‘file.append()’ (PR#17337).
‘gsub()’ and ‘sub()’ are now more robust to integer overflow when reporting errors caused by too large input strings (PR#18346).
Top-level handlers are now more robust to attempts to remove a handler whilst handlers are running (PR#18508).
The handling of ‘Alt+F4’ in \Idialogs created on Windows using \IGraphApp has been fixed (PR#13870).
‘density()’ more consistently computes grid values for the FFT-based convolution, following \IRobert Schlicht's analysis and proposal in PR#18337, correcting density values typically by a factor of about 0.999. Argument ‘old.coords = TRUE’ provides back compatibility.
‘palette.colors()’ gains a ‘name’ argument that defaults to ‘FALSE’ controlling whether the vector of colours that is returned has names (where possible). PR#18529.
‘tools::xgettext()’ no longer extracts the (non-translatable) class names from ‘warningCondition’ and ‘errorCondition’ calls.
‘S3method(<gen>, <class>, <func>)’ in the ‘NAMESPACE’ file now works (again) when ‘<func>’ is visible from the namespace, e.g., imported, or in base.
‘getParseData(f)’ now also works for a function defined in the first of several ‘<pkg>/R/*.R’ source files, thanks to \IKirill Müller's report and Duncan Murdoch's patch in PR#16756.
Rd \Sexpr macros with nested #ifdef conditionals were not processed.
A non-blocking connection with non-default encoding (such as a socket) now correctly returns from ‘readLines()’ after new data has arrived also when its EOF had been reached previously. Thanks to \IPeter Meilstrup's report on R-devel and \IIvan Krylov's report and patch proposal in PR#18555.
‘tools::checkRdContents()’ failed to detect empty argument descriptions when they spanned multiple lines, including those generated by ‘prompt()’. These cases are now noted by ‘R CMD check’.
Plain-text help no longer outputs spurious colons in the arguments list (for multi-line \item labels in the Rd source).
‘kappa()’ and ‘rcond()’ work correctly in more cases; ‘kappa(., norm = "2")’ now warns that it computes the 1-norm with (default) ‘exact = FALSE’; prompted by \IMikael Jagan's quite comprehensive PR#18543.
Rd skeletons generated by ‘prompt()’ or ‘promptData()’ now use a dummy title (so ‘R CMD build’ works). ‘tools::checkRdContents()’ has been updated to detect such template leftovers, including from ‘promptPackage()’.
When S4 method dispatch fails because no method was found, the error message now includes the signature argument names; thanks to Michael Chirico's proposal on the R-devel list.
‘withAutoprint({ .. })’ now preserves ‘srcref’s previously lost, thanks to Andrew Simmons' report plus fix in PR#18572.
‘transform.data.frame()’ no longer adjusts names; in particular, untransformed variables are kept as-is, including those with syntactically invalid names (PR#17890).
The ‘keep.source’ option for Rd \Sexpr blocks is no longer ignored.
The ‘formula’ methods for ‘t.test()’ and ‘wilcox.test()’ now catch when ‘paired’ is passed, addressing PR#14359; use ‘Pair(x1, x2) ~ 1’ for a paired test.
The level reported in the ‘browser’ prompt was often too large. It now shows the number of browser contexts on the stack.
For ‘cbind()’ and ‘rbind()’, the optional ‘deparse.level’ argument is now properly passed to methods, thanks to \IMikael Jagan's PR#18579 and comments there.
Some error and warning messages for large (‘long vector’) ‘matrix(v, nr, nc)’ and ‘dim(m) <- d’ are now correct about sizes, using ‘long long’ formatting, fixing PR#18612 (and more) reported by \IMikael Jagan.
‘readChar(useBytes = TRUE)’ now terminates strings even when the underlying connection uses extra spaces in the input buffer. This fixes problems with extra garbage seen with ‘gzip’ connections, PR#18605.
Named capture in PCRE regular expressions now works also with more than 127 named groups (PR#18588).
Datetime functions are now robust against long jumps when dealing with internal time zone changes. This avoids confusing warnings about an invalid time zone, previously triggered by turning warnings into errors or handling them via ‘tryCatch’ (PR#17966, PR#17780).
Datetime functions now restore even an empty ‘TZ’ environment variable after internal time zone changes (PR#17724). This makes results of datetime functions with this (typically unintentional) setting more predictable.
‘drop.terms(*)’ now drops response as by default, ‘keep.response = FALSE’, fixing PR#18564 thanks to \IMikael Jagan.
‘dummy.coef(.)’ now also works for ‘lm()’-models with ‘character’ categorical predictor variables rather than ‘factor’ ones, fixing PR#18635 reported by \IJinsong Zhao.
‘formals(f) <- formals(f)’ now also works for a function w/o arguments and atomic _constant_ ‘body(f)’.
Correct ‘as.function(<invalid list>, .)’'s error message.
‘removeSource()’ is yet more thorough in finding and removing ‘"srcref"’ and the other source references from parsed R language chunks, fixing PR#18638 thanks to Andrew Simmons.
‘dgeom()’ is more accurate now, notably when its result is very small, fixing PR#18642 thanks to the proposal of \IMorten Welinder, also improving other instances where C level ‘binom_raw(x, n, ..)’ has ‘x == 0’ or ‘x== n’.
‘warning()’ with ‘options(warn = 1)’ has improved output for multi-line messages.
‘axis.Date()’ and ‘axis.POSIXct()’ now respect the ‘par("lab")’ setting for the number of ‘pretty()’ intervals.
Comparisons for language objects (which are based on deparsing) are now more careful about using accurate deparsed results (PR#18676).
Plain-text help (‘Rd2txt’) now correctly preserves blank lines following single-line \dontrun code.
‘<POSIXlt>[*]’ no longer sets wrong ‘"balanced"’ attribute, fixing PR#18681 thanks to \IMikael Jagan.
‘str(<classed-call>)’ now deparses the call as expected, fixing PR#18684, reported by \IDave Slager.
In Rd examples, code following the closing brace of a \dontrun, \dontshow or \donttest tag on the same line is no longer skipped when ‘R CMD check’ runs the examples.
‘as.data.frame(matrix(*, ncol=0))’ now gets valid ‘names()’ and ‘colnames()’; reported by \IDavis Vaughan on the R-devel list.
Internal Mathlib function ‘stirlerr(n)’ is now almost fully (52-bit) accurate for all n >= ~5.9 and more accurate also in the range 1 -- 5.9. This entails small (“after 12th decimal”) changes in density functions, e.g., ‘dgamma()’ in _some_ regions of their support. The fix was partly prompted by \IMorten Welinder's PR#18640.
Numbers like ‘9876543.2’ are now considered non-integer by Mathlib internal ‘R_nonint()’, amending original fix of PR#15734.
The makefiles and installer scripts for Windows have been tailored to
\IRtools44, an update of the \IRtools43 toolchain. It is based on GCC
13 and newer versions of \IMinGW-W64, \Ibinutils and libraries
(targeting 64-bit Intel CPUs). R-devel can no longer be built using
\IRtools43 without changes.
\IRtools44 has experimental support for 64-bit ARM (\Iaarch64) CPUs via \ILLVM 17 toolchain using ‘lld’, ‘clang’/‘flang-new’ and \Ilibc++.
‘R CMD check’ notes when S4-style exports are used without declaring a
strong dependence on package ‘methods’.
‘tools::checkRd()’ (used by ‘R CMD check’) detects more problems with
\Sexpr-based dynamic content, including bad nesting of \Sexprs and
invalid arguments.
‘tools::checkRd()’ now reports Rd titles and section names ending in a
period; this is ignored by ‘R CMD check’ unless environment variable
‘_R_CHECK_RD_CHECKRD_MINLEVEL_’ is set to -5 or smaller.
‘R CMD check’ now notes Rd files without an \alias, as long documented
in ‘Writing R Extensions’ §1.3.1. The check for a missing \description
has been moved from ‘tools::checkRd()’ to ‘tools::checkRdContents()’.
‘R CMD check’ now visits ‘inst/NEWS.Rd’ and OS-specific ‘man’
subdirectories when checking Rd files.
‘tools::checkDocFiles()’ and ‘tools::checkRdContents()’ now also check
internal Rd files by default, but “specially” (ignoring missing
documentation of arguments).
‘R CMD Rdiff’ gets option ‘--useEx’.
‘R CMD check’ now warns on non-portable uses of Fortran ‘KIND’ such as
‘INTEGER(KIND=4)’ and ‘REAL(KIND=8)’.
To see the failing lines set environment variable ‘_R_CHECK_FORTRAN_KIND_DETAILS_’ to a true value.
When checking Rd files, ‘R CMD check’ now notes some of the “lost
braces” that ‘tools::checkRd()’ finds. Typical problems are Rd macros
missing the initial backslash (e.g., ‘code{...}’), in-text set notation
(e.g., ‘{1, 2}’, where the braces need escaping), and \itemize lists
with \describe-style entries of the form \item{label}{description}.
‘R CMD INSTALL’ (and hence ‘check’) will compile C++ code with
‘-DR_NO_REMAP’ if environment variable ‘_R_CXX_USE_NO_REMAP_’ is set to
a true value. It is planned that this will in future become the
default for compiling C++.
The new built-in Rd macro \dontdiff{} can be used to mark example code
whose output should be ignored when comparing check output to reference
output (‘tests/Examples/<pkg>-Ex.Rout.save’). The \dontdiff tag, like
\donttest, is _not_ shown on the rendered help page, so provides a
clean alternative to ‘## IGNORE_RDIFF_(BEGIN|END)’ comments.
‘R CMD build’ when there is no ‘NAMESPACE’, now uses the recommended
‘exportPattern("^[^.]")’, instead of exporting everything.
‘R CMD check’ now warns about non-ASCII characters in the ‘NAMESPACE’
file (in addition to R files). Such packages are not portable and may
fail to install on some platforms.
The ‘methods’ package is more robust to not being attached to the
search path. More work needs to be done.
‘pairwise.t.test()’ misbehaved when subgroups had 0 DF for variance,
even with ‘pool.sd = TRUE’. (PR#18594 by Jack Berry).
Probability distribution functions ‘[dpq]<distrib>(x, *)’, but also
‘bessel[IKJY](x, .)’ now consistently preserve ‘attributes(x)’ when
‘length(x) == 0’, e.g., for a 2 x 0 matrix, thanks to \IKarolis
Koncevičius' report PR#18509.
Group “Summary” computations such as ‘sum(1:3, 4, na.rm = 5, NA, 7,
na.rm = LL)’ now give an error instead of either ‘17’ or ‘NN’ for ‘LL’
true or false, as proposed by \IIvan Krylov on the R-devel mailing
list. (This also means it is now an error to specify ‘na.rm’ more than
once.)
‘as.complex(x)’ now returns ‘complex(real = x, imaginary = 0)’ for
_all_ numerical and logical ‘x’, notably also for ‘NA’ or
‘NA_integer_’.
Directories are now omitted by ‘file.copy(, recursive = FALSE)’ and in
‘file.append()’ (PR#17337).
‘gsub()’ and ‘sub()’ are now more robust to integer overflow when
reporting errors caused by too large input strings (PR#18346).
Top-level handlers are now more robust to attempts to remove a handler
whilst handlers are running (PR#18508).
The handling of ‘Alt+F4’ in \Idialogs created on Windows using
\IGraphApp has been fixed (PR#13870).
‘density()’ more consistently computes grid values for the FFT-based
convolution, following \IRobert Schlicht's analysis and proposal in
PR#18337, correcting density values typically by a factor of about
0.999. Argument ‘old.coords = TRUE’ provides back compatibility.
‘palette.colors()’ gains a ‘name’ argument that defaults to ‘FALSE’
controlling whether the vector of colours that is returned has names
(where possible). PR#18529.
‘tools::xgettext()’ no longer extracts the (non-translatable) class
names from ‘warningCondition’ and ‘errorCondition’ calls.
‘S3method(<gen>, <class>, <func>)’ in the ‘NAMESPACE’ file now works
(again) when ‘<func>’ is visible from the namespace, e.g., imported, or
in base.
‘getParseData(f)’ now also works for a function defined in the first of
several ‘<pkg>/R/*.R’ source files, thanks to \IKirill Müller's report
and Duncan Murdoch's patch in PR#16756.
Rd \Sexpr macros with nested #ifdef conditionals were not processed.
A non-blocking connection with non-default encoding (such as a socket)
now correctly returns from ‘readLines()’ after new data has arrived
also when its EOF had been reached previously. Thanks to \IPeter
Meilstrup's report on R-devel and \IIvan Krylov's report and patch
proposal in PR#18555.
‘tools::checkRdContents()’ failed to detect empty argument descriptions
when they spanned multiple lines, including those generated by
‘prompt()’. These cases are now noted by ‘R CMD check’.
Plain-text help no longer outputs spurious colons in the arguments list
(for multi-line \item labels in the Rd source).
‘kappa()’ and ‘rcond()’ work correctly in more cases; ‘kappa(., norm =
"2")’ now warns that it computes the 1-norm with (default) ‘exact =
FALSE’; prompted by \IMikael Jagan's quite comprehensive PR#18543.
Rd skeletons generated by ‘prompt()’ or ‘promptData()’ now use a dummy
title (so ‘R CMD build’ works). ‘tools::checkRdContents()’ has been
updated to detect such template leftovers, including from
‘promptPackage()’.
When S4 method dispatch fails because no method was found, the error
message now includes the signature argument names; thanks to Michael
Chirico's proposal on the R-devel list.
‘withAutoprint({ .. })’ now preserves ‘srcref’s previously lost, thanks
to Andrew Simmons' report plus fix in PR#18572.
‘transform.data.frame()’ no longer adjusts names; in particular,
untransformed variables are kept as-is, including those with
syntactically invalid names (PR#17890).
The ‘keep.source’ option for Rd \Sexpr blocks is no longer ignored.
The ‘formula’ methods for ‘t.test()’ and ‘wilcox.test()’ now catch when
‘paired’ is passed, addressing PR#14359; use ‘Pair(x1, x2) ~ 1’ for a
paired test.
The level reported in the ‘browser’ prompt was often too large. It now
shows the number of browser contexts on the stack.
For ‘cbind()’ and ‘rbind()’, the optional ‘deparse.level’ argument is
now properly passed to methods, thanks to \IMikael Jagan's PR#18579 and
comments there.
Some error and warning messages for large (‘long vector’) ‘matrix(v,
nr, nc)’ and ‘dim(m) <- d’ are now correct about sizes, using ‘long
long’ formatting, fixing PR#18612 (and more) reported by \IMikael
Jagan.
‘readChar(useBytes = TRUE)’ now terminates strings even when the
underlying connection uses extra spaces in the input buffer. This
fixes problems with extra garbage seen with ‘gzip’ connections,
PR#18605.
Named capture in PCRE regular expressions now works also with more than
127 named groups (PR#18588).
Datetime functions are now robust against long jumps when dealing with
internal time zone changes. This avoids confusing warnings about an
invalid time zone, previously triggered by turning warnings into errors
or handling them via ‘tryCatch’ (PR#17966, PR#17780).
Datetime functions now restore even an empty ‘TZ’ environment variable
after internal time zone changes (PR#17724). This makes results of
datetime functions with this (typically unintentional) setting more
predictable.
‘drop.terms(*)’ now drops response as by default, ‘keep.response =
FALSE’, fixing PR#18564 thanks to \IMikael Jagan.
‘dummy.coef(.)’ now also works for ‘lm()’-models with ‘character’
categorical predictor variables rather than ‘factor’ ones, fixing
PR#18635 reported by \IJinsong Zhao.
‘formals(f) <- formals(f)’ now also works for a function w/o arguments
and atomic _constant_ ‘body(f)’.
Correct ‘as.function(<invalid list>, .)’'s error message.
‘removeSource()’ is yet more thorough in finding and removing
‘"srcref"’ and the other source references from parsed R language
chunks, fixing PR#18638 thanks to Andrew Simmons.
‘dgeom()’ is more accurate now, notably when its result is very small,
fixing PR#18642 thanks to the proposal of \IMorten Welinder, also
improving other instances where C level ‘binom_raw(x, n, ..)’ has ‘x ==
0’ or ‘x== n’.
‘warning()’ with ‘options(warn = 1)’ has improved output for multi-line
messages.
‘axis.Date()’ and ‘axis.POSIXct()’ now respect the ‘par("lab")’ setting
for the number of ‘pretty()’ intervals.
Comparisons for language objects (which are based on deparsing) are now
more careful about using accurate deparsed results (PR#18676).
Plain-text help (‘Rd2txt’) now correctly preserves blank lines
following single-line \dontrun code.
‘<POSIXlt>[*]’ no longer sets wrong ‘"balanced"’ attribute, fixing
PR#18681 thanks to \IMikael Jagan.
‘str(<classed-call>)’ now deparses the call as expected, fixing
PR#18684, reported by \IDave Slager.
In Rd examples, code following the closing brace of a \dontrun,
\dontshow or \donttest tag on the same line is no longer skipped when
‘R CMD check’ runs the examples.
‘as.data.frame(matrix(*, ncol=0))’ now gets valid ‘names()’ and
‘colnames()’; reported by \IDavis Vaughan on the R-devel list.
Internal Mathlib function ‘stirlerr(n)’ is now almost fully (52-bit)
accurate for all n >= ~5.9 and more accurate also in the range 1 --
5.9. This entails small (“after 12th decimal”) changes in density
functions, e.g., ‘dgamma()’ in _some_ regions of their support. The
fix was partly prompted by \IMorten Welinder's PR#18640.
Numbers like ‘9876543.2’ are now considered non-integer by Mathlib
internal ‘R_nonint()’, amending original fix of PR#15734.
Startup banners, ‘R --version’, ‘sessionInfo()’ and ‘R CMD check’ no
longer report ‘(64-bit)’ as part of the platform as this is almost
universal - the increasingly rare 32-bit platforms will still report
‘(32-bit)’.
On Windows, ditto for window titles.
‘is.atomic(NULL)’ now returns ‘FALSE’, as ‘NULL’ is not an atomic
vector. Strict back-compatibility would replace ‘is.atomic(foo)’ by
‘(is.null(foo) || is.atomic(foo))’ but should happen only sparingly.
.
The ‘confint()’ methods for ‘"glm"’ and ‘"nls"’ objects have been
copied to the ‘stats’ package. Previously, they were stubs which
called versions in package ‘MASS’. The ‘MASS’ namespace is no longer
loaded if you invoke (say) ‘confint(glmfit)’. Further, the ‘"glm"’
method for ‘profile()’ and the ‘plot()’ and ‘pairs()’ methods for class
‘"profile"’ have been copied from ‘MASS’ to ‘stats’. (‘profile.nls()’
and ‘plot.profile.nls()’ were already in ‘stats’.)
The ‘confint()’ and ‘profile’ methods for ‘"glm"’ objects have gained a
possibility to do profiling based on the \IRao Score statistic in
addition to the default Likelihood Ratio. This is controlled by a new
‘test =’ argument.
The ‘pairs()’ method for ‘"profile"’ objects has been extended with a
‘which =’ argument to allow plotting only a subset of the parameters.
The ‘"glm"’ method for ‘anova()’ computes test statistics and p-values
by default, using a chi-squared test or an F test depending on whether
the dispersion is fixed or free. Test statistics can be suppressed by
giving argument ‘test’ a false logical value.
In ‘setRepositories()’ the repositories can be set using their names
via ‘name =’ instead of index ‘ind =’.
‘methods()’ and ‘.S3methods()’ gain a ‘all.names’ option for the (rare)
case where functions starting with a ‘.’ should be included.
Serializations can now be interrupted (e.g., by ‘Ctrl-C’ on a
Unix-alike) if they take too long, e.g., from ‘save.image()’, thanks to
suggestions by \IIvan Krylov and others on R-devel.
New startup option ‘--max-connections’ to set the maximum number of
connections for the session. Defaults to 128 as before: allowed values
up to 4096 (but resource limits may in practice restrict to smaller
values).
R on Windows (since Windows 10 2004) now uses the new Segment Heap
allocator. This may improve performance of some memory-intensive
applications.
When R packages are built, typically by ‘R CMD build <pkg>’, the new
‘--user=<build_user>’ option overrides the (internally determined) user
name, currently ‘Sys.info()["user"]’ or ‘LOGNAME’. This is a
(modified) fulfillment of Will Landau's suggestion in PR#17530.
‘tools::testInstalledBasic()’ gets new optional arguments ‘outDir’ and
‘testSrcdir’, e.g., allowing to use it in a ‘<builddir> != <srcdir>’
setup, and in standard “binary” Windows installation *if* a source
‘tests/’ folder is present.
‘range(<DT_with_Inf>, finite = TRUE)’ now work for objects of class
‘"Date"’, ‘"POSIXct"’, and ‘"POSIXlt"’ with infinite entries,
analogously to ‘range.default()’, as proposed by Davis Vaughan on
R-devel. Other ‘range()’-methods can make use of new function
‘.rangeNum()’.
New ‘.internalGenerics’ object complementing ‘.S3PrimitiveGenerics’,
for documentation and low-level book-keeping.
‘grid()’ now invisibly returns the x- and y- coordinates at which the
grid-lines were drawn.
‘norm(., type)’ now also works for complex matrices.
‘kappa(., exact = TRUE, norm = *)’ now works for all norms and also for
complex matrices. In symmetric / triangular cases, new argument ‘uplo
= "U" | "L"’ allows to specify the upper or lower triangular part.
‘memDecompress(type = "unknown")’ recognizes compression in the default
‘\Izlib’ format as used by ‘memCompress(type = "gzip")’.
‘memCompress()’ and ‘memDecompress()’ will use the ‘libdeflate’ library
(<https://github.com/ebiggers/libdeflate>) if installed. This uses the
same type of compression for ‘type = "gzip"’ but is 1.5-2x faster than
the system ‘libz’ library on some common platforms: the speed-up may
depend on the library version.
‘diff()’ for objects of class ‘"Date"’, ‘"POSIXct"’, and ‘"POSIXlt"’
accepts a ‘units’ argument passed via ‘...’.
Dynamic help now does a much better job of rendering package
‘DESCRIPTION’ metadata.
‘Rprof()’ gains an ‘event’ argument and support for elapsed (real) time
profiling on Unix (PR#18076).
‘filled.contour()’ gains a ‘key.border’ argument.
‘tools::update_pkg_po()’ gets arguments ‘pot_make’ and ‘mo_make’ for
_not_ re-making the corresponding files, and additionally a ‘verbose’
argument.
Hexadecimal string colour specifications are now accepted in short
form, so, for example, we can use ‘"#123"’, which is equivalent to
‘"#112233"’.
Thanks to \IMikeFC for the original idea and \IElla Kaye, \IMalcolm Barrett, \IGeorge Stagg, and \IHanne Oberman for the patch.
Plain-text help shows \var markup by angle brackets.
The new experimental primitive function ‘declare()’ is intended to
eventually allow information about R code to be communicated to the
interpreter, compiler, and code analysis tools. The syntax for
declarations is still being developed.
Functions ‘psmirnov()’, ‘qsmirnov()’ and ‘rsmirnov()’ in package
‘stats’ have argument ‘two.sided’ renamed to ‘alternative’, to take
into account that the permutation distributions of the one-sided
statistics can be different in the case of ties. Consequence of
PR#18582.
‘sort()’ is now an implicit S4 generic in ‘methods’.
Formatting and printing, ‘format(z), print(z)’, of complex vectors ‘z’
no longer zap relatively small real or imaginary parts to zero, fixing
PR#16752. This is an API change, as it was documented previously to
round real and imaginary parts together on purpose, producing nicer
looking output. As mentioned, e.g. in the PR, this change is
compatible with many other “R-like” programming environments.
We have simplified the internal code and now basically format the real and imaginary parts independently of each other.
New experimental functions ‘Tailcall()’ and ‘Exec()’ to support writing
stack-space-efficient recursive functions.
Where characters are attempted to be plotted by ‘pdf()’, ‘postscript()’
and ‘xfig()’ which are not in the selected 8-bit character set (most
often Latin-1) and the R session is using a UTF-8 locale, the warning
messages will show the UTF-8 character rather than its bytes and one
dot will be substituted per character rather than per byte. (Platforms
whose ‘iconv()’ does transliteration silently plot the
transliteration.)
In a UTF-8 locale some transliterations are now done with a warning (e.g., dashes and Unicode minus to hyphen, ligatures are expanded, \Ipermille (‘‰’) is replaced by ‘o/oo’), although the OS may have got there first. These are warnings as they will continue to be replaced by dots in earlier versions of R.
The matrix multiplication functions ‘crossprod()’ and ‘tcrossprod()’
are now also primitive and S3 generic, as ‘%*%’ had become in R 4.3.0.
‘source()’ and ‘example()’ have a new optional argument ‘catch.aborts’
which allows continued evaluation of the R code after an error.
The non-Quartz ‘tiff()’ devices allow additional types of compression
if supported by the platform's ‘libtiff’ library.
The list of base and recommended package names is now provided by
‘tools::standard_package_names()’.
‘cairo_pdf()’ and ‘cairo_ps()’ default to ‘onefile = TRUE’ to closer
match ‘pdf()’ and ‘postscript()’.
New option ‘catch.script.errors’ provides a documented way to catch
errors and then continue in non-interactive use.
‘L %||% R’ newly in ‘base’ is an expressive idiom for the phrases
‘if(!is.null(L)) L else R’ or ‘if(is.null(L)) R else L’.
The return value from ‘warnings()’ now always inherits from
‘"warnings"’ as documented, now also in the case of no warnings where
it previously returned ‘NULL’.
‘as.complex("1i")’ now returns ‘0 + 1i’ instead of ‘NA’ with a warning.
‘z <- c(NA, 1i)’ now keeps the imaginary part ‘Im(z[1]) == 0’, no
longer coercing to ‘NA_complex_’. Similarly, ‘cumsum(z)’ correctly
sums real and imaginary parts separately, i.e., without “crosstalk” in
case of ‘NA’s.
On Alpine Linux ‘iconv()’ now maps ‘"latin2"’, ‘"latin-2"’, ‘"latin9"’
and ‘"latin-9"’ to encoding names the OS knows about
(case-insensitively).
‘iconv(sub = "Unicode")’ now always zero-pads to four (hex) digits,
rather than to 4 or 8. (This seems to have become the convention once
Unicode restricted the number of Unicode points to 2^21 - 1 and so will
never need more than 6 digits.)
‘NCOL(NULL)’ now returns 0 instead of 1, for consistency with
‘cbind()’.
The information for the Euro glyph missing from the Adobe ‘.afm’ files
for the Courier, Helvetica and Times families has been copied from
their URW equivalents - this will improve vertical centring in the
‘pdf()’ and ‘postscript()’ devices.
The included BLAS sources have been updated to those shipped with
LAPACK version 3.12.0. The changes are almost entirely cosmetic.
The included LAPACK sources have been updated to version 3.12.0 and
some further double-complex routines added.
There are new font families for the 2014-5 URW 2.0 fonts (see ‘?pdf’)
which are included in recent versions of Ghostscript. These have font
widths for most Greek glyphs and a few others which were missing from
the original versions (whose font families remain available for
reproducibility, although Ghostscript-based viewers will render using
the 2.0 versions).
Improve the large-n efficiency of ‘as.matrix(<dist>)’, thanks an R
contributors effort, notably by Tim Taylor and Heather Turner, see
PR#18660.
The default and ‘numeric’ methods of ‘all.equal()’ get a ‘check.class’
option.
‘zapsmall()’ gets new optional arguments, function ‘mFUN’ and ‘min.d’,
for extra flexibility; fulfills a wish in PR#18199. Also, it is now an
implicit S4 generic in package ‘methods’.
The Rd filter for ‘aspell()’ gains an ‘ignore’ argument.
New generic function ‘sort_by()’, primarily useful for the ‘data.frame’
method which can be used to sort rows of a data frame by one or more
columns.
Licence headers for the RPC code in ‘src/extra/xdr’ have been updated
to use the GPL-compatible licence published by Oracle America in 2010.
New function ‘pkg2HTML()’ in ‘tools’ to create single-page HTML reference manuals for R packages.
[None yet.]
The parser has been updated to work with \Ibison 3.8.2, which is now
used for the pre-generated parsers in ‘gram.c’, ‘file.c’, and
‘gramRd.c’. A few parser error messages have changed, which may affect
code that relies on exact messages.
.
System \Ivalgrind headers are now required to use ‘configure’ option
‘--with-valgrind-instrumentation’ with value ‘1’ or ‘2’.
‘configure’ will warn if it encounters a 32-bit build, as that is
nowadays almost untested.
Environment variable ‘R_SYSTEM_ABI’ is no longer used and so no longer
recorded in ‘etc/Renviron’ (it was not on Windows and was only ever
used when preparing package ‘tools’).
If the ‘libdeflate’ library and headers are available, ‘libdeflate’
rather than ‘libz’ is used to (de)compress R objects in lazy-load
databases, Typically tasks spend up to 5% of their time on such
operations, although creating lazy-data databases is one of the
exceptions.
This can be suppressed if the library is available by the ‘configure’ option ‘--without-libdeflate-compression’.
‘configure’ option ‘--enable-lto=check’ has not worked reliably since
2019 and has been removed.
The minimum ‘autoconf’ requirement for a maintainer build has been
increased to ‘autoconf’ 2.71.
It is intended to increase this to 2.72 for R 4.5.0: the distributed ‘configure’ file was generated using 2.72.
No default C++ compiler is set if no C++17 compiler is detected: there
is no longer an automatic fallback to C++14 or C++11.
Compilers from the last five years should have sufficient support: for others macros ‘CXX’ and ‘CXXSTD’ can be set in file ‘config.site’ to provide a fallback if needed.
The ObjectiveC++ compiler now by default uses the standard selected by R for C++ (currently C++17) rather than the default standard for the C++ compiler (which on macOS is still C++98).
The minimum ‘autoconf’ requirement for a maintainer build has been increased to ‘autoconf’ 2.72.
.
Headers ‘R_ext/Applic.h’ and ‘R-ext/Linpack.h’ used to include
‘R_ext/BLAS.h’ although this was undocumented and unneeded by their
documented entry points. They no longer do so.
New function ‘R_missing()’, factored out from ‘do_missing()’, used to
fix PR#18579.
‘SEXP’ type ‘S4SXP’ has been renamed to ‘OBJSXP’ to support
experimenting with alternative object systems. The ‘S4SXP’ value can
still be used in ‘C’ code but is now deprecated. Based on
contributions from the R Consortium's Object-Oriented Programming
Working Group.
New function ‘pow1p(x,y)’ for accurate ‘(1+x)^y’.
.
‘data()’ no longer handles zipped data from long-defunct (since R
2.13.0) ‘--use-zip-data’ installations.
The legacy graphics devices ‘pictex()’ and ‘xfig()’ are now deprecated.
They do not support recent graphics enhancements and their
font-handling is rudimentary. The intention is to retain them for
historical interest as long as they remain somewhat functional.
Support for ‘encoding = "MacRoman"’ has been removed from the ‘pdf()’
and ‘postscript()’ devices - this was a legacy encoding supporting
classic macOS up to 2001 and no longer has universal ‘libiconv’
support.
‘is.R()’ is deprecated as no other S dialect is known to be in use (and
this could only identify historical dialects, not future ones).
Further information on calls can be obtained by setting the environment variable ‘_R_DEPRECATED_IS_R_’ to ‘error’ which turns the deprecation warning into an error and so by default gives a traceback. (This is done by ‘R CMD check --as-cran’.)
‘UseMethod()’ no longer forwards local variables assigned in the
generic function into method call environments before evaluating the
method body. This makes method calls behave more like standard function
calls and makes method code easier to analyze correctly.
The twelve ‘as.data.frame.<class>()’ methods which were deprecated only
via ‘_R_CHECK_AS_DATA_FRAME_EXPLICIT_METHOD_’ and in ‘R CMD check
--as-cran’ are formally deprecated now in favour of calling
‘as.data.frame()’ or ‘as.data.frame.vector()’. The deprecation “check”
now works also when ‘as.data.frame()’ is S4 generic thanks to \IIvan
Krylov.
The default method for the directional comparison operators ‘<’, ‘>’,
‘<=’, and ‘>=’ now signals an error when one of the operands is a
language objects, i.e. a symbol or a call.
For ‘terms.formula()’, deprecate ‘abb’ and ‘neg.out’ arguments
_formally_ in addition to just documenting it.
‘is.R()’ is defunct. [Soon ....]
Licence headers for the RPC code in ‘src/extra/xdr’ have been updated to use the GPL-compatible licence published by Oracle America in 2010.
New function ‘pkg2HTML()’ in ‘tools’ to create single-page HTML reference manuals for R packages.
No default C++ compiler is set if no C++17 compiler is detected: there is no longer an automatic fallback to C++14 or C++11.
Compilers from the last five years should have sufficient support: for others macros ‘CXX’ and ‘CXXSTD’ can be set in file ‘config.site’ to provide a fallback if needed.
The ObjectiveC++ compiler now by default uses the standard selected by R for C++ (currently C++17) rather than the default standard for the C++ compiler (which on macOS is still C++98).
For ‘terms.formula()’, deprecate ‘abb’ and ‘neg.out’ arguments _formally_ in addition to just documenting it.
Numbers like ‘9876543.2’ are now considered non-integer by Mathlib internal ‘R_nonint()’, amending original fix of PR#15734.
The minimum ‘autoconf’ requirement for a maintainer build has been increased to ‘autoconf’ 2.71.
It is intended to increase this to 2.72 for R 4.5.0: the distributed ‘configure’ file was generated using 2.72.
Internal Mathlib function ‘stirlerr(n)’ is now almost fully (52-bit) accurate for all n >= ~5.9 and more accurate also in the range 1 -- 5.9. This entails small (“after 12th decimal”) changes in density functions, e.g., ‘dgamma()’ in _some_ regions of their support. The fix was partly prompted by \IMorten Welinder's PR#18640.
Licence headers for the RPC code in ‘src/extra/xdr’ have been updated to use the GPL-compatible licence published by Oracle America in 2010.
The makefiles and installer scripts for Windows have been tailored to \IRtools44, an update of the \IRtools43 toolchain. It is based on GCC 13 and newer versions of \IMinGW-W64, \Ibinutils and libraries (targeting 64-bit Intel CPUs). R-devel can no longer be built using \IRtools43 without changes.
\IRtools44 has experimental support for 64-bit ARM (\Iaarch64) CPUs via \ILLVM 17 toolchain using ‘lld’, ‘clang’/‘flang-new’ and \Ilibc++.
The twelve ‘as.data.frame.<class>()’ methods which were deprecated only via ‘_R_CHECK_AS_DATA_FRAME_EXPLICIT_METHOD_’ and in ‘R CMD check --as-cran’ are formally deprecated now in favour of calling ‘as.data.frame()’ or ‘as.data.frame.vector()’. The deprecation “check” now works also when ‘as.data.frame()’ is S4 generic thanks to \IIvan Krylov.
New generic function ‘sort_by()’, primarily useful for the ‘data.frame’ method which can be used to sort rows of a data frame by one or more columns.
Licence headers for the RPC code in src/extra/xdr have been updated to use the GPL-compatible licence published by Oracle America in 2010.
‘as.data.frame(matrix(*, ncol=0))’ now gets valid ‘names()’ and ‘colnames()’; reported by \IDavis Vaughan on the R-devel list.
The parser has been updated to work with \Ibison 3.8.2, which is now used for the pre-generated parsers in ‘gram.c’, ‘file.c’, and ‘gramRd.c’. A few parser error messages have changed, which may affect code that relies on exact messages.
‘R CMD check’ now warns about non-ASCII characters in the ‘NAMESPACE’ file (in addition to R files). Such packages are not portable and may fail to install on some platforms.
The default method for the directional comparison operators ‘<’, ‘>’, ‘<=’, and ‘>=’ now signals an error when one of the operands is a language objects, i.e. a symbol or a call.
‘UseMethod()’ no longer forwards local variables assigned in the generic function into method call environments before evaluating the method body. This makes method calls behave more like standard function calls and makes method code easier to analyze correctly.
The twelve ‘as.data.frame.<class>()’ methods which were deprecated only via ‘_R_CHECK_AS_DATA_FRAME_EXPLICIT_METHOD_’ and in ‘R CMD check --as-cran’ are formally deprecated now in favour of calling ‘as.data.frame()’ or ‘as.data.frame.vector()’. The deprecation “check” now works also when ‘as.data.frame()’ is S4 generic thanks to Ivan Krylov.
The makefiles and installer scripts for Windows have been tailored to \IRtools44, an update of the \IRtools43 toolchain. It is based on GCC 13 and newer versions of \IMinGW-W64, \Ibinutils and libraries (targeting 64-bit Intel CPUs). R-devel can no longer be built using \IRtools43 without changes.
\IRtools44 has experimental suport for 64-bit ARM (aarch64) CPUs via LLVM 17 toolchain using lld, clang/flang-new and libc++.
The minimum ‘autoconf’ requirement for a maintainer build has been increased to ‘autoconf’ 2.71.
It is intended to increase this to 2.72 once that becomes widely available: the distributed ‘configure’ file was generated using 2.72.
In Rd examples, code following the closing brace of a \dontrun, \dontshow or \donttest tag on the same line is no longer skipped when ‘R CMD check’ runs the examples.
‘R CMD build’ when there is no ‘NAMESPACE’, now uses the recommended ‘exportPattern("^[^.]")’, instead of exporting everything.
‘is.R()’ is deprecated as no other S dialect is known to be in use (and this could only identify historical dialects, not future ones).
Further information on calls can be obtained by setting the environment variable ‘_R_DEPRECATED_IS_R_’ to ‘error’ which turns the deprecation warning into an error and so by default gives a traceback. (This is done by ‘R CMD check --as-cran’.)
‘is.R()’ is deprecated as no other S dialect is known to be in use (and this could only identify historical dialects, not future ones).
Further information on calls can be obtained by setting the environment variable ‘_R_DEPRECATED_IS_R_’ to ‘error’ which turns the deperecation warning into an error and so by default gives a traceback. (This is done by ‘R CMD check --as-cran’.)
‘UseMethod()’ no longer forwards local variables assigned in the generic function into method call environments before evaluating the method body. This makes method calls behave more like standard function calls and makes method code easier to analyze correctly. For now, attempts to use these variables in a method will signal an error; this will eventually be dropped.
‘str(<classed-call>)’ now deparses the call as expected, fixing PR#18684, reported by \IDave Slager.
‘range(<DT_with_Inf>, finite = TRUE)’ now work for objects of class ‘"Date"’, ‘"POSIXct"’, and ‘"POSIXlt"’ with infinite entries, analogously to ‘range.default()’, as proposed by Davis Vaughan on R-devel. Other ‘range()’-methods can make use of new function ‘.rangeNum()’.
New ‘.internalGenerics’ object complementing ‘.S3PrimitiveGenerics’, for documentation and low-level book-keeping.
Dynamic help now does a much better job of rendering package ‘DESCRIPTION’ metadata.
‘filled.contour()’ gains a ‘key.border’ argument.
‘tools::update_pkg_po()’ gets arguments ‘pot_make’ and ‘mo_make’ for _not_ re-making the corresponding files, and additionally a ‘verbose’ argument.
Plain-text help shows \var markup by angle brackets.
Functions ‘psmirnov()’, ‘qsmirnov()’ and ‘rsmirnov()’ in package ‘stats’ have argument ‘two.sided’ renamed to ‘alternative’, to take into account that the permutation distributions of the one-sided statistics can be different in the case of ties. Consequence of PR#18582.
New experimental functions ‘Tailcall()’ and ‘Exec()’ to support writing stack-space-efficient recursive functions.
New option ‘catch.script.errors’ provides a documented way to catch errors and then continue in non-interactive use.
‘L %||% R’ newly in ‘base’ is an expressive idiom for the phrases ‘if(!is.null(L)) L else R’ or ‘if(is.null(L)) R else L’.
The return value from ‘warnings()’ now always inherits from ‘"warnings"’ as documented, now also in the case of no warnings where it previously returned ‘NULL’.
On Alpine Linux ‘iconv()’ now maps ‘"latin2"’, ‘"latin-2"’, ‘"latin9"’ and ‘"latin-9"’ to encoding names the OS knows about (case-insensitively).
‘iconv(sub = "Unicode")’ now always zero-pads to four (hex) digits, rather than to 4 or 8. (This seems to have become the convention once Unicode restricted the number of Unicode points to 2^21 - 1 and so will never need more than 6 digits.)
‘zapsmall()’ gets new optional arguments, function ‘mFUN’ and ‘min.d’, for extra flexibility; fulfills a wish in PR#18199. Also, it is now an implicit S4 generic in package ‘methods’.
System \Ivalgrind headers are now required to use ‘configure’ option ‘--with-valgrind-instrumentation’ with value ‘1’ or ‘2’.
The minimum ‘autoconf’ requirement for a maintainer build has been increased to ‘autoconf’ 2.71.
It is intended to increase this to 2.72 once that becomes widely available.
No default C++ compiler is set if no C++17 compiler is detected: there is no longer an automatic fallback to C++14 or C++11.
Compilers from the last five years should have sufficient support: for others macros ‘CXX’ and ‘CXXSTD’ can be set in file ‘config.site’ to provide a fallback if needed.
A new ‘configure’ option ‘--with-newAccelerate’ makes use of Apple's ‘new’ BLAS / LAPACK interfaces in their Accelerate framework. Those interfaces are only available in macOS 13.3 or later, and building requires SDK 13.3 or later (from the Command Line Tools or \IXcode 14.3 or later).
By default the option uses new Accelerate for BLAS calls: to also use it for LAPACK use option ‘--with-newAccelerate=lapack’. The later interfaces provide LAPACK 3.9.1 rather than 3.2.1: 3.9.1 is from 2021-04 and does not include the improved algorithms introduced in LAPACK 3.10.0 (including for BLAS calls).
The new built-in Rd macro \dontdiff{} can be used to mark example code whose output should be ignored when comparing check output to reference output (‘tests/Examples/<pkg>-Ex.Rout.save’). The \dontdiff tag, like \donttest, is _not_ shown on the rendered help page, so provides a clean alternative to ‘## IGNORE_RDIFF_(BEGIN|END)’ comments.
‘SEXP’ type ‘S4SXP’ has been renamed to ‘OBJSXP’ to support experimenting with alternative object systems. The ‘S4SXP’ value can still be used in ‘C’ code but is now deprecated. Based on contributions from the R Consortium's Object-Oriented Programming Working Group.
Support for ‘encoding = "MacRoman"’ has been removed from the ‘pdf()’ and ‘postscript()’ devices - this was a legacy encoding supporting classic macOS up to 2001 and no longer has universal ‘libiconv’ support.
The twelve ‘as.data.frame.<class>()’ methods which were deprecated only via ‘_R_CHECK_AS_DATA_FRAME_EXPLICIT_METHOD_’ and in ‘R CMD check --as-cran’ are formally deprecated now in favour of calling ‘as.data.frame()’ or ‘as.data.frame.vector()’.
‘<POSIXlt>[*]’ no longer sets wrong ‘"balanced"’ attribute, fixing PR#18681 thanks to \IMikael Jagan.
‘str(<classed-call>)’ now deparses the call as expected, fixing PR#18684, reported by Dave Slager.
Probability distribution functions ‘[dpq]<distrib>(x, *)’, but also ‘bessel[IKJY](x, .)’ now consistently preserve ‘attributes(x)’ when ‘length(x) == 0’, e.g., for a 2 x 0 matrix, thanks to \IKarolis Koncevičius' report PR#18509.
Directories are now omitted by ‘file.copy(, recursive = FALSE)’ and in ‘file.append()’ (PR#17337).
‘density()’ more consistently computes grid values for the FFT-based convolution, following \IRobert Schlicht's analysis and proposal in PR#18337, correcting density values typically by a factor of about 0.999. Argument ‘old.coords = TRUE’ provides back compatibility.
Comparisons for language objects (which are based on deparsing) are now more careful about using accurate deparsed results (PR#18676).
The 12 ‘as.data.frame.<class>()’ methods which were deprecated only via ‘_R_CHECK_AS_DATA_FRAME_EXPLICIT_METHOD_’ and in ‘R CMD check --as-cran’ are formally deprecated now in favour of calling ‘as.data.frame()’ or ‘as.data.frame.vector()’.
Plain-text help (‘Rd2txt’) now correctly preserves blank lines following single-line \dontrun code.
Experimental ‘balancePOSIXlt()’ utility allows using “ragged” and or out-of-range ‘"POSIXlt"’ objects more correctly, e.g., in subsetting and \Isubassignments. Such objects are now documented. Complemented by the low-level ‘unCfillPOSIXlt()’ utility.
More experimentally, a ‘"POSIXlt"’ object may have an attribute ‘"balanced"’ indicating if it is known to be filled or fully balanced.
The Rd filter for ‘aspell()’ gains an ‘ignore’ argument.
Comparisons for language objects, which are based on deparsing, are now more careful about using accurate deparsed results (PR#18676).
The ‘confint()’ and ‘profile’ methods for ‘"glm"’ objects have gained a possibility to do profiling based on the \IRao Score statistic in addition to the default Likelihood Ratio. This is controlled by a new ‘test =’ argument.
Serializations can now be interrupted (e.g., by ‘Ctrl-C’ on a Unix-alike) if they take too long, e.g., from ‘save.image()’, thanks to suggestions by \IIvan Krylov and others on R-devel.
‘memDecompress(type = "unknown")’ recognizes compression in the default ‘\Izlib’ format as used by ‘memCompress(type = "gzip")’.
Hexadecimal string colour specifications are now accepted in short form, so, for example, we can use ‘"#123"’, which is equivalent to ‘"#112233"’.
Thanks to \IMikeFC for the original idea and \IElla Kaye, \IMalcolm Barrett, \IGeorge Stagg, and \IHanne Oberman for the patch.
Where characters are attempted to be plotted by ‘pdf()’, ‘postscript()’ and ‘xfig()’ which are not in the selected 8-bit character set (most often Latin-1) and the R session is using a UTF-8 locale, the warning messages will show the UTF-8 character rather than its bytes and one dot will be substituted per character rather than per byte. (Platforms whose ‘iconv()’ does transliteration silently plot the transliteration.)
In a UTF-8 locale some transliterations are now done with a warning (e.g., dashes and Unicode minus to hyphen, ligatures are expanded, \Ipermille (‘‰’) is replaced by ‘o/oo’), although the OS may have got there first. These are warnings as they will continue to be replaced by dots in earlier versions of R.
System \Ivalgrind headers are required to use ‘configure’ option ‘--with-valgrind-instrumentation’ with value ‘1’ or ‘2’.
A new ‘configure’ option ‘--with-newAccelerate’ makes use of Apple's ‘new’ BLAS / LAPACK interfaces in their Accelerate framework. Those interfaces are only available in macOS 13.3 or later, and building requires SDK 13.3 or later (from the Command Line Tools or \IXcode 14.3 or later).
By default the option uses new Accelerate for BLAS calls: to also use it for LAPACK use ‘--with-newAccelerate=lapack’. The later interfaces provide LAPACK 3.9.1 rather than 3.2.1: 3.9.1 is from 2021-04 and does not include the improved algorithms introduced in LAPACK 3.10.0 (including for BLAS calls).
‘UseMethod()’ no longer forwards local variables assigned in the generic function into method call environments before evaluating the method body. This makes method calls behave more like standard function calls and makes method code easier to analyze correctly. For now, attempts to use these variables in a method will signal an error; this will eventually be dropped.
Probability distribution functions ‘[dpq]<distrib>(x, *)’, but also ‘bessel[IKJY](x, .)’ are now consistently preserving ‘attributes(x)’ when ‘length(x) == 0’, e.g., for a 2 x 0 matrix, thanks to \IKarolis Koncevičius' report PR#18509.
Group “Summary” computations such as ‘sum(1:3, 4, na.rm = 5, NA, 7, na.rm = LL)’ now give an error instead of either ‘17’ or ‘NN’ for ‘LL’ true or false, as proposed by \IIvan Krylov on the R-devel mailing list. (This also means it is now an error to specify ‘na.rm’ more than once.)
The handling of ‘Alt+F4’ in \Idialogs created on Windows using \IGraphApp has been fixed (PR#13870).
‘density()’ more consistently computes grid values for the FFT-based convolution, following \IRobert Schlicht's analysis and proposal in PR#18337, correcting density values typically by a factor of about 0.999. Optional ‘old.coords=TRUE’ provides back compatibility.
‘getParseData(f)’ now also works for a function defined in the first of several ‘<pkg>/R/*.R’ source files, thanks to \IKirill Müller's report and Duncan Murdoch's patch in PR#16756.
A non-blocking connection with non-default encoding (such as a socket) now correctly returns from ‘readLines()’ after new data has arrived also when its EOF had been reached previously. Thanks to \IPeter Meilstrup's report on R-devel and \IIvan Krylov's report and patch proposal in PR#18555.
‘kappa()’ and ‘rcond()’ work correctly in more cases; ‘kappa(., norm = "2")’ now warns that it computes the 1-norm with (default) ‘exact = FALSE’; prompted by \IMikael Jagan's quite comprehensive PR#18543.
For ‘cbind()’ and ‘rbind()’, the optional ‘deparse.level’ argument is now properly passed to methods, thanks to \IMikael Jagan's PR#18579 and comments there.
Some error and warning messages for large (‘long vector’) ‘matrix(v, nr, nc)’ and ‘dim(m) <- d’ are now correct about sizes, using ‘long long’ formatting, fixing PR#18612 (and more) reported by \IMikael Jagan.
‘drop.terms(*)’ now drops response as by default, ‘keep.response = FALSE’, fixing PR#18564 thanks to \IMikael Jagan.
‘dummy.coef(.)’ now also works for ‘lm()’-models with ‘character’ categorical predictor variables rather than ‘factor’ ones, fixing PR#18635 reported by \IJinsong Zhao.
‘dgeom()’ is more accurate now, notably when its result is very small, fixing PR#18642 thanks to the proposal of \IMorten Welinder, also improving other instances where C level ‘binom_raw(x, n, ..)’ has ‘x == 0’ or ‘x== n’.
Arguments are now properly forwarded to methods on S4 generics with ... in the middle of their formal arguments. This was broken for the case when a method introduced an argument but did not include ... in its own formals. Thanks to \IHervé Pagès for the report PR#18538.
‘rank(<long vector>)’ now works, fixing PR#18617, thanks to \IIlia Kats.
‘match(<POSIXct>, .)’ is correct again for differing time zones, ditto for ‘"POSIXlt"’, fixing PR#18618 reported by \IBastian Klein.
‘drop.terms(*, dropx = <0-length>)’ now works, fixing PR#18563 as proposed by \IMikael Jagan.
‘drop.terms(*)’ keeps ‘ + offset(.)’ terms when it should, PR#18565, and ‘drop.terms()’ no longer makes up a response, PR#18566, fixing both bugs thanks to \IMikael Jagan.
‘rank(x)’ no longer overflows during integer addition, when computing rank average for largish but not-yet long vector ‘x’, fixing PR#18630, thanks to \IIlia Kats.
‘cov2cor(<0 x 0>)’ now works, fixing PR#18423 thanks to \IMikael Jagan and \IElin Waring.
‘cov2cor(<negative diagonal>)’ and similar now give one warning instead of two, with better wording, fixing PR#18424 thanks to \IMikael Jagan.
‘predict(<rank-deficient lm>, newdata=*)’ fix computing of ‘nbasis’, see \IRuss Lenth's comment 29 in PR#16158.
‘trans3d()’ gains options ‘continuous’ and ‘verbose’ addressing the problem of possible “wrap around” when projecting too long curves, as reported by \IAchim Zeileis in PR#18537.
There is some support for building with Intel's \ILLVM-based compilers on ‘x86_64’ Linux, such as (C) ‘icx’, (C++) ‘ipcx’ and (Fortran) ‘ifx’ from \IoneAPI 2023.x.y.
There is support for using \ILLVM's ‘flang-new’ as the Fortran compiler from \ILLVM 16.0.x (preferably 17.0.0 or later).
‘readChar(., 4e8)’ no longer fails, thanks to \IKodi Arfer's report (PR#18557).
‘qqplot(x,y, conf.level=.)’ gives better confidence bounds when ‘length(x) != length(y)’, thanks to \IAlexander Ploner's report and patch proposal (PR#18557).
‘norm(<0-length>, "2")’ now gives zero instead of an error, as all the other norm types, thanks to \IMikael Jagan's PR#18542.
‘tar(*, tar = "internal")’ no longer creates out-of-spec tar files in the very rare case of user or group names longer than 32 bytes, fixing PR#17871 with thanks to \IIvan Krylov.
When using the “internal” timezone datetime code, adding a fraction of a second no longer adds one second, fixing PR#16856 from a patch by \IIvan Krylov.
‘tools::Rdiff()’ is now more robust against invalid strings, fixing installation tests on Windows without \IRtools installed (PR#18530).
Fix (new) bug in ‘hcl.colors(2, *)’, by \IAchim Zeileis (PR#18523).
‘na.contiguous(x)’ now also returns the first run, when it is at the beginning and there is a later one of the same length; reported to R-devel, including a fix, by \IGeorgi Boshnakov. Further, by default, it modifies only an existing ‘attr(*,"tsp")’ but otherwise no longer sets one.
‘chol(<not pos.def>, pivot = <T|F>)’ now gives a correct error or warning message (depending on ‘pivot’), thanks to \IMikael Jagan's (PR#18541).
‘qqplot(x, y, ...)’ gains ‘conf.level’ and ‘conf.args’ arguments for computing and plotting a confidence band for the treatment function transforming the distribution of ‘x’ into the distribution of ‘y ’ (\ISwitzer, 1976, _\IBiometrika_). Contributed by \ITorsten Hothorn.
Added new unit prefixes ‘"R"’ and ‘"Q"’ for abbreviating (unrealistically large) sizes beyond 10^{27} in ‘standard = "SI"’, thanks to \IHenrik Bengtsson's PR#18435.
‘as.data.frame()’'s default method now also works fine with atomic objects inheriting from classes such as ‘"roman"’, ‘"octmode"’ and ‘"hexmode"’, such fulfilling the wish of PR#18421, by \IBenjamin Feakins.
‘predict(<rank-deficient lm>, newdata=*)’ now obeys a new argument ‘rankdeficient’, with new default ‘"warnif"’, warning only if there are non-estimable cases in ‘newdata’. Other options include ‘rankdeficient = "NA"’, predicting ‘NA’ for non-estimable ‘newdata’ cases. This addresses PR#15072 by \IRuss Lenth and is based on his original proposal and discussions in PR#16158 also by \IDavid Firth and \IElin Waring. Still somewhat experimental.
The drop-field control in \IGraphApp can now be left with the TAB key and all controls can be navigated in the reverse order using the Shift+TAB key, improving accessibility of the ‘Rgui’ configuration editor.
‘all.equal.numeric()’ gets a new optional switch ‘giveErr’ to return the numeric error as attribute. \IRelatedly, ‘stopifnot(all.equal<some>(a, b, ..))’ is as “smart” now, as ‘stopifnot(all.equal(....))’ has been already, thus allowing customized ‘all.equal<Some>()’ wrappers.
The ‘@’ operator is now an S3 generic. Based on contributions by \ITomasz Kalinowski in PR#18482.
New generic ‘chooseOpsMethod()’ provides a mechanism for objects to resolve cases where two suitable methods are found for an Ops Group Generic. This supports experimenting with alternative object systems. Based on contributions by \ITomasz Kalinowski in PR#18484.
‘inherits(x, what)’ now accepts values other than a simple character vector for argument ‘what’. A new generic, ‘nameOfClass()’, is called to resolve the class name from ‘what’. This supports experimenting with alternative object systems. Based on contributions by \ITomasz Kalinowski in PR#18485.
Detection of BLAS/LAPACK in use (‘sessionInfo()’) with \IFlexiBLAS now reports the current backend.
Calling ‘a:b’ when numeric ‘a’ or ‘b’ is longer than one may now be made into an error by setting environment variable ‘_R_CHECK_LENGTH_COLON_’ to a true value, along the proposal in PR#18419 by \IHenrik Bengtsson.
‘density(x, weights = *)’ now warns if automatic bandwidth selection happens without using ‘weights’; new optional ‘warnWbw’ may suppress the warning. Prompted by \IChristoph Dalitz' PR#18490 and its discussants.
‘rm(list = *)’ is faster and more readable thanks to \IKevin Ushey's PR#18492.
The matrix multiply operator ‘%*%’ is now an S3 generic, belonging to new group generic ‘matrixOps’. From \ITomasz Kalinowski's contribution in PR#18483.
‘as.Date.POSIXct(., tz)’ now treats several ‘tz’ values, notably ‘"GMT"’ as equivalent to ‘"UTC"’, proposed and improved by \IMichael Chirico and \IJoshua Ulrich in PR#17674.
Experimental ‘balancePOSIXlt()’ utility allows using “ragged” and or out-of-range ‘"POSIXlt"’ objects more correctly, e.g., in subsetting and \Isubassignments. Such objects are now documented.
More experimentally, a ‘"POSIXlt"’ object may have an attribute ‘"balanced"’ indicating if it is known to be filled or fully balanced.
Functions ‘axis.Date()’ and ‘axis.POSIXct()’ are rewritten to gain better default tick locations and better default formats via the corresponding ‘pretty()’ methods. Thanks to \ISwetlana Herbrandt.
The makefiles and installer scripts for Windows have been tailored to \IRtools43, an update of the \IRtools42 toolchain. It is based on GCC 12 and newer versions of \IMinGW-W64, \Ibinutils and libraries. At this time R-devel can still be built using \IRtools42 without changes, but when R-devel is installed via the installer, it will by default look for \IRtools43.
There is support for a package to indicate the version of the C standard which should be used to compile it, and for the installing user to specify this. In most cases R defaults to the C compiler's default standard which is C17 (a `bug-fix' of C11) - earlier versions of R or compilers may have defaulted to C99.
Current options are:
USE_C17 Use a standard that is at most C17. The intention is to allow legacy packages to still be installed when later C standards become the default, including packages using new keywords as identifiers or with K&R-style function declarations. This will use C17 if available, falling back to C11.
USE_C90 Use the C90 (aka C89) standard. (As that standard did not require compilers to identify that version, all we can verify is that the compiler does not claim to be using a later standard. It may accept C99 features - for example ‘clang’ accepts // to make comments.)
USE_C99 Use the C99 standard. This should be rarely needed - it avoids the few new features of C11/C17 which can be useful if a package assumes them if C17 is specified and they are not implemented.
USE_C23 Use C23 (or in future, later). Compiler/library support for C23 is still being implemented, but \ILLVM clang from 15.0.0 and GCC from 13 have quite extensive support.
These can be specified as part of the ‘SystemRequirements’ field in the package's ‘DESCRIPTION’ file or _via_ options ‘--use-C17’ and so on of ‘R CMD INSTALL’ and ‘R CMD SHLIB’.
For further details see “Writing R Extensions” §1.2.5.
\IALTREP now supports ‘VECSXP’ vectors. Contributed by \IGabor Csardi in PR#17620.
The ‘Rcomplex’ definition (in header ‘R_ext/Complex.h’) has been extended to prevent possible mis-compilation when interfacing with Fortran (PR#18430). The new definition causes compiler warnings with static initializers such as ‘{1, 2}’, which can be changed to ‘{.r=1, .i=2}’.
Using the new definition from C++ depends on compiler extensions supporting C features that have not been incorporated into the C++ standards but are available in ‘g++’ and ‘clang++’: this may result in C++ compiler warnings but these have been worked around for recent versions of common compilers (GCC, Apple/\ILLVM clang, Intel).
It is intended to change the inclusion of header ‘R_ext/Complex.h’ by other R headers, so C/C++ code files which make use of ‘Rcomplex’ should include that header explicitly.
‘R CMD check’ can optionally (but included in ‘--as-cran’) check whether HTML math rendering _via_ \IKaTeX works for the package ‘.Rd’ files.
‘R CMD check’'s ‘\Ichecking compilation flags in Makevars’ has been relaxed to accept the use of flags such as ‘-std=f2008’ in ‘PKG_FFLAGS’.
Hashed ‘environment’s with sizes less than 5 can now grow. (Reported to R-devel by \IDuncan Garmonsway.)
‘as.character(<Rd>, deparse = TRUE)’ failed to re-escape curly braces in LaTeX-like text. (Reported by \IHadley Wickham in PR#18324.)
‘library()’ now passes its ‘lib.loc’ argument when requiring ‘Depends’ packages; reported (with fix) in PR#18331 by \IMikael Jagan.
‘c(a = 1, 2)[[]]’ no longer matches ‘2’ but rather signals a _classed_ error. Reported and analysed by Davis Vaughan in PR#18367, a duplicate of PR#18004, by \IJan Meis et al. For consistency, ‘NULL[[]]’ is also erroneous now. ‘x[[]] <- v’ gives an error of the same class ‘"MissingSubscriptError"’.
‘ordered(levels = *)’ (missing ‘x’) now works analogously to ‘factor(, ordered=TRUE)’; reported (with fix) by \IAchim Zeileis in PR#18389.
‘as.POSIXlt(<Date>)’ now does apply a ‘tz’ (time zone) argument, as does ‘as.POSIXct()’; partly suggested by \IRoland Fuß on the R-devel mailing list.
‘time()’ now (also) uses the ‘ts.eps = getOption("ts.eps")’ argument and thus by default rounds values very close to the start (or end) of a year. Based on a proposal by \IAndreï V. Kostyrka on R-help.
Printing 0-length objects of class ‘"factor"’, ‘"roman"’, ‘"hexmode"’, ‘"octmode"’, ‘"person"’, ‘"bibentry"’, or ‘"citation"’ now prints something better, one of which fixes PR#18422, reported by \IBenjamin Feakins.
‘Sys.timezone()’ queries ‘timedatectl’ only if ‘systemd’ is loaded; addressing a report by \IJan Gorecki in PR#17421.
The formula method of ‘cor.test()’ had scoping problems when ‘environment(formula)’ was not the calling environment; reported with a patch proposal by \IMao Kobayashi in PR#18439.
‘attach()’ of an environment with active bindings now preserves the active bindings. Reported by \IKevin Ushey in PR#18425.
BLAS detection now works also with system-provided libraries not available as regular files. This fixes detection of the Accelerate framework on macOS since \IBig Sur. Reported by \IDavid Novgorodsky.
Package installation, ‘R CMD INSTALL’ or ‘install.packages(*)’, now parses each of the ‘<pkg>/R/*.R’ files individually instead of first concatenating and then \I‘parse()’ing the large resulting file. This allows parser or syntax errors to be diagnosed with correct file names and line numbers, thanks to \ISimon Dedman's report and Bill Dunlap's patch in PR#17859.
This _does_ require syntactically self contained R source files now, fixing another inadvertent bug.
‘predict.lm(<model with offset>)’ now finds the offset in the correct environment, thanks to \IAndré Gillibert's report and patch in PR#18456.
‘getInitial(<formula>)’ now finds the ‘selfStart’ model in the correct environment. (Reported by \IIvan Krylov in PR#18368.)
‘uniroot(f, interval)’ should no longer wrongly converge _outside_ the interval in some cases where ‘abs(f(x)) == Inf’ for an ‘x’ at the interval boundary, thanks to posts by \IBen Bolker and \ISerguei Sokol on R-devel.
Vectorized alpha handling in palette functions such as in ‘gray()’, ‘rainbow()’, or ‘hcl.colors()’ works correctly now, thanks to \IAchim Zeileis' report and patch in PR#18476.
Formatting and \I‘print()’ing of ‘bibentry’ objects has dropped the deprecated ‘citation.bibtex.max’ argument, such that the ‘bibtex’ argument's default for ‘print.bibentry()’ depends directly on the ‘citation.bibtex.max’ option, whereas in ‘format.bibentry()’ the option no longer applies.
‘bs()’ and ‘ns()’ in the (typical) case of automatic knot construction, when some of the supposedly inner knots coincide with boundary knots, now moves them inside (with a warning), building on PR#18442 by \IBen Bolker.
‘R CMD’ on Windows now skips the site profile with ‘--no-site-file’ and ‘--vanilla’ even when ‘R_PROFILE’ is set (PR#18512, from \IKevin Ushey).
(Windows) Math symbols in text drawing functions are again rendered correctly (PR#18440). This fixes a regression in R 4.2.1 caused by a fix in PR#18382 which uncovered an issue in \IGraphApp due to which the symbol charset was not used with \ITT Symbol font face.
(Windows) Installing a package with a ‘src/Makefile.{win,ucrt}’ file includes ‘~/.R/Makevars.win64’ in the search for user \Imakevars, as documented in “R Installation and Administration” and done for packages with a ‘src/Makevars.{win,ucrt}’ file.
‘format(<POSIXlt_w/_unbalanced_sec>, "....%OS<n>")’ with n > 0 no longer accidentally uses the unbalanced seconds, thanks to \ISuharto Anggono's report (including patch) in PR#18448.
When ‘UseMethod()’ cannot dispatch, it no longer segfaults producing the error message in case of a long ‘class()’, thanks to \IJoris Vankerschaver's report (including patch) in PR#18447.
When ‘example(foo, ..)’ produces graphics on an interactive device it needs to open itself, it now leaves ‘devAskNewPage()’ unchanged even when it was ‘FALSE’, thus fixing a 14 years old ‘\IFIXME’.
(macOS) The run-time check for libraries from \IXQuartz for X11 and Tcl/Tk no longer uses ‘otool’ from the Apple Developer Tools (PR#18400).
There is now ‘configure’ support for \ILLVM clang 15 on Linux, which defaults to position-independent (PIE) executables whereas ‘gfortran’ does not.
Many small changes to ease compilation (and suppress warnings) with \ILLVM ‘clang’ 15.
‘Rscript -e’ would fail if ‘stdin’ were closed (Reported by \IHenrik Bengtsson.)
When ‘isGeneric(f, fdef=*)’ is used with mismatching names, the warning is better understandable; reported (with fix) in PR#18370 by \IGabe Becker.
‘as.POSIXlt(x)’ now also works with very large dates ‘x’, fixing PR#18401 reported by \IHannes Mühleisen.
Files can now be extracted even from very large zip archives (PR#18390, thanks to \IMartin Jakt).
Non-ASCII characters are now properly displayed on Windows in windows created using \IGraphApp via e.g. ‘winDialogString’ thanks to a workaround for an at least surprising Windows behavior with UTF-8 as the system encoding (PR#18382).
Computation of window size based on requested client size in \IGraphApp when running in a multi-byte locale on Windows has been fixed (regression in R 4.2.0 for users of systems where R 4.1 used a single-byte locale). ‘Rgui’ again respects the number of console rows and columns given in ‘Rconsole’ file.
The libraries searched for by ‘--with-blas’ (without a value) now include \IBLIS (after \IOpenBLAS but before ATLAS). And on macOS, the Accelerate framework (after ATLAS). (This is patterned after the ‘AX_BLAS’ macro from the \IAutoconf Archive.)
C function ‘getlocale’ no longer attempts to query an unsupported category from the OS, even when requested at R level, which may cause crashes when R 4.2.0 (which uses UCRT) is embedded (reported by \IKevin Ushey).
Accent keys now work in \IGraphApp Unicode windows, which are used by ‘Rgui’ whenever running in a multibyte locale (so also in UTF-8, hence fixing a regression in R 4.2.0 for users of systems where R 4.1 used a single-byte locale).
Text injection from external applications via ‘SendInput’ now works in \IGraphApp Unicode windows, fixing a regression in R 4.2.0 for ‘Rgui’ users of systems where R 4.1 used a single-byte locale but R 4.2.0 uses UTF-8.
The ‘formula’ method of ‘aggregate()’ now matches the generic in naming its first argument ‘x’ (resolving PR#18299 by \IThomas Soeiro).
This means that calling ‘aggregate()’ with a formula as a named first argument requires name ‘formula’ in earlier versions of R and name ‘x’ now, so portable code should not name the argument (code in many packages did).
Windows users should consult the WINDOWS section below for some profound changes including
• Support for 32-bit builds has been dropped.
• UTF-8 locales are used where available.
• The default locations for the R installation and personal library folder have been changed.
Thanks to \ITomas Kalibera for months of work on the Windows port for this release.
‘matrix(x, n, m)’ now warns in more cases where ‘length(x)’ differs from ‘n * m’, as suggested by \IAbby Spurdle and \IWolfgang Huber in Feb 2021 on the R-devel mailing list.
This warning can be turned into an error by setting environment variable ‘_R_CHECK_MATRIX_DATA_’ to ‘TRUE’: ‘R CMD check --as-cran’ does so unless it is already set.
The R \IMathlib internal C function ‘bd0()’ (called indirectly from a dozen probability density and distribution functions such as ‘dpois()’, ‘dbinom()’, ‘dgamma()’, ‘pgamma()’ _etc_) has been complemented by a more sophisticated and (mostly) more accurate C function ‘ebd0()’, currently called only by internal ‘dpois_raw()’ improving accuracy for R level ‘dpois()’ and potentially others calling it such as ‘dnbinom()’, ‘dgamma()’ or ‘pgamma()’. (Thanks to \IMorten Welinder's PR#15628.)
‘write.ftable()’ gains ‘sep = " "’ argument as suggested by \IThomas Soeiro.
‘substr(ch, start,end) <- new’ now e.g., preserves ‘names(ch)’; ditto for ‘substring()’, thanks to a patch from \IBrodie Gaslam.
‘plot(<lm>)’ gains a ‘extend.ylim.f’ argument, in partial response to PR#15285; further PR#17784 is fixed thanks to several contributors and a patch by \IElin Waring. The Cook's dist contours get customizable via ‘cook.col’ and ‘cook.lty’ with a different default color and their legend is nicer by default and customizable via ‘cook.legendChanges’.
Attempting to subset an object that is not \Isubsettable now signals an error of class ‘notSubsettableError’. The non-\Isubsettable object is contained in the ‘object’ field of the error condition.
‘reorder()’ gets an argument ‘decreasing’ which it passes to ‘sort()’ for level creation; based on the wish and patch by \IThomas Soeiro in PR#18243.
‘as.vector()’ gains a ‘data.frame’ method which returns a simple named list, also clearing a long standing ‘\IFIXME’ to enable ‘as.vector(<data.frame>, mode="list")’. This breaks code relying on ‘as.vector(<data.frame>)’ to return the unchanged data frame.
‘legend()’ is now vectorized for arguments ‘cex’, ‘x.intersp’, and ‘text.width’. The latter can now also be specified as a vector (one element for each column of the legend) or as ‘NA’ for computing a proper column wise maximum value of ‘strwidth(legend)’. The argument ‘y.intersp’ can be specified as a vector with one entry for each row of the legend.
‘legend()’ also gains new arguments ‘title.cex’ and ‘title.font’. Thanks to \ISwetlana Herbrandt.
‘ks.test()’ now provides exact p-values also with ties and MC p-values in the two-sample (Smirnov) case. By \ITorsten Hothorn.
‘ks.test()’ gains a formula interface, with ‘y ~ 1’ for the one-sample (Kolmogorov) test and ‘y ~ group’ for the two-sample (Smirnov) test. Contributed by \ITorsten Hothorn.
‘trunc(<Date>, *)’ now supports ‘units = "months"’ or ‘"years"’ for consistency with the ‘POSIXt’ method, thanks to \IDirk Eddelbuettel's proposal in PR#18099.
The HTML help system has several new features: LaTeX-like math can be typeset using either \IKaTeX or \IMathJax, usage and example code is highlighted using Prism, and for dynamic help the output of examples and demos can be shown within the browser if the ‘knitr’ package is installed. These features can be disabled by setting the environment variable ‘_R_HELP_ENABLE_ENHANCED_HTML_’ to a false value.
Make files and installer scripts for Windows have been tailored to ‘Rtools42’, the newly recommended 64-bit ‘gcc’ 10.3 \IMinGW-W64 UCRT toolchain.
‘Rtools42’ by default uses the Windows security features \IASLR and \IDEP; hence CRAN builds of R and packages also do.
‘Rtools42’ includes an unpatched \IMsys2 build of GNU ‘tar’. Paths including drive letters can be made to work by adding ‘--force-local’ to environment variable ‘TAR_OPTIONS’. (‘Rtools40’ and earlier included a patched version which defaulted to this option.)
The clipboard connection now works also with text in other than the current native encoding (PR#18267, with \IHiroaki Yutani). Text is always pasted to the clipboard in UTF16-LE and the ‘encoding’ argument is ignored.
Facilities for accessing ‘ftp://’ sites are no longer tested (except _\Ipro tem_ for ‘curlGetHeaders()’) as modern browsers have removed support.
Package installation speed for packages installed with ‘keep.source’ has been improved. This resolve the issue reported by \IOfek Shilon in PR#18236.
‘R CMD Rd2pdf’ now always runs LaTeX in batch mode, consistent with \ITexinfo >= 6.7. The ‘--batch’ option is ignored.
‘density(x, weights = w, na.rm = TRUE)’ when ‘anyNA(x)’ is true, now removes weights “in parallel” to ‘x’, fixing PR#18151, reported by \IMatthias Gondan. Additionally, it gets a ‘subdensity’ option.
Conversion of \Sexpr[]{<expR>} to LaTeX or HTML no longer produces long blocks of empty lines when ‘<expR>’ itself contains several lines all producing empty output. Thanks to a report and patch by \IIvan Krylov posted to R-devel.
Improved determination of the correct translation domain in non-base packages, addressing the combination of PR#18092 and PR#17998 (‘#c6’) with reports and _augmented_ patch #2904 by \ISuharto Anggono.
Note that ‘"R-base"’ is no longer the default domain e.g., for top-level calls to ‘gettext()’; rather translation needs explicit ‘domain = *’ specification in such cases.
‘identical(attrib.as.set=FALSE)’ now works correctly with data frames with default row names (Thanks to \ICharlie Gao's PR#18179).
‘dimnames(table(d))’ is more consistent in the case where ‘d’ is a list with a single component, thanks to \IThomas Soeiro's report to R-devel.
Further, ‘table(d1, d2)’ now gives an error when ‘d1’ and ‘d2’ are data frames as suggested by Thomas in PR#18224.
The \Ideparser now wraps sub-expressions such as ‘if(A) .. ’ with parentheses when needed; thanks to Duncan Murdoch's PR#18232 and \ILionel Henry's patches there.
‘x[i]’ and ‘x[[i]]’ for non-integer ‘i’ should now behave in all cases as always documented: the index used is equivalent to ‘as.integer(i)’ unless that would overflow where ‘trunc(i)’ is used instead; thanks to \ISuharto Anggono's report and patch proposals in PR#17977.
The default LaTeX style file ‘Sweave.sty’ used by the ‘RweaveLatex’ driver no longer loads the obsolete ‘ae’ package; thanks to a report by \IThomas Soeiro in PR#18271. Furthermore, it now skips ‘\usepackage[T1]{fontenc}’ for engines other than \IpdfTeX (if detected) or if the new ‘[nofontenc]’ option is used.
‘setAs()’ finds the correct class for name ‘to’ when multiple packages define a class with that name. Thanks to \IGabor Csardi for the report.
Fix for detaching a package when two classes of the same name are present in method signatures for the same generic. Thanks to \IGabor Csardi for the report.
‘match.arg("", c("", "a", "B"))’ gives a better error message, in part from PR#17959, thanks to \IElin Waring.
Deparsing constructs such as ‘quote(1 + `!`(2) + 3)’ works again as before R 3.5.0, thanks to the report and patch in PR#18284 by \ISuharto Anggono.
‘qbeta(.001, .9, .009)’ and analogous ‘qf()’ calls now return a correct value instead of ‘NaN’ or wrongly ‘1’, all with a warning; thanks to the report by \ILudger Goeminne in PR#18302.
Not strictly fixing a bug, \I‘format()’ing and \I‘print()’ing of non-finite ‘Date’ and ‘POSIXt’ values ‘NaN’ and +/-‘Inf’ no longer show as ‘NA’ but the respective string, e.g., ‘Inf’, for consistency with numeric vector's behaviour, fulfilling the wish of PR#18308.
Fixed quoting of ‘~autodetect~’ in Java setting defaults to avoid inadvertent user lookup due to leading ‘~’, reported in PR#18231 by \IHarold Gutch.
‘substr(., start, stop) <- v’ now treats _negative_ ‘stop’ values correctly. Reported with a patch in PR#18228 by \IBrodie Gaslam.
Subscripting an array ‘x’ without dimnames by a ‘length(dim(x))’-column character matrix gave "random" non-sense, now an error; reported in PR#18244 by \IMikael Jagan.
Modifying ‘globalCallingHandlers’ inside ‘withCallingHandlers()’ now works or fails correctly, thanks to \IHenrik Bengtsson's PR#18257.
‘qbeta(.001, .9, .009)’ and similar cases now converge correctly thanks to \IBen Bolker's report in PR#17746.
‘model.weights()’ and ‘model.offset()’ more carefully extract their model components, thanks to \IBen Bolker and Tim Taylor's R-devel post.
If the ‘R_NO_SEGV_HANDLER’ environment variable is non-empty, the signal handler for \ISEGV/ILL/BUS signals (which offers recovery user interface) is not set. This allows more reliable debugging of crashes that involve the console.
\Sexpr{ch} now preserves ‘Encoding(ch)’. (Thanks to report and patch by \IJeroen Ooms in PR#18152.)
Setting the RNG to ‘"Marsaglia-Multicarry"’ e.g., by ‘RNGkind()’, now warns in more places, thanks to \IAndré Gillibert's report and patch in PR#18168.
‘gray(numeric(), alpha=1/2)’ no longer segfaults, fixing PR#18183, reported by \ITill Krenz.
‘try()’ is considerably faster in case of an error and long call, as e.g., from some ‘do.call()’. Thanks to \IAlexander Kaever's suggestion posted to R-devel.
Non-integer ‘mgp’ ‘par()’ settings are now handled correctly in ‘axis()’ and ‘mtext()’, thanks to \IMikael Jagan and Duncan Murdoch's report and suggestion in PR#18194.
‘dnbinom(20, <large>, 1)’ now correctly gives 0, and similar cases are more accurate with underflow precaution. (Reported by \IFrancisco Vera Alcivar in PR#18072.)
The checking of the size of tarball in ‘R CMD check --as-cran <pkg>’ may be tweaked via the new environment variable ‘_R_CHECK_CRAN_INCOMING_TARBALL_THRESHOLD_’, as suggested in PR#17777 by \IJan Gorecki.
The ‘format()’ method for class ‘"ftable"’ gets a new option ‘justify’. (Suggested by \IThomas Soeiro.)
New ‘...names()’ utility. (Proposed by \INeal Fultz in PR#17705.)
‘capabilities()’ gets new entry ‘"Rprof"’ which is ‘TRUE’ when R has been configured with the equivalent of ‘--enable-R-profiling’ (as it is by default). (Related to \IMichael Orlitzky's report PR#17836.)
Rudimentary support for vi-style tags in ‘rtags()’ and ‘R CMD rtags’ has been added. (Based on a patch from \INeal Fultz in PR#17214.)
Functions ‘URLencode()’ and ‘URLdecode()’ in package ‘utils’ now work on vectors of URIs. (Based on patch from \IBob Rudis submitted with PR#17873.)
‘get()’, ‘exists()’, and ‘get0()’ now signal an error if the first argument has length greater than 1. Previously additional elements were silently ignored. (Suggested by \IAntoine Fabri on R-devel.)
‘.libPaths()’ gets a new option ‘include.site’, allowing to _not_ include the site library. (Thanks to \IDario Strbenac's suggestion and \IGabe Becker's PR#18016.)
Lithuanian translations are now available. (Thanks to \IRimantas Žakauskas.)
New function ‘gregexec()’ which generalizes ‘regexec()’ to find _all_ disjoint matches and all substrings corresponding to parenthesized subexpressions of the given regular expression. (Contributed by \IBrodie Gaslam.)
Provide grouping of ‘x11()’ graphics windows within a window manager such as ‘Gnome’ or ‘Unity’; thanks to a patch by \IIvan Krylov posted to R-devel.
New palettes ‘"Rocket"’ and ‘"Mako"’ for ‘hcl.colors()’ (approximating palettes of the same name from the ‘viridisLite’ package).
Contributed by \IAchim Zeileis.
‘duplicated()’ and ‘anyDuplicated()’ are now optimized for integer and real vectors that are known to be sorted via the \IALTREP framework. Contributed by Gabriel Becker via PR#17993.
‘grSoftVersion()’ now reports the versions of \IFreeType and \IFontConfig if they are used directly (not _via_ \IPango), as is most commonly done on macOS.
There are new ‘configure’ options ‘--with-internal-iswxxxxx’, ‘--with-internal-towlower’ and ‘--with-internal-wcwidth’ which allows the system functions for wide-character classification, case-switching and width (‘wcwidth’ and ‘wcswidth’) to be replaced by internal ones. The first has long been used on macOS, \IAIX (and Windows) but this enables it to be unselected there and selected for other platforms (it is the new default on Solaris). The second is new in this version of R and is selected by default on macOS and Solaris. The third has long been the default and remains so as it contains customizations for East Asian languages.
System versions of these functions are often minimally implemented (sometimes only for ASCII characters) and may not cover the full range of Unicode points: for example Solaris (and Windows) only cover the Basic Multilingual Plane.
There is a new ‘configure’ option ‘--with-static-cairo’ which is the default on macOS. This should be used when only static \Icairo (and where relevant, \IPango) libraries are available.
\ICairo-based graphics devices on platforms without \IPango but with \IFreeType/\IFontConfig will make use of the latter for font selection.
There is a new text file ‘src/gnuwin32/README.compilation’, which outlines how C/Fortran code compilation is organized and documents new features:
• R can be built with Link-Time Optimization with a suitable compiler - doing so with GCC 9.2 showed several inconsistencies which have been corrected.
• There is support for cross-compiling the C and Fortran code in R and standard packages on suitable (Linux) platforms. This is mainly intended to allow developers to test later versions of compilers - for example using GCC 9.2 or 10.x has detected issues that GCC 8.3 in \IRtools40 does not.
• There is experimental support for cross-building R packages with C, C++ and/or Fortran code.
‘R CMD INSTALL’ and ‘R CMD SHLIB’ make use of their flag ‘--use-LTO’ when the ‘LTO_OPT’ make macro is set in file ‘etc/${R_ARCH}/Makeconf’ or in a personal/site ‘Makevars’ file. (For details see ‘Writing R Extensions’ §4.5.)
This provides a valuable check on code consistency. It does work with GCC 8.3 as in \IRtools40, but that does not detect everything the CRAN checks with current GCC do.
‘R CMD check’ now runs sanity checks on the use of ‘LazyData’, for example that a ‘data’ directory is present and that ‘LazyDataCompression’ is not specified without ‘LazyData’ and has a documented value. For packages with large \ILazyData databases without specifying ‘LazyDataCompression’, there is a reference to the code given in ‘Writing R Extensions’ §1.1.6 to test the choice of compression (as in all the CRAN packages tested a non-default method was preferred).
The character-classification functions used (by default) to replace the system ‘iswxxxxx’ functions on Windows, macOS and \IAIX have been updated to Unicode 13.0.0.
The character-width tables have been updated to include new assignments in Unicode 13.0.0. This included treating all control characters as having zero width.
The code for evaluating default (extended) regular expressions now uses the same character-classification functions as the rest of R (previously they differed on Windows, macOS and \IAIX).
‘parallel::detectCores()’ drops support for \IIRIX (retired in 2013).
‘boxplot()’ now also accepts ‘call’s for labels such as ‘ylab’, the same as ‘plot()’. (Reported by \IMarius Hofert.)
The help page for ‘xtabs()’ now correctly states that ‘addNA’ is setting ‘na.action = na.pass’ among others. (Reported as PR#17770 by \IThomas Soeiro.)
‘update.default()’ now calls the generic ‘update()’ on the formula to work correctly for models with extended formulas. (As reported and suggested by \INeal Fultz in PR#17865.)
‘x[[2^31]] <- v’ now works. (Thanks to the report and patch by \ISuharto Anggono in PR#17330.)
‘unsplit()’ had trouble with \Itibbles due to unsound use of ‘rep(NA, len)’-indexing, which should use ‘NA_integer_’ (Reported to R-devel by \IMario Annau.)
Message translation domains, e.g., for errors and warnings, are now correctly determined also when e.g., a ‘base’ function is called from “top-level” function (i.e., defined in ‘globalenv()’), thanks to a patch from \IJoris Goosen fixing PR#17998.
There is a further workaround for \IFreeType giving incorrect italic font faces with \Icairo-based graphics devices on macOS.
‘cut.Date()’ and ‘cut.POSIXt()’ could produce an empty last interval for ‘breaks = "months"’ or ‘breaks = "years"’. (Reported as PR#18053 by \IChristopher Carbone.)
Unicode character width tables (as used by ‘nchar(, type = "w")’) have been updated to Unicode 12.1 by \IBrodie Gaslam (PR#17781), including many emoji.
The internal table for ‘iswprint’ (used on Windows, macOS and \IAIX) has been updated to include many recent Unicode characters.
‘(~ NULL)[1]’ and similar formula subsetting now works, thanks to a report and patch by \IHenrik Bengtsson in PR#17935. Additionally, subsetting leaving an empty formula now works too, thanks to suggestions by \ISuharto Anggono.
‘.traceback(n)’ keeps source references again, as before R 4.0.0, fixing a regression; introduced by the PR#17580, reported including two patch proposals by \IBrodie Gaslam.
‘unlist(plst, recursive=FALSE)’ no longer drops content for pairlists with list components, thanks to the report and patch by \ISuharto Anggono in PR#17950.
‘iconvlist()’ now also works on \IMUSL based (Linux) systems, from a report and patch suggestion by \IWesley Chan in PR#17970.
Fix \I(auto-)‘print()’ing of named complex vectors, see PR#17868 and PR#18019.
‘as.data.frame.list(L, row.names=NULL)’ now behaves in line with ‘data.frame()’, disregarding names of components of ‘L’, fixing PR#18034, reported by \IKevin Tappe.
macOS: Quartz device live drawing could fail (no plot is shown) if the system changes the drawing context after view update (often the case since macOS \IBig Sur). System log may show \I"CGContextDelegateCreateForContext: invalid context" error.
Low-level socket read/write operations have been fixed to correctly signal communication errors. Previously, such errors could lead to a segfault due to invalid memory access. Reported and debugged by \IDmitriy Selivanov in PR#17850.
‘quantile(x, pr)’ works more consistently for ‘pr’ values slightly outside [0,1], thanks to \ISuharto Anggono's PR#17891.
Further, ‘quantile(x, prN, names=FALSE)’ now works even when ‘prN’ contains ‘NA’s, thanks to \IAnggono's PR#17892. Ditto for ordered factors or ‘Date’ objects when ‘type = 1’ or ‘3’, thanks to PR#17899.
Internet access based on \Ilibcurl, including ‘curlGetHeaders()’, was not respecting the ‘"timeout"’ option. If this causes unanticipated timeouts, consider increasing the default by setting ‘R_DEFAULT_INTERNET_TIMEOUT’.
‘isS3stdGeneric(f)’ now detects an S3 generic also when it is ‘trace()’d, thanks to \IGabe Becker's PR#17917.
‘phyper(11, 15, 0, 12, log.p=TRUE)’ no longer gives ‘NaN’; reported as PR#17271 by \IAlexey Stukalov.
‘on.exit()’ now correctly matches named arguments, thanks to PR#17815 (including patch) by \IBrodie Gaslam.
‘aov(frml, ...)’ now also works where the ‘formula’ deparses to more than 500 characters, thanks to a report and patch proposal by \IJan Hauffa.
Fix for adding two complex ‘grid’ units via ‘sum()’. Thanks to \IGu Zuguang for the report and \IThomas Lin Pedersen for the patch.
Computing the ‘base’ value, i.e., 2, “everywhere”, now uses ‘FLT_RADIX’, as the original ‘machar’ code looped indefinitely on the \Ippc64 architecture for the ‘longdouble’ case.
Parse data for raw strings is now recorded correctly. Reported by \IGabor Csardi.
‘DF2formula()’, the utility for the data frame method of ‘formula()’, now works without parsing and explicit evaluation, starting from \ISuharto Anggono's suggestion in PR#17555.
The internal traceback object produced when an error is signalled (‘.Traceback’), now contains the ‘call’s rather than the _‘deparse()’d_ calls, deferring the deparsing to the user-level functions ‘.traceback()’ and ‘traceback()’. This fulfils the wish of PR#17580, reported including two patch proposals by \IBrodie Gaslam.
For ‘head(x, n)’ and ‘tail()’ the default and other S3 methods notably for _vector_ ‘n’, e.g. to get a “corner” of a matrix, has been extended to ‘array’'s of higher dimension thanks to the patch proposal by \IGabe Becker in PR#17652. Consequently, optional argument ‘addrownums’ is deprecated and replaced by the (more general) argument ‘keepnums’. An invalid second argument ‘n’ now leads to typically more easily readable error messages.
‘sequence()’ is now an S3 generic with an internally implemented default method, and gains arguments to generate more complex sequences. Based on code from the ‘S4Vectors’ Bioconductor package and the advice of \IHervé Pagès.
‘stopifnot()’ now allows customizing error messages via argument names, thanks to a patch proposal by \INeal Fultz in PR#17688.
The internal implementation of ‘grid’ units has changed, but the only visible effects at user-level should be
• a slightly different print format for some units (especially unit arithmetic),
• faster performance (for unit operations) and
• two new functions ‘unitType()’ and ‘unit.psum()’.
Based on code contributed by \IThomas Lin Pedersen.
For consistency, ‘N <- NULL; N[[1]] <- val’ now turns ‘N’ into a ‘list’ also when ‘val)’ has length one. This enables ‘dimnames(r1)[[1]] <- "R1"’ for a 1-row matrix ‘r1’, fixing PR#17719 reported by \ISerguei Sokol.
New argument ‘symbolfamily’ in \Icairo-based graphics devices and new function ‘cairoSymbolFont()’ that can be used to provide the value for that argument.
‘Rterm’ gains a new option ‘--workspace’ to specify the workspace to be restored. This allows equals to be part of the name when opening _via_ Windows file associations (reported by \IChristian Asseburg).
‘Rterm’ now accepts ‘ALT+xxx’ sequences also with \INumLock on. Tilde can be pasted with an Italian keyboard (PR#17679).
‘R CMD check’ now optionally checks ‘configure’ and ‘cleanup’ scripts for non-\IBourne-shell code (‘bashisms’).
‘stopifnot()’ gets new argument ‘exprObject’ to allow an R object of class ‘expression’ (or other ‘language’) to work more consistently, thanks to suggestions by \ISuharto Anggono.
‘conformMethod()’ now works correctly in cases containing a “‘&&’ logic” bug, reported by \IHenrik Bengtsson. It now creates methods with ‘"missing"’ entries in the signature. Consequently, ‘rematchDefinition()’ is amended to use appropriate ‘.local()’ calls with named arguments where needed.
‘postscript(.., title = *)’ now signals an error when the title string contains a character which would produce corrupt PostScript, thanks to PR#17607 by \IDaisuko Ogawa.
Certain ‘Ops’ (notably comparison such as ‘==’) now also work for 0-length data frames, after reports by \IHilmar Berger.
‘dnorm’ had a problematic corner case with ‘sd == -Inf’ or negative ‘sd’ which was not flagged as an error in all cases. Thanks to \IStephen D. Weigand for reporting and \IWang Jiefei for analyzing this; similar change has been made in ‘dlnorm()’.
Time-series ‘ts(*, start, end, frequency)’ with fractional ‘frequency’ are supported more consistently; thanks to a report from \IJohann Kleinbub and analysis and patch by Duncan Murdoch in PR#17669.
‘as.difftime()’ gets new optional ‘tz = "UTC"’ argument which should fix behaviour during daylight-savings-changeover days, fixing PR#16764, thanks to proposals and analysis by \IJohannes Ranke and \IKirill Müller.
The warning message when attempting to export an nonexistent class is now more readable; thanks to \IThierry Onkelinx for recognizing the problem.
‘dotchart()’ now places the y-axis label (‘ylab’) much better, not overplotting labels, thanks to a report and suggestion by \IAlexey Shipunov.
‘anova.glm()’ and ‘anova.glmlist()’ computed incorrect score (\IRao) tests in no-intercept cases. (\IAndré Gillibert, PR#17735)
‘summaryRprof()’ now should work correctly for the ‘Rprof(*, memory.profiling=TRUE)’ case with small chunk size (and ‘"tseries"’ or similar) thanks to a patch proposal by \IBenjamin Tyner, in PR#15886.
‘xgettext()’ ignores strings passed to ‘ngettext()’, since the latter is handled by ‘xngettext()’. Thanks to \IDaniele Medri for the report and all the recent work he has done on the Italian translations.
‘x[[Inf]]’ (returning ‘NULL’) no longer leads to undefined behavior, thanks to a report by \IKirill Müller in PR#17756. Further, ‘x[[-Inf]]’ and ‘x[[-n]]’ now give more helpful error messages.
‘Rterm’ now accepts enhanced/arrow keys also with \IConPTY.
Added a work-around for a bug in macOS 14.3.1 and higher which prevents R plots in the Quartz Cocoa device from updating on screen.
‘R CMD INSTALL’ (and hence ‘check’) will compile C++ code with ‘-DR_NO_REMAP’ if environment variable ‘_R_CXX_USE_NO_REMAP_’ is set to a true value. It is planned that this will in future become the default for compiling C++.
‘pmatch(x, table)’ for large ‘table’, also called for data frame row
selection, ‘dfrm[nm, ]’, is now interruptible, fixing PR#18656.
‘pmatch(x, table)’ for large ‘table’, also called for data frame row selection, ‘dfrm[nm, ]’, is now interruptible, fixing PR#18656.
‘predict(<rank-deficient lm>, newdata=*)’ fix computing of ‘nbasis’, see Russ Lenth's comment 29 in PR#16158.
When checking Rd files, ‘R CMD check’ now notes some of the “lost braces” that ‘tools::checkRd()’ finds. Typical problems are Rd macros missing the initial backslash (e.g., ‘code{...}’), in-text set notation (e.g., ‘{1, 2}’, where the braces need escaping), and \itemize lists with \describe-style entries of the form \item{label}{description}.
‘axis.Date()’ and ‘axis.POSIXct()’ now respect the ‘par("lab")’ setting for the number of ‘pretty()’ intervals.
Functions ‘axis.Date()’ and ‘axis.POSIXct()’ are rewritten to gain better default tick locations and better default formats via the corresponding ‘pretty()’ methods. Thanks to Swetlana Herbrandt.
‘iconv()’ now fixes up variant encoding names such as ‘"utf8"’ case-insensitively.
The legacy ‘encoding = "MacRoman"’ is deprecated in ‘pdf()’ and ‘postscript()’: support was incomplete in earlier versions of R.
Arguments are now properly forwarded to methods on S4 generics with ... in the middle of their formal arguments. This was broken for the case when a method introduced an argument but did not include ... in its own formals. Thanks to Hervé Pagès for the report PR#18538.
Some invalid ‘file’ arguments to ‘pictex()’, ‘postscript()’ and ‘xfig()’ opened a file called ‘NA’ rather than throw an error. These included ‘postscript(NULL)’ (which some people expected to work like ‘pdf(NULL)’).
Passing ‘filename = NA’ to ‘svg()’, ‘cairo_pdf()’, ‘cairo_ps()’ or the Cairo-based bitmap devices opened a file called ‘NA’: it now throws an error.
‘quartz(file = NA)’ opened a file called ‘NA’, including when used as a Quartz-based bitmap device. It now gives an error.
‘rank(<long vector>)’ now works, fixing PR#18617, thanks to Ilia Kats.
‘seq.int()’ did not adequately check its ‘length.out’ argument.
‘match(<POSIXct>, .)’ is correct again for differing time zones, ditto for ‘"POSIXlt"’, fixing PR#18618 reported by Bastian Klein.
‘drop.terms(*, dropx = <0-length>)’ now works, fixing PR#18563 as proposed by Mikael Jagan.
‘drop.terms(*)’ keeps ‘ + offset(.)’ terms when it should, PR#18565, and ‘drop.terms()’ no longer makes up a response, PR#18566, fixing both bugs thanks to Mikael Jagan.
‘getS3method("t", "test")’ no longer finds the ‘t.test()’ function, fixing PR#18627.
‘pdf()’ and ‘postscript()’ support for the documented Adobe encodings ‘"Greek"’ and ‘"Cyrilllic"’ was missing (although the corresponding Windows' codepages could be used).
Computations of glyph metric information for ‘pdf()’ and ‘postscript()’ did not take into account that transliteration could replace one character by two or more (only seen on macOS 14) and typically warned that the information was not known.
‘rank(x)’ no longer overflows during integer addition, when computing rank average for largish but not-yet long vector ‘x’, fixing PR#18630, thanks to Ilia Kats.
‘list.files()’ on Windows now returns also files with names longer that 260 bytes (the Windows limit is 260 characters). Previously, some file names particularly with ‘East Asian’ characters were omitted.
‘cov2cor(<0 x 0>)’ now works, fixing PR#18423 thanks to Mikael Jagan and Elin Waring.
‘cov2cor(<negative diagonal>)’ and similar now give one warning instead of two, with better wording, fixing PR#18424 thanks to Mikael Jagan.
‘tools’‘:: startDynamicHelp()’ now ensures ‘port’ is in proper range, fixing PR#18645.
‘pbeta(x, a,b)’ is correct now for ‘x’=0 or 1 in the boundary cases where ‘a’ or ‘b’ or both are 0, fixing PR#18672 thanks to Michael Fay.
The list of base and recommended package names is now provided by ‘tools::standard_package_names()’.
‘L %||% R’ newly in ‘base’ is an expressive idiom for the ‘if(!is.null(L)) L else R’ or ‘if(is.null(L)) R else L’ phrases.
‘R CMD check’ now visits ‘inst/NEWS.Rd’ and OS-specific ‘man’ subdirectories when checking Rd files.
‘is.R()’ is deprecated as no other S dialect is known to be in use (and this could only identify historical dialects, not future ones).
For now, further information on calls can be obtained by setting environment variable ‘_R_DEPRECATED_IS_R_’. Value ‘warn’ gives a warning as per the default except immediately, value ‘error’ turns this warning into an error (so by default gives a traceback), value ‘traceback’ gives a traceback in a message (not a warning, as that may truncate) and value ‘where’ gives the call to the function (if any) calling ‘is.R’ and which namespace it is from. Value ‘self’ is a variant of ‘where’ for use by ‘R CMD check --as-cran’.
The level reported in the ‘browser’ prompt was often too large. It now shows the number of browser contexts on the stack.
‘pmatch(x, table)’ for large ‘table’, also called for data frame row selection, ‘dfrm[nm, ]’, is now interruptible, fixing PR#18656.
‘cov2cor(<0 x 0>)’ now works, fixing PR#18423 thanks to Mikael Jagan and Elin Waring.
‘inherits(x, what)’ now accepts values other than a simple character vector for argument ‘what’. A new generic, ‘nameOfClass()’, is called to resolve the class name from ‘what’. This supports experimenting with alternative object systems. Based on contributions by Tomasz Kalinowski in PR#18485.
Functions ‘axis.Date()’ and ‘axis.POSIXct()’ are rewritten to gain better default tick locations and better default formats by using ‘prettyDate()’. Thanks to Swetlana Herbrandt.
The makefiles and installer scripts for Windows have been tailored to Rtools43, an update of the Rtools42 toolchain. It is based on GCC 12 and newer versions of MinGW-W64, binutils and libraries. At this time R-devel can still be built using Rtools42 without changes, but when R-devel is installed via the installer, it will by default look for Rtools43.
When ‘example(foo, ..)’ produces graphics on an interactive device it needs to open itself, it now leaves ‘devAskNewPage()’ unchanged even when it was ‘FALSE’, thus fixing a 14 years old ‘FIXME’.
‘parallel::detectCores()’ drops support for IRIX (retired in 2013).
Internet access based on libcurl, including ‘curlGetHeaders()’, was not respecting the ‘"timeout"’ option. If this causes unanticipated timeouts, consider increasing the default by setting ‘R_DEFAULT_INTERNET_TIMEOUT’.
‘readBin()’ and ‘writeBin()’ now report an error for an invalid ‘endian’ value. The affected code needs to be fixed with care as the old undocumented behavior was to swap endianness in such cases.
‘pbeta(x, a,b)’ is correct now for ‘x’=0 or 1 in the boundary cases where ‘a’ or ‘b’ or both are 0, fixing PR#18672 thanks to Michael Fay.
‘is.R()’ is deprecated as no other S dialect is known to be in use (and this could only identify historical dialects, not future ones).
For now, further information on calls can be obtained by setting environment variable ‘_R_DEPRECATED_IS_R_’. Value ‘warn’ gives a warning as per the default except immediately, value ‘error’ turns this warning into an error (so by default gives a traceback), value ‘traceback’ gives a tracebeck in a message (not a warning, as that may truncate) and value ‘where’ gives the call to the function (if any) calling ‘is.R’ and which namespace it is from. Value ‘self’ is a variant of ‘where’ for use by ‘R CMD check --as-cran’.
The ‘methods’ package is more robust to not being attached to the search path. More work needs to be done.
‘zapsmall()’ gets new optional arguments, function ‘mFUN’ and ‘min.d’, for extra flexibility; fulfills a wish in PR#18199. It also becomes implicit S4 generic in ‘methods’.
‘warning()’ with ‘options(warn = 1)’ has improved output for multi-line messages.
‘is.R()’ is deprecated as no other S dialect is known to be in use (and this could only identify historical dialects, not future ones).
For now, further information on calls can be obtained by setting environment variable ‘_R_DEPRECATED_IS_R_’. Value ‘warn’ gives a warning as per the default except immediately, value ‘error’ turns this warning into an error (so by default gives a traceback), value ‘traceback’ gives a tracebeck in a message (not a warning, as that may truncate) and value ‘"where"’ gives the call to the function (if any) calling ‘is.R’ and which namespace it is from.
The ‘pairs()’ method for ‘"profile"’ objects has been extended with a ‘which =’ argument to allow plotting only a subset of the parameters.
The default and ‘numeric’ methods of ‘all.equal()’ get a ‘check.class’ option.
No default C++ compiler is set if no C++17 compiler is detected: there is no longer an automatic fallback to C++14 or C++11. (Compilers from the last five years should have sufficient support: for others macros ‘CXX’ and ‘CXXSTD’ can be set in file ‘config.site’ to provide a fallback if needed.)
‘is.R()’ is deprecated as no other S dialect is known to be in use (and this could only identify historical dialects, not future ones).
‘is.R()’ is dperecated as no other S dialect is known to be in use (and this could only identify historical dialects, not future ones).
Improve the large-n efficiency of ‘as.matrix(<dist>)’, thanks an R contributors effort, notably by Tim Taylor and Heather Turner, see PR#18660.
‘iconv(sub = "Unicode")’ now zero-pads to four (hex) digits, rather than to 4 or 8. (This seems to have become the convention once Unicode restricted the number of Unicode points to 2^21 - 1 and so will never need more than 6 digits.)
‘tools’‘:: startDynamicHelp()’ now ensures ‘port’ is in proper range,
fixing PR#18645.
‘tools’‘:: startDynamicHelp()’ now ensures ‘port’ is in proper range, fixing PR#18645.