This blog is updated daily.
A general description is here.
The internal method of ‘untar()’ now checks the whole path of every member, so that a final component of ‘".."’ or ‘"~"’ can no longer place a link or file outside the extraction directory; rejects hard- and symbolic-link targets restored as file copies, which resolve outside the extraction directory or pass through a symbolic link; applies the umask to extracted files; also no longer restores setuid or setgid permission bits. Similarly, the internal method of ‘unzip()’ no longer extracts through symbolic links below ‘exdir’, both thanks to Kevin Ushey's report and patch in PR#19229.
‘delete.response’ inadvertently converted indices (attributes ‘response’, ‘offset’, ‘specials’) from integer to double. It also replaced ‘NULL’ components of ‘specials’ with ‘logical(0L)’.
‘parse_Rd()’ should no longer leak memory when errors are raised, thanks to Kevin Ushey's report and patch in PR#19184.
‘strsplit(str, perl=TRUE, bytes=TRUE)’ no longer accesses invalid
memory in case ‘str’ is an invalid UTF-8 string, fixing PR#19212,
thanks to Kevin Ushey.
Fixes for ‘grid.pack(row.after=)’ (and ‘row.before’ and ‘col.after’ and ‘col.before’) and ‘grid.pack(dynamic=TRUE)’. Thanks to Athenkosi Nkonyeni for reports.
If ‘wilcox.test(..., exact=TRUE)’'s p-value is close to the 0 or 1 boundaries, the calculation no longer suffers severely from cancellation, thanks to Tasuku Kobayashi's reports and Ahmed Sattar Jabbar's suggestion in PR#19144.
‘strsplit(str, perl=TRUE, bytes=TRUE)’ no longer accesses invalid memory in case ‘str’ is an invalid UTF-8 string, fixing PR#19212, thanks to Kevin Ushey.
‘wilcox.test(x, exact=FALSE, correct = k)’'s p-value computation got a
missing ‘dnorm(z)’ factor, and so did the 2-sample case, in addition to
more fixes.
Further, if ‘wilcox.test(.., exact=TRUE)’'s p-value is close to the 0 or 1 boundaries, the calculation no longer suffers severely from cancellation, thanks to Tasuku Kobayashi's reports and Ahmed Sattar Jabbar's suggestion in PR#19144.
‘wilcox.test(x, exact=FALSE, correct = k)’'s p-value computation got a missing ‘dnorm(z)’ factor, and so did the 2-sample case, in addition to more fixes.
When tracing rematched S4 methods, ‘trace’ could insert a call ‘trace(.local, tracer=, exit=, ...)’ with improper ‘tracer’ and ‘exit’ components. Thanks to Hao Wang for the report (PR#18707).
Fix for ‘grid.pack(..., row.after=)’ (and ‘row.before’ and ‘col.after’ and ‘col.before’). Thanks to Athenkosi Nkonyeni for report.
‘trace’ with non-‘NULL’ ‘exit’ replaced rematched S4 method definitions with non-rematched ones that evaluated ‘exit’ twice, first on ‘.local’ exit and again on method exit.
In plain-text help (‘Rd2txt’), paragraphs are again recognized even when started with a non-indented Rd comment, fixing a regression in R 4.4.0.
‘rhyper(N, m, n, k)’ now switches to the “large” scenario when ‘m + n’ is larger than ‘.Machine$integer.max’, preventing integer overflow, thanks to Jonathan Blood's report on R-devel.
Fix long standing (Fortran compiler optimization related) bug in ‘nlminb’ with constraints, thanks to Kasper Kristensen's PR#19086 report and patch.
Fix for PR#19100: ‘seq.int’ was not handling non-vector ‘along.width’ arguments properly. Thanks to Mitchell O'Hara-Wild.
Wrappers now duplicate even a wrapped object that might be shared before returning a read-only pointer. This prevents cached read-only pointers from becoming invalid. Reported by Ivan Krylov.
‘dummy.coef()’ becomes more robust to non-syntactic variable names, fixing PR#18468. Thanks to Bill Dunlap and ‘R Dev Day’ participants Vincent Arel-Bundock, Cynthia Huang, Tina Rozsos and Marina Marinelli.
Now ‘PROTECT()’ in ‘SubassignTypeFix’, fixing PR#19110 thanks to Kevin Ushey.
‘writeChar()’ in a multibyte locale counts characters and bytes consistently and no longer overflows, thanks to Kevin Ushey's report and patch in PR#19112.
‘dim(a) <- vec’ now checks for too large ‘prod(vec)’, thanks to Kevin Ushey's report and patch in PR#19109.
Tweaks (including to the parsers) for the C23 behaviour (preserving ‘const’) of ‘strchr’, ‘strrchr’ and ‘strstr’. (By Brian Ripley and Duncan Murdoch.)
‘make check-devel’ now works without recommended packages.
‘<matrix>[[i, j]]’ with negative ‘i’ occasionally gives no error but accesses ‘previous content’; thanks to Kevin Ushey's report and very simple fix in PR#19116.
Quartz device now correctly draws long paths (work-around for Quartz built-in stroker breaking long paths). Thanks to R Dev Day @ useR! 2026 contributors, notably Tomek Gieorgijewski, report in PR#18680.
‘strptime(ch, "...%OS<n>...")’ now disregards contiguous digits in "<n>", for symmetry with ‘strftime()’, fulfilling Frederick Eaton's wish in PR#17209, thanks to a patch by Suharto Anggono.
‘strptime()’ now also returns ‘NA’ for out of range ‘"%OS"’ and a correct error message in some wrong multibyte cases, fixing PR#19117 comment #1 and PR#19122 by Michael Chirico; additionally, some overflow to ‘Inf’ times no longer result in ‘NA’.
‘strptime("0", "%w")’ in a ‘"C"’ locale now works in valid cases, returning ‘NA’ for invalid week numbers (‘"%U"’ or ‘"%W"’), fixing PR#19124 thanks to Michael Chirico's report and notably Suharto Anggono's analysis, also correctly fixing PR#15195.
‘ksmooth(x,y, x.points=NULL)’ now returns an empty (x,y) pair instead of crashing R, fixing PR#19153.
Additionally, also by Adam Berkeš, ‘x <- rep(999,0); ksmooth(x, x, x.points = 1)’ no longer writes out of bounds, fixing PR#19171. Ditto for ‘ksmooth(x, x, n.points = 0)’, PR#19219.
‘besselI(1, 1e11)’ and ‘besselK(..)’ now signal a warning and return ‘NaN’ instead of typically segfaulting, fixing PR#19175 thanks to Ben Bolker.
Further, ‘besselK(1, -1e11)’ and similar warn about too large ‘|nu|’, returning ‘NaN’ rather than segfaulting, fixing PR#19196 thanks to Adam Berkeš.
‘text.default(.., col = numeric(0))’ and similar no longer segfault in "instrumented" versions of R, fixing PR#19178 thanks to Jiang Yuancheng's ‘fusion-fuzz’ and Ivan Krylov.
‘R CMD rtags’ (on Unix-alikes) no longer fails from a bad escape if ‘sh’ is ‘bash’ or ‘busybox’.
‘capabilities("X11")’ no longer incorrectly returns ‘TRUE’ on a Unix-alike where X11 is not actually available when built by a C compiler without C23 ‘enum’ base types, thanks to Trevor Davis' report and patch in PR#19180.
‘predict(smooth.spline(..), deriv = -99)’ and similar invalid ‘deriv’ values now signal errors instead of segfaulting, thanks to Adam Berkeš' report and proposal in PR#19190.
‘format(x, width = 2^31 -1)’ for an non-ascii character ‘x’ such as ‘x = "\u00e9"’ now signals an error as the required width is too large, rather than segfaulting, thanks to Adam Berkeš' report in PR#19188.
‘influence.measures()’ inadvertently wasn't updated along with ‘dffits()’, ‘dfbetas()’, ‘covratio()’. PR#19167 by Amal Tawfik.
Long stringed error messages are now protected from premature garbage collection, fixing PR#19210, reported and analyzed by Yuancheng Jiang.
‘isoreg(numeric(0))’ no longer returns unallocated component ‘yc’, fixing PR#19224 thanks to Kevin Ushey.
‘KalmanLike(1:5, list(1,2))’ and similar no longer segfault, fixing PR#19217 thanks to Kevin Ushey and Adam Berkeš.
‘path.expand("~")’ and similar now should work correctly on Windows when the user name is not in ASCII and neither ‘%HOME%’ nor ‘%USER%’ environment variables are set, fixing PR#18949 thanks to the report and patch from Ivan Krylov and Mauricio Vargas's R Dev Day work.
‘file.copy(*, date=TRUE)’ no longer opens files for exclusive access when copying the file time. Consequently, the time _is_ copied now and concurrent attempts to open the source file should work reliably, thanks to Kevin Ushey's report and patch in PR#19187.
Long stringed error messages are now protected from premature garbage
collection, fixing PR#19210, reported and analyzed by Yuancheng Jiang.
‘trace’ with non-‘NULL’ ‘exit’ replaced rematched S4 method definition with non-rematched one that evaluated ‘exit’ twice, first on ‘.local’ exit and again on method exit.
Long stringed error messages are now protected from premature garbage collection, fixing PR#19210, reported and analyzed by Yuancheng Jiang.
‘KalmanLike(1:5, list(1,2))’ and similar no longer segfault, fixing PR#19217 thanks to Kevin Ushey and Adam Berkeš.
‘isoreg(numeric(0))’ no longer returns unallocated component ‘yc’, fixing PR#19224 thanks to Kevin Ushey.
‘ksmooth(x,y, x.points=NULL)’ now returns an empty (x,y) pair instead of crashing R, fixing PR#19153.
Additionally, also by Adam Berkeš, ‘x <- rep(999,0); ksmooth(x, x, x.points = 1)’ no longer writes out of bounds, fixing PR#19171. Ditto for ‘ksmooth(x, x, n.points = 0)’, PR#19219.
Dynamic HTML help pages are postprocessed to link function arguments in the Usage section to their documentation in the Arguments section.
‘strsplit(str, perl=TRUE, bytes=TRUE)’ no longer accesses invalid memory in case ‘str’ is an invalid UTF-8 string, fixing PR#19212, thanks to Kevin Ushey.
The long-standing environment variable ‘PKG_BUILD_DIR’
to control where ‘R CMD INSTALL’ unpacks source tarballs is now documented in the R Internals manual. This is supplemented by ‘PKG_BUILD_DIR_BARE’ to use ‘PKG_BUILD_DIR’ as the unpacking directory without adding a random path component.
Long stringed error messages are now protected from premature garbage collection, fixing PR#19210, reported and analyzed by Yuancheng Jiang.
‘influence.measures()’ inadvertently wasn't updated along with ‘dffits()’, ‘dfbetas()’, ‘covratio()’. PR#19167 by Amal Tawfik.
‘wilcox.test(x, exact=FALSE, correct = k)’'s p-value computation got a missing ‘dnorm(z)’ factor, and so did the 2-sample case, in addition to more fixes.
Further, if ‘wilcox.test(.., exact=TRUE)’'s p-value is close to the 0 or 1 boundaries, the calculation no longer suffers severely from cancellation, thanks to Tasuku Kobayashi's reports and Ahmed Sattar Jabbar's suggestion in PR#19144.
‘path.expand("~")’ and similar now should work correctly on Windows
when the user name is not in ASCII and neither ‘%HOME%’ nor ‘%USER%’
environment variables are set, fixing PR#18949 thanks to the report and
patch from Ivan Krylov and Mauricio Vargas's R Dev Day work.
‘besselI(1, 1e11)’ and ‘besselK(..)’ now signal a warning and return ‘NaN’ instead of typically segfaulting, fixing PR#19175 thanks to Ben Bolker.
Further, ‘besselK(1, -1e11)’ and similar warn about too large ‘|nu|’, returning ‘NaN’ rather than segfaulting, fixing PR#19196 thanks to Adam Berkeš.
‘path.expand("~")’ and similar now should work correctly on Windows when the user name is not in ASCII and neither ‘%HOME%’ nor ‘%USER%’ environment variables are set, fixing PR#18949 thanks to the report and patch from Ivan Krylov and Mauricio Vargas's R Dev Day work.
‘predict(smooth.spline(..), deriv = -99)’ and similar invalid ‘deriv’ values now signal errors instead of segfaulting, thanks to Adam Berkeš' report and proposal in PR#19190.
‘format(x, width = 2^31 -1)’ for an non-ascii character ‘x’ such as ‘x = "\u00e9"’ now signals an error as the required width is too large, rather than segfaulting, thanks to Adam Berkeš' report in PR#19188.
‘file.copy(*, date=TRUE)’ no longer opens files for exclusive access when copying the file time. Consequently, the time _is_ copied now and concurrent attempts to open the source file should work reliably, thanks to Kevin Ushey's report and patch in PR#19187.
‘capabilities("X11")’ no longer incorrectly returns ‘TRUE’ on a Unix-alike where X11 is not actually available when built by a C compiler without C23 ‘enum’ base types, thanks to Trevor Davis' report and patch in PR#19180.
Added protection against out-of-range values for graphical parameters ‘lty’, ‘lend’, and ‘ljoin’ in ‘graphics’ function calls (PR#19170). Thanks to Adam Berkeš.
‘cairo_pdf()’ no longer silently ignores ‘grid.newpage()’ calls after drawing a ‘glyphGrob’ containing two or more glyphs inside a masked ‘viewport’. Thanks to Trevor Davis' patch proposal in PR#19075.
‘R CMD rtags’ (on Unix-alikes) no longer fails from a bad escape if ‘sh’ is ‘bash’ or ‘busybox’.
The ‘anova(.., test = tt)’ methods for ‘"glm"’ and ‘"glmlist"’ now do partially match a string ‘tt’, as documented, thanks to Amal Tawfik's report and patch in PR#19179.
‘text.default(.., col = numeric(0))’ and similar no longer segfault in "instrumented" versions of R, fixing PR#19178 thanks to Jiang Yuancheng's ‘fusion-fuzz’ and Ivan Krylov.
‘chol2inv()’ gains optional switch ‘diag.only’ for shortcutting ‘diag(chol2inv(.))’, wished for with a patch and reproducible analysis in PR#19177 by Adam Marstrand.
‘besselI(1, 1e11)’ and ‘besselK(..)’ now signal a warning and return ‘NaN’ instead of typically segfaulting, fixing PR#19175 thanks to Ben Bolker.
‘ksmooth(x,y, x.points=NULL)’ now returns an empty (x,y) pair instead of crashing R, fixing PR#19153.
Additionally, also by Adam Berkeš, ‘x <- rep(999,0); ksmooth(x, x, x.points = 1)’ no longer writes out of bounds, fixing PR#19171.
‘strptime("0", "%w")’ in a ‘"C"’ locale now works in valid cases, returning ‘NA’ for invalid week numbers (‘"%U"’ or ‘"%W"’), fixing PR#19124 thanks to Michael Chirico's report and notably Suharto Anggono's analysis, also correctly fixing PR#15195.
‘gzcon’ ‘rawConnection’s now can flush and are writable thanks to Ivan Krylov's analysis and patch in PR#19172.
‘strptime(ch, "...%OS<n>...")’ now disregards contiguous digits in
"<n>", for symmetry with ‘strftime()’, fulfilling Frederick Eaton's
wish in PR#17209, thanks to a patch by Suharto Anggono.
‘strptime("0", "%w")’ in a ‘"C"’ locale now works in valid cases,
fixing PR#19124 thanks to Michael Chirico.
The ‘as.list()’ method for class ‘"function"’ now checks its argument and behaves better for a fake "function", fixing PR#19173 thanks to Mark Padgham's report and patch proposal.
‘path.expand("~")’ and similar now should work correctly on Windows when the user name is not in ASCII and neither ‘%HOME%’ nor ‘%USER%’ environment variables are set, fixing PR#18949 thanks to the report and patch from Ivan Krylov and Mauricio Vargas's R Dev Day work.
‘strptime(ch, "...%OS<n>...")’ now disregards contiguous digits in "<n>", for symmetry with ‘strftime()’, fulfilling Frederick Eaton's wish in PR#17209, thanks to a patch by Suharto Anggono.
‘strptime("0", "%w")’ in a ‘"C"’ locale now works in valid cases, fixing PR#19124 thanks to Michael Chirico.
‘glm(*, wtol = <positive>)’ treats very small weights as zeros via ‘glm.fit()’ and ‘glm.control()’, also with new optional ‘tol’ argument, more similar to ‘lm()’, but not equivalently, e.g., for computing ‘AIC()’.
Atypical ‘lm()’ calls now work better, e.g., ‘fm <- lm(rock); update(fm, . ~ . - perm)’ and similar cases, fixing PR#17463 and PR#17476 and part of PR#1861, thanks to Ben Tyner, Elin Waring, Kevin Tappe and other Bugzilla contributors.
‘strptime()’ now also returns ‘NA’ for out of range ‘"%OS"’ and a
correct error message in some wrong multibyte cases, fixing PR#19117
comment #1 and PR#19122 by Michael Chirico; additionally, some overflow
to ‘Inf’ times no longer result in ‘NA’.
‘x[logi]’, with ‘logi’ a logical index, now warns if ‘length(x)’ is not a multiple of ‘length(logi)’, fixing PR#19155 thanks to several participants in two R Dev Days and the R Sprint in 2026.
‘strptime()’ now also returns ‘NA’ for out of range ‘"%OS"’ and a correct error message in some wrong multibyte cases, fixing PR#19117 comment #1 and PR#19122 by Michael Chirico; additionally, some overflow to ‘Inf’ times no longer result in ‘NA’.
‘glm(rock)’ and ‘glm(data = rock)’ work like ‘lm(..)’ now.
‘confint(<free1way>, what = "OVL")’ now includes one for shift effect confidence intervals including zero.
‘summary(<free1way>)’ renames p-values to ‘Pr(..)’ and thus ‘printCoefmat’ recognises them.
‘glm()’ with zero weights now provides correct AIC and ‘logLik()’, fixing PR#16008, thanks to Bill Dunlap and Mauricio Vargas.
‘glm(.., wtol = <positive>)’ treats very small weights as zeros now, similarly to ‘lm()’ via ‘glm.control()’; correct AIC and logLik() for this case, fixing PR#16008, thanks to Bill Dunlap and Mauricio Vargas.
‘summary(<free1way>)’ renames p-values to ‘Pr(..)’ and
thus ‘printCoefmat’ recognises them.
‘ksmooth(x,y, x.points=NULL)’ now returns an empty (x,y) pair instead of crashing R, fixing PR#19153.
The translations have been updated by the R Translation Team, with the patch generated by Gergely Daroczi. This includes a major contribution of over 4000 Arabic translations from Abdulrahman Alswaji.
‘tools::add_datalist()’ now returns a logical (invisibly, instead of ‘NULL’), indicating if it did add a ‘data/datalist’ file (addressing parts of PR#18015).
‘R CMD build’ now excludes an obsolete ‘data/datalist’ file when the package uses ‘LazyData’, and reports when it added one.
‘lm(.., weights = *)’ gets a new optional argument ‘wtol’, defaulting to 0 currently for back compatibility. Setting ‘wtol = 1e-30’ fixes PR#17475 thanks to the ‘R Dev Day’ 2025 participants Kelly Bodwin et al.
Atypical ‘lm()’ calls now work better, e.g., ‘fm <- lm(rock); update(fm, . ~ . - perm)’ and similar cases, fixing PR#17463 and PR#17476 and part of PR#1861, thanks to Ben Tyner, Elin Waring, Kevin Tappe and other bugzilla contributors.
‘pkg2HTML(dir="pkg")’ and other ‘tools’ consuming the ‘Rd_db()’ of a source package, e.g., the ‘undoc()’ QC function (PR#18960, thanks to Michael Chirico), no longer fail from processing ‘DESCRIPTION’-based Rd macros such as \packageTitle when the current directory is not the source package's root directory.
Quartz device now correctly draws long paths (work-around for Quartz built-in stroker breaking long paths). Thanks to R Dev Day @ useR! 2026 contributors, notably Tomek Gieorgijewski, report in PR#18680.
Fix for PR#19035 (piping ‘postscript()’ output) thanks to Jeroen Ooms and Ivan Krylov.
‘strptime("0", "%w")’ in a ‘"C"’ locale now works in valid cases, fixing PR#19124 thanks to Michael Chirico.
‘drop1.glm()’ misbehaved for models fitted with ‘y = FALSE’ (PR#19128,
Amal Tawfik).
‘confint(<free1way>, parm)’ returned confidence intervals for all parameters when ‘parm’ requested a subset.
‘summary(<free1way>)’ renames p-values to ‘Pr()’ and thus ‘printCoefmat’ recognises them.
‘drop1.glm()’ misbehaved for models fitted with ‘y = FALSE’ (PR#19128, Amal Tawfik).
‘confint(<free1way>, parm)’ returned confidence intervals for all parameters when ‘parm’ requested a subset.
‘summary(<free1way>)’ renames p-values to ‘Pr(..)’ and thus ‘printCoefmat’ recognises them.
‘strptime(ch, "...%OS<n>...")’ now disregards contiguous digits in "<n>", for symmetry with ‘strftime()’, fulfilling Frederick Eaton's wish in PR#17209, thanks to a patch by Suharto Anggono.
‘rfree1way’ also accepts ‘offset’ terms equal to the number of simulated observations, allowing to sample from more complex models.
‘data()’ will accept text files with further extension ‘.zst’ or ‘.zstd’, and read them on builds with ‘zstd’ support.
‘free1way(, MPL_Jeffreys = TRUE)’ implements maximum penalised likelihood estimation with Jeffreys prior for all model parameters simultaneously, along with Wald-type inference.
‘drop1.glm()’ misbehaved for models fitted with ‘y = FALSE’ (PR#19128, Amal Tawfik).
‘confint(<free1way>, parm)’ returned confidence intervals for all parameters when ‘parm’ requested a subset.
‘summary(<free1way>)’ renames p-values to ‘Pr()’ and thus ‘printCoefmat’ recognises them.
‘drop1.glm()’ misbehaved for models fitted with ‘y = FALSE’ (PR#19128, Amal Tawfik).
Wrapper objects make sure data pointers remain once obtained remain
valid as long as a wrapper object is reachable. Reported by Ivan
Krylov.
Wrappers now duplicate even a wrapped object that might be shared before returning a read-only pointer. This prevents cached read-only pointers from becoming invalid. Reported by Ivan Krylov.
‘data()’ will accept text files with further extension ‘.zst’ or ‘.zstd’, and read them on builds with ‘zstd’ support.
‘strptime()’ now also returns ‘NA’ for out of range ‘"%OS"’ and a correct error message in some wrong multibyte cases, fixing PR#19117 comment #1 and PR#19122 by Michael Chirico; additionally, some overflow to ‘Inf’ times no longer result in ‘NA’.
The Sweave syntax definition objects ‘SweaveSyntaxNoweb’ and ‘SweaveSyntaxLatex’ now each have their own detailed help page.
Changed ‘model.frame.glm()’ to use same logic as ‘model.frame.lm()’ (PR#19036, Isaac Gravestock).
Fix cases where ‘M’ and ‘X’ matrices could be spanning the same subspace in ‘mauchly.test()’, ‘sphericity()’ ‘anova.mlm()’, ‘anova.mlmlist()’. (PR#16166, originally reported in 2015 by Florent Aubry, essentially analyzed Feb. 2020 just before the corona crisis, triaged 2026 by Michael Chirico)
Fix cases where ‘M’ and ‘X’ matrices could be spanning the same subspace in ‘mauchly.test()’, ‘anova.mlm’, ‘anova.mlmlist’. (PR#16166, originally reported in 2015 by Florent Aubry, essentially analyzed Feb. 2020 just before the corona crisis, triaged 2026 by Michael Chirico)
In ‘nls’, follow suggestion by Ben Bolker to reorder named vectors for ‘lower’ and ‘upper’ arguments to match names of the starting values (PR#18415). This has been extended so that you can now specify _only_ the parameters that you wish to constrain, and also so that it works when parameters are in the form of named lists.
‘dummy.coef()’ becomes more robust to non-syntactic variable names,
fixing PR#18468. Thanks to Bill Dunlap and ‘R Dev Day’ participants
Vincent Arel-Bundock, Cynthia Huang, Tina Rozsos and Marina Marinelli.
‘dummy.coef()’ becomes more robust to non-syntactic variable names, fixing PR#18468. Thanks to Bill Dunlap and ‘R Dev Day’ participants Vincent Arel-Bundock, Cynthia Huang, Tina Rozsos and Marina Marinelli.
Tweaks (including to the parsers) for the C23 behaviour (preserving ‘const’) of ‘strchr’, ‘strrchr’ and ‘strstr’. (By Brian Ripley and Duncan Murdoch.)
‘make check-devel’ now works without recommended packages.
‘<matrix>[[i, j]]’ with negative ‘i’ occasionally gives no error but accesses ‘previous content’; thanks to Kevin Ushey's report and very simple fix in PR#19116.
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’, ‘insertMethod’, ‘makeMethodsList’, ‘mergeMethods’, ‘MethodsList’, ‘MethodsListSelect’, and ‘SignatureMethod’ were made defunct, as were the ‘"MethodsList"’ branches of functions ‘assignMethodsMetaData’, ‘finalDefaultMethod’, and ‘MethodAddCoerce’.
‘dim(a) <- vec’ now checks for too large ‘prod(vec)’, thanks to Kevin Ushey's report and patch in PR#19109.
‘writeChar()’ in a multibyte locale counts characters and bytes consistently and no longer overflows, thanks to Kevin Ushey's report and patch in PR#19112.
Now ‘PROTECT()’ in ‘SubassignTypeFix’, fixing PR#19110 thanks to Kevin Ushey.
New higher-order functions ‘Compose()’, ‘Funcall()’ and ‘Partial()’.
New functions ‘find_calls()’, ‘find_calls_in_package_code()’, ‘gsub_with_transformed_matches()’ and ‘system_with_capture()’ in package ‘tools’.
Fix segfault in ‘postscript()’ and ‘pdf()’ if set ‘papersize’ option to very long string (PR#19108). Thanks to Kevin Ushey.
Fix segfault in ‘grid::gpar()’ if set ‘fontfamily’ longer than 200 characters (PR#19107). Thanks to Kevin Ushey.
‘use()’ gets an argument ‘pos’ with a help example showing how to attach a “chain” of packages to ‘search()’.
Wrappers now duplicate even a wrapped object that might be shared
before returning a read-only pointer. This prevents cached read-only
pointers from becoming invalid. Reported by Ivan Krylov.
Wrapper objects make sure data pointers remain once obtained remain valid as long as a wrapper object is reachable. Reported by Ivan Krylov.
Fixing ‘rbinom()’, see PR#19049 below, to reproduce old results needs ‘RNGkind()’ to get a new ‘binom.kind’ argument and, e.g. ‘RNGversion("4.6")’ keeps previous behaviour.
‘rbinom()’'s BTPE algorithm is fixed thanks to Kate Hudson's findings and report in PR#19049. To ensure reproducibility, ‘RNGkind()’ gets new argument ‘binom.kind’.
Fix long standing (Fortran compiler optimization related) bug in ‘nlminb’ with constraints, thanks to Kasper Kristensen's PR#19086 report and patch.
Fix long standing (Fortran compiler optimization related) bug in
‘nlminb’ with constraints, thanks to Kasper Kristensen's PR#19086
report and patch.
Package ‘methods’ provides a method for implicit generic function ‘rcond’ with signature ‘c(x="ANY", norm="missing")’ so that ‘rcond(x)’ does not break after ‘setGeneric("rcond")’.
New low-level function ‘.OBJSXP()’ enables deparsing of non-S4 ‘"object"’ type objects.
In ‘methods’, ‘as()’ now correctly coerces S4 objects to S4
superclasses extending old-style classes, instead of returning only the
S3 part.
‘dummy.coef()’ becomes more robust to non-syntactic variable names, fixing PR#18468. Thanks to Bill Dunlap and ‘R Dev Day’ participants Vincent Arel-Bundock, Cynthia Huang, Tina Rozsos and Marina Marinelli.
‘summary(<aov>)’ for an almost perfect fit now warns analogously to ‘summary(<lm>)’, using the same check. Fixes fixes PR#18341 thanks to ‘R Dev Day @ useR! 2026’ participants Deepansh Khurana, Stefan Linner and Oscar de Leon.
In ‘methods’, ‘as()’ now correctly coerces S4 objects to S4 superclasses extending old-style classes, instead of returning only the S3 part.
New low-level function ‘.OBJSXP()’ enables deparsing of non-S4
‘"object"’ type objects.
Fix for PR#19100: ‘seq.int’ was not handling non-vector ‘along.width’
arguments properly. Thanks to Mitchell O'Hara-Wild.
Fix for PR#19100: ‘seq.int’ was not handling non-vector ‘along.width’ arguments properly. Thanks to Mitchell O'Hara-Wild.
Wrappers now duplicate even a wrapped object that might be shared before returning a read-only pointer. This prevents cached read-only pointers from becoming invalid. Reported by Ivan Krylov.
‘summary(<aov>)’ for an almost perfect fit now warns analogously to ‘summary(<lm>)’, using the same check. Fixes fixes PR#18341 thanks to R Dev Day members Deepansh Khurana, Stefan Linner and Oscar de Leon.
‘R CMD build’ now excludes an obsolete ‘data/datalist’ file when the package uses ‘LazyData’.
‘tools::texi2pdf()’ now reports BibTeX warnings; in particular, missing references are now noted by ‘R CMD check’ when re-building PDF vignettes.
In ‘nls’, follow suggestion by Ben Bolker to reorder named vectors for ‘lower’ and ‘upper’ arguments to match names of coefficients (PR#18415).
Fix for PR#19100: ‘seq.int’ was not handling non-vector ‘along.width’ arguments properly. Thanks to Mitchell O'Hara-Wild.
New low-level function ‘.OBJSXP()’ enables deparsing of non-S4 ‘"object"’ type objects.
‘rhyper(N, m, n, k)’ now switches to the “large” scenario when ‘m + n’ is larger than ‘.Machine$integer.max’, preventing integer overflow, thanks to Jonathan Blood's report on R-devel.
‘structure()’ now deprecates the old “special” substitute ‘attributes’' names ‘".Dim", ".Dimnames", ".Names", ".Tsp", ".Label"’ in favour of the respective ‘"dim", "dimnames", "names", "tsp", "levels"’ names.
‘tools::texi2pdf()’ now reports BibTeX warnings.
‘cor(*, method="kendall")’ and ‘cov()’ now use the fast N*log(N) algorithm suggested in PR#18934 and offered by David Simcha on R-devel in 2010. With thanks to the R Dev Day @ Nantes 2026 contributors, notably Charles Bordet and Alexis Derumigny.
‘read.dcf()’ and ‘write.dcf()’ now treat DCF files (such as package ‘DESCRIPTION’ and repository ‘PACKAGES’ files) as UTF-8, as required by the Debian control file format. ‘read.dcf()’ returns values in UTF-8 and ‘write.dcf()’ always writes UTF-8 regardless of the session locale; bytes which are not valid UTF-8 are preserved by escaping them as ‘<xx>’ rather than being re-encoded via a ‘Encoding’ field. As a consequence, the ‘useBytes’ argument of ‘write.dcf()’ is ignored, and non-UTF-8 ‘DESCRIPTION’ files (e.g. those declaring ‘Encoding: latin1’) are no longer re-encoded on reading.
‘binom.test()’ and ‘poisson.test()’ can now at least optionally compute central two-sided p-values which match the confidence intervals. Same for ‘fisher.test()’ in the 2 by 2 case and ‘mantelhaen.test()’ in the 2 by 2 by K case if an exact conditional test is performed.
Fix for PR#19094; fill/stroke path based on text with ‘col=NA’. Thanks to Trevor Davis.
Fix for PR#18842; better documentation and warnings when specify inappropriate ‘col’ to ‘filled.contour()’. Thanks to Darakhshan Nehal.
In plain-text help (‘Rd2txt’), paragraphs are again recognized even when started with a non-indented Rd comment, fixing a regression in R 4.4.0.
‘binom.test()’ and ‘poisson.test()’ can now at least optionally compute central two-sided p-values which match the confidence intervals.
In ‘methods’, ‘setOldClass(..., S4Class = )’ no longer warns about undefined subclasses when the supplied S4 class inherits from a class union.
Fix long standing (Fortran compiler optimization related) bug in ‘nlminb’ with constraints, thanks to Kasper Kristensen's PR#19086 report and patch.
‘trace()’ now works for functions whose S3 class attribute has more than one string, e.g., ‘S7’ generics and methods. Thanks to Hadley Wickham for the patch.
‘as(object, to) <- value’ no longer treats ‘to’ as a class union when it was registered via ‘setOldClass()’.
‘merge.data.frame’ now returns the correct column names when at least one of the merged data frames has zero rows and at least one of the merged data frames has only one column, fixing PR#18930. Thanks to David Molnar and Gabriel Becker.
Fix long standing (fortran compiler optimization related) bug in ‘nlminb’ with constraints, thanks to Kasper Kristensen's PR#19086 report and patch.
Overly long ‘dyn.load()’ error messages (C level ‘dlerror()’), should
no longer corrupt its state, thanks to Ivan Krylov's PR#19029 report
and patch.
Fix for PR#18874; ‘"null"’ widths/heights in ‘grid’ layouts are zero if widths/heights to allocate are zero. (Thanks to Maciej Nasinski and Trevor Davis.)
Fix for PR#19055; additional documentation for ‘embedFonts()’. (Thanks to Chris Danek and Ivan Krylov.)
Zeros in the ‘prob’ argument to ‘power.free1way.test’ triggered an error and are now handled correctly.
Overly long ‘dyn.load()’ error messages (C level ‘dlerror()’), should no longer corrupt its state, thanks to Ivan Krylov's PR#19029 report and patch.
The border case ‘zapsmall(x, digits=Inf)’ where ‘x’ contains an ‘Inf’ entry no longer returns all ‘NaN’ but rather ‘x’. The improved help page now has more non-default examples.
The data part of ‘getGenerics()’ listed package names for generic functions defined in more than one package. Now it lists generic function names, as intended. Thanks to Michael Chirico for report and patch proposal (PR#19080).
‘as.matrix(<POSIXlt>)’ again produces a _numeric_ matrix, and the ‘c()’ and subassignment methods for ‘POSIXlt’ objects work correctly more often, e.g., without a ‘"tzone"’ attribute, back porting a few of the PR#18989 fixes from R-devel, both thanks to Suharto Anggono.
The LaTeX class ‘jss’ bundled in ‘share/texmf/tex/latex/jss.cls’ has been updated to work with ‘hyperref’ version 7.01q (2026/04/24).
Plain-text (and legacy HTML) conversion for a simple Rd \eqn{} now handles \geq, \leq, \neq and \ne in addition to \ge and \le (PR#19070).
‘abbreviate(<non-ASCII>)’ now works better, using ‘iswlower()’ and ‘*upper()’ to treat “wide” characters, thanks to Kevin's PR#19058.
‘cut(1:11, {})’ now signals an error for the invalid ‘breaks’, fixing PR#19057, thanks to Kevin Ushey.
‘all(<symbol>)’ signals an error now, as some similar coercions; previously, the coercion of the symbol resulted in ‘NULL’ internally, raised a warning, and could access illegal memory; thanks to Kevin Ushey's PR#19054.
‘stl()’ now checks its 3 x 3 tuning parameters on the R level; ‘stl(*, s.window = 0)’ now “works” instead dumping core, ‘stl(*, s.window = 1)’ “works” correctly, too. Also, the ‘summary()’ method mentions the robustness ‘weights’ only if any robustness iterations happened.
Further, ‘stl()’ is now based on C code, translated from previous Fortran, triggered by a flang 22 compiler optimization bug (‘-O2’).
Border case ‘zapsmall(x, digits=Inf)’ where ‘x’ has an ‘Inf’ entry, no longer returns all ‘NaN’ but rather ‘x’. Help page improved, also with more non-default examples.
‘wilcox.test(x, exact=FALSE, correct = k)’'s p-value computation got a missing ‘dnorm(z)’ factor, and so did the 2-sample case, in addition to more fixes.
Data part of ‘getGenerics()’ listed package names for generic functions defined in more than one package. Now it lists generic function names, as intended. Thanks to Michael Chirico for report and patch proposal (PR#19080).
‘as.matrix(<POSIXlt>)’ again produces a _numeric_ matrix, thanks to Suharto Anggono's PR#19084.
The ‘Pair(x,y)’ construction in the formula interface to paired tests did not work with the ‘subset’ argument, due to the absence of a ‘[.Pair’ method, which has now been added (PR#18898).
Data part of ‘getGenerics()’ listed package names for generic functions
defined in more than one package. Now it lists generic function names,
as intended. Thanks to Michael Chirico for report and patch proposal
(PR#19080).
‘strat_ratio != 1’ in ‘rfree1way’ did not work as advertised.
Zeros in ‘prob’ argument to ‘power.free1way.test’ triggered an error and are now handled correctly.
Data part of ‘getGenerics()’ listed package names for generic functions defined in more than one package. Now it lists generic function names, as intended. Thanks to Michael Chirico for report and patch proposal (PR#19080).
Exclude patterns from ‘.Rbuildignore’ are now processed _before_ preparing the package directory for the tarball, avoiding redundant file copies from the source directory (PR#17549). In particular, when a source package ‘foo/’ folder contains broken symlinks matching an exclude pattern, ‘R CMD build foo’ now succeeds, omitting these, thus fixing PR#18186. (Thanks to Ivan Krylov and others, notably Jenny Bryan and R Dev Day @ useR! 2025 contributors.)
When ‘browser()’ is active or when otherwise debugging, R code such as ‘if(TRUE)’ no longer triggers a new browser level, fixing PR#18885 (differently than the fix for PR#15770), with thanks to Ivan Krylov.
In ‘methods’, ‘as()’ now correctly coerces S4 objects to S4 superclasses extending old-style classes, instead of returning only the S3 part.
Installing R (creating ‘libR.pc’) no longer fails with a ‘sed’ error when the new ‘--package-metadata’ linker flag is involved; an ‘s’-command delimiter other than ‘:’ was needed (PR#19060, thanks to Jeroen Ooms and Dirk Eddelbuettel).
Data part of ‘getGenerics()’ listed package names for generic functions defined in more than one package. Now it lists generic function names, as intended. Thanks to Michael Chirico for report and patch proposal (PR#19080).
Exclude patterns from ‘.Rbuildignore’ are now processed _before_ preparing the package directory for the tarball, avoiding redundant file copies from the source directory (PR#17549). In particular, when a source package ‘foo/’ folder contains broken symlinks matching an exclude pattern, ‘R CMD build foo’ now succeeds, omitting these, thus fixing PR#18186. (Thanks to Ivan Krylov and others, notably Jenny Brian and R Dev Day @ useR! 2025 contributors.)
‘as.matrix(<POSIXlt>)’ again produces a _numeric_ matrix, thanks to Suharto Anggono's PR#19084.
When a source package ‘foo/’ folder contains broken symlinks, ‘R CMD build foo’ now succeeds, omitting these, thus fixing PR#18186, thanks to Ivan Krylov and others, notably Jenny Brian and R Dev Day @ useR! 2025 contributors.
Overly long ‘dyn.load()’ error messages (C level ‘dlerror()’), should no longer corrupt its state, thanks to Ivan Krylov's PR#19029 report and patch.
‘wilcox.test(x, exact=FALSE, correct = k)’'s p-value computation got a missing ‘dnorm(z)’ factor, and so did the 2-sample case, in addition to more fixes.
‘fisher.test()’ gains a new option ‘pval.only = TRUE’ for the 2x2 exact case, with substantial speed gains in the case of large counts.
‘abbreviate(<non-ASCII>)’ now works better, using ‘iswlower()’ and
‘*upper()’ to treat “wide” characters, thanks to Kevin's PR#19058.
‘all(<symbol>)’ signals an error now, as some similar coercions;
previously, the coercion of the symbol resulted in ‘NULL’ internally,
raised a warning, and could access illegal memory; thanks to Kevin
Ushey's PR#19054.
‘abbreviate(<non-ASCII>)’ now works better, using ‘iswlower()’ and ‘*upper()’ to treat “wide” characters, thanks to Kevin's PR#19058.
‘all(<symbol>)’ signals an error now, as some similar coercions; previously, the coercion of the symbol resulted in ‘NULL’ internally, raised a warning, and could access illegal memory; thanks to Kevin Ushey's PR#19054.
‘wilcox.test()’ gains new optional argument ‘digits.zap’, _and_ the default for argument ‘digits.rank’ is changed from ‘Inf’ to ‘7’, addressing bugs PR#18035 and PR#19071, in order to deal with both ties of almost equal numbers and almost zeros of differences.
‘wilcox.test(x, exact=FALSE, correct = k)’'s p-value computation got a missing ‘dnorm(z)’ factor.
‘as.POSIXct(x)’ for ‘POSIXlt’ object ‘x’ with ‘.Machine$integer.max - x$year < 1900’ no longer suffers from C level integer overflow, thanks to Suharto Anggono's patch for PR#19038. Currently, this does not apply when the ‘"internal"’ code for date-time conversion and printing is in use, as e.g., on Windows and macOS.
Border case ‘zapsmall(x, digits=Inf)’ where ‘x’ has an ‘Inf’ entry, no longer returns all ‘NaN’ but rather ‘x’. Help page improved, also with more non-default examples.
‘tools::Rd2txt()’ now replaces ‘---’ and ‘--’ by Unicode dashes when the output encoding is UTF-8.
Plain-text (and legacy HTML) conversion for a simple Rd \eqn{} now handles \geq, \leq, \neq and \ne in addition to \ge and \le (PR#19070).
Plain-text (and legacy HTML) conversion for a simple Rd \eqn{} now handles \geq and \leq in addition to \ge and \le (PR#19070).
‘.leap.seconds’ again has no ‘"tzone"’ attribute, as in earlier R versions, fixing PR#19072 thanks to Suharto Anggono.
‘as.POSIXct(x)’ for ‘POSIXlt’ object ‘x’ with ‘.Machine$integer.max - x$year < 1900’ no longer suffers from C level integer overflow, thanks to Suharto Anggono's patch for PR#19038.
‘stl()’ now checks its 3 x 3 tuning parameters on the R level; ‘stl(*, s.window = 0)’ now “works” instead dumping core, ‘stl(*, s.window = 1)’ “works” correctly, too. Also, the ‘summary()’ method mentions the robustness ‘weights’ only if any robustness iterations happened.
Further, ‘stl()’ is now based on C code, translated from previous Fortran, triggered by a flang 22 compiler optimization bug (‘-O2’).
The ‘as.data.frame()’ methods for atomic ‘vector’ classes get an optional switch ‘validRN’, with default true to fix PR#19059 and false for some back compatibility, still allowing data frames in construction to contain ‘NA’s in row names.
‘cut(1:11, {})’ now signals an error for the invalid ‘breaks’, fixing
PR#19057, thanks to Kevin Ushey.
For ‘x <- <large-POSIXlt>’, for some boundary cases with ‘x$sec - floor(x$sec)’ close to 1, ‘c(x)’ could become one second ahead of ‘x’ in R 4.6.0; subassignments such as ‘x[i] <- val’ have improved, thanks to suggestions by Suharto Anggono in PR#18989.
‘all(<symbol>)’ signals an error now, as some similar coercions; previously, the coercion of the symbol resulted in ‘NULL’ internally, raised a warning, and could access illegal memory; thanks to Kevin Ushey's PR#19054.
‘cut(1:11, {})’ now signals an error for the invalid ‘breaks’, fixing PR#19057, thanks to Kevin Ushey.
‘stl()’ now checks its 3 x 3 tuning parameters on the R level; ‘stl(*, s.window = 0)’ now “works” instead dumping core, ‘stl(*, s.window = 1)’ “works” correctly, too. Also, the ‘summary()’ method mentions the robustness ‘weights’ only if any robustness iterations happened.
‘all(<symbol>)’ signal an error now, as other such coercions; previously, the coercion of the symbol to logical resulted in ‘NULL’ internally, raised a warning, and could access illegal memory; thanks to Kevin Ushey's PR#19054.
‘as.data.frame.vector(<row.names_w/_NA>)’ now signals the same error as ‘data.frame()’, fixing Hervé Pagès' PR#19059. From Suharto Anggono's comment #c4, it gives the same error also when ‘row.names = RN’ explicitly, where ‘RN’ has ‘NA’s.
‘abbreviate(<non-ASCII>)’ now works better, using ‘iswlower()’ and ‘*upper()’ to treat “wide” characters, thanks to Kevin's PR#19058.
In an R installation without NLS, e.g., from ‘--disable-nls’ configuration, the C ‘ngettext()’ replacement now also keeps plural for “0 things”, thanks to Michael Chirico's PR#19065.
‘as.data.frame.vector(<row.names_w/_NA>)’ now signals the same error as ‘data.frame()’, fixing Hervé Pagès' PR#19059.
‘cut(1:11, {})’ now signals an error for the invalid ‘breaks’, fixing PR#19057, thanks to Kevin Ushey.
The LaTeX class ‘jss’ bundled in ‘share/texmf/tex/latex/jss.cls’ has been updated to work with ‘hyperref’ version 7.01q (2026/04/24).
Building R, e.g., on Ubuntu 26.04, using ‘--package-metadata’ needs to use a different ‘sed’ separator than ‘:’, fixing PR#19060, thanks to Jeroen Ooms and Dirk Eddelbuettel.
‘cut(1:11, {})’ now signals an error for the invalid ‘breaks’, fixing PR#19060, thanks to Kevin Ushey.
The ‘"tzone"’ attribute of ‘"POSIXlt"’ objects should no longer depend on earlier calls, fixing PR#19005 thanks to Ivan Krylov, a patch by Suharto Anggono and reports of “Non-deterministic POSIXlt tzone in Europe/London ..” on R-devel.
Condition classes used internally for signaling some errors are now documented in ‘?conditions’.
For ‘x <- <large-POSIXlt>’, ‘c(x)’, subsetting (‘[’, ‘[[’) and subassignment such as ‘x[i] <- val’ now work again mostly, thanks to suggestions by Suharto Anggono in PR#18989.
When subassigning ‘"POSIXlt"’, e.g., ‘<dat>[i] <- v’, ‘v’ is now converted to the time zone of ‘dat’, before being assigned, see PR#18919.
New function ‘cumvar()’ to calculate cumulative variances.
_Object not found_ errors now signal error conditions of class ‘objectNotFoundError’. _Function not found_ errors signal conditions of the subclass ‘functionNotFoundError’.
‘rmultinom()’ now uses Kahan's arithmetic instead of ‘LDOUBLE’ to avoid platform dependency, thanks to Mauricio Vargas' proposal in PR#18693.
‘intToUtf8(<negative>)’ now returns ‘NA’ and no longer accesses invalid
memory, thanks to Kevin Ushey's report with patch in PR#19052.
.
When subassigning ‘"POSIXlt"’, e.g., ‘<dat>[i] <- v’, ‘v’ is now converted to the time zone of ‘dat’, before being assigned.
‘intToUtf8(<negative>)’ now returns ‘NA’ and no longer accesses invalid memory, thanks to Kevin Ushey's report with patch in PR#19052.
When ‘file.choose()’ is terminated with an ‘EOF’, it now signals an error rather than returning garbage, thanks to Kevin Ushey's report and patch in PR#19053,
Subassigning ‘"POSIXlt"’, i.e., ‘<tdat>[i] <- val’ and ‘<tdat>[[i]] <- val’ now rebalance as they should; thanks mostly to Mikael Jagan's PR#18919.
‘intToUtf8(<negative>)’ now returns ‘NA’ and no longer accesses invalid memory, thanks to Kevin Ushey's report with patch in PR#19052.
The ‘print()’ method for ‘rle()’ now passes ‘...’ to ‘str()’.
Subassigning ‘"POSIXlt"’, i.e., ‘<tdat>[i] <- val’ and ‘<tdat>[[i]] <- val’ now rebalance as they should; additionally, ‘val’ is now converted to the time zone of ‘tdat’; thanks mostly to Mikael Jagan's PR#18919.
The Sweave driver ‘Rtangle’ no longer puts empty lines at the end of tangled scripts.
The Sweave driver ‘RweaveLatex’ now allows the value of logical and numerical chunk options (only) to be the name of an object defined in earlier, evaluated code chunks. This is useful to pass computed values to options. For options set this way for weaving purposes, the ‘Rtangle’ driver rather uses their default values, with a warning. By Vincent Goulet.
The Sweave driver ‘RweaveLatex’ gains an option to include unparsable R code or arbitrary text in code chunks. Chunks marked as ‘ignore.on.weave = TRUE’ are completely ignored on weaving, i.e., not even parsed. The chunks however remain written out verbatim on tangling.
Similarly, the driver ‘Rtangle’ gains an option to control the extraction of code chunks. Chunks marked as ‘ignore.on.tangle=TRUE’ are processed as usual on weaving, but left out of the tangled scripts (or thrown away when ‘split=TRUE’).
The drivers also support the shorter aliases ‘weave’ for ‘!ignore.on.weave’, and ‘tangle’ for ‘!ignore.on.tangle’. A further option ‘ignore’, available for both drivers, sets ‘ignore.on.weave’ and ‘ignore.on.tangle’ at once.
By Vincent Goulet.
The Sweave driver ‘Rtangle’ now provides an option ‘chunk.sep’ to control the separator between code chunks in tangled scripts (with an unchanged default of ‘\n\n’). Using ‘check.sep=FALSE’ omits the separator (between two chunks when used as a chunk option). By Vincent Goulet.
The Sweave driver ‘Rtangle’ now provides an option ‘extension’ to specify the extension, without the leading dot, for the file name of a tangled code chunk when splitting is selected (the option has no effect with ‘split=FALSE’). If ‘TRUE’, the default extension of ‘Rtangle’ (usually ‘.R’) is used; if ‘FALSE’, no extension is added to the file name. By Vincent Goulet.
New function ‘SweaveGetSourceName’ in package ‘utils’ to obtain the name of the file being woven by an ‘Sweave’ process launched from the command line. By Vincent Goulet.
The ‘"Built"’ column returned by ‘installed.packages()’ and ‘old.packages()’ now contains the full value of the ‘"Built"’ entry from the (installed) ‘DESCRIPTION’ file. Previously, only the R version from the ‘"Built"’ entry was returned.
If the timestamp passed as ‘--built-timestamp’ to ‘R CMD INSTALL’ is in RFC-2822 form (with time-zone offset) it will be converted to ISO UTC form to conform to the format used by R for purposes described above. (PR#19037, thanks to Dirk Eddelbuettel)
When ‘Ops’ group methods for matrix-‘"ts"’ return a zero-extent matrix, its type is correct now. E.g., ‘<int> + <dbl>’ now returns type ‘"double"’, see also PR#18972.
The ‘"Built"’ column returned by ‘available.packages()’ and ‘old.packages()’ now contains the full value of the ‘"Built"’ entry (if present) in the ‘DESCRIPTION’ file. Previously, only the R version from the ‘"Built"’ entry was returned.
If the timestamp passed as -built-timestamp to ‘R CMD INSTALL’ is in RFC-822 form (with time-zone offset) it will be converted to ISO UTC form to conform to the format used by R for purposes described above. (PR#19037, thanks to Dirk Eddelbuettel)
If R uses custom binary type in its ‘.Platform$pkgType’ then ‘R CMD INSTALL --build’ will produce ‘<package>_<ver>_R_<system>-<build>.tar.xz’ binary files. Please note that future versions may use ‘.zstd’ compression by default so package tooling should support any of the above mentioned extensions.
‘boxplot()’: when ‘notch=TRUE’, new option ‘warnN=FALSE’ suppresses warnings about “notches outside hinges”.
.
New function ‘messageCondition()’ to create structured ‘"message"’ objects analogous to ‘warningCondition()’ and ‘errorCondition()’ (PR#18940, by Trevor Davis).
The internal ‘cwilcox’ function used in computations for the Wilcoxon distribution is now based on an implementation of a formula by Andreas Löffler provided by Andreas Löffler, Aidan Lakshman, and Ivan Krylov, substantially reducing the memory complexity of the original implementation (PR#18655).
New function ‘R_getRegisteredNamespace’ finds and returns the namespace environment registered for a name, or ‘R_NilValue’ if none is found.
‘hatvalues()’ now has a method for ‘nls’ (nonlinear model) results, prompted by the proposal of Patrice Kiener and Heather Turner in PR#18897.
Parsing deeply nested expressions no longer should segfault in certain circumstances, fixing five different checks on context stack size, thanks to Kevin Ushey's report and Michael Chirico's patch in PR#18994.
Parsing deeply nested expressions no longer should segfault in certain circumstances, fixing five different checks on context stack size thanks to Michael Chirico's report and patch in PR#18994.
The R citation now provides a DOI (10.32614/R.manuals): please update your bibliographies accordingly.
The default C++ standard has been changed to C++20 where available (which it is on all known platforms from 2021 on): if not C++17 is used if available otherwise C++ is not supported (as before).
(GCC 16 has also switched to C++20 as its default.)
Packages can request C++17 if essential.
The default ‘AIC’ and ‘BIC’ methods now check whether the ‘methods’ namespace is loaded rather than ‘stats4’. They still use ‘stats4::logLik’ (and ‘stats4::nobs’), but packages no longer need to load ‘stats4’ explicitly.
‘confint.default()’ now also works on S4 objects, as long as suitable ‘coef()’ and ‘vcov()’ methods exist.
‘binomial(identity)’ and ‘quasibinomial(identity)’ now work without having to quote the argument.
‘str()’ now shows more via ‘format()’ for external pointers.
‘terms(<formula>, specials = *)’ now treats non-syntactic specials more gracefully, thanks to Mikael Jagan's PR#18568.
‘help.start()’ gets a ‘lib.loc’ option and its default for ‘make.packages.html()’ is enhanced to allow, e.g., fast access to ‘.Library’ when that contains only base and recommended packages.
In ‘*.Rd’ help files, the \linkS4class macro now also works for links to other packages via \linkS4class[<pkg>]{<myClass>}, much nicer than the “workaround” \link[<pkg>:<myClass>-class]{<myClass>} necessary in earlier versions of R.
Packages with the new syntax need to formally depend on ‘R >= 4.6.0’.
‘tools::analyze_license()’ now also computes SPDX license identifiers, thanks to Thierry Onkelinx and LLuís Revilla.
‘read.dcf()’ now recognizes lines starting with ‘#’ as comment lines. By Dirk Eddelbuettel, Laurent Gatto and Hugo Gruson.
‘tcltk::tclVersion()’ now only optionally includes the ‘patch level’, as Tcl full versions can be of the form ‘8.7a5’ or ‘9.0b1’ without three clear components.
‘untar(tar = "internal")’ supports ‘extras = "-P"’ to use unchanged the recorded file paths (as many external ‘tar’ programs do).
‘extSoftVersion()[["zstd"]]’ now reports the version of the ‘zstd’ compression library if available, thanks to Trevor Davis' patch proposal in PR#18914.
New logical ‘option()’ ‘quiet’, defaulting to false, set to ‘TRUE’ by R's command-line option ‘--quiet’ (and similar), now can be switched during an R session. Prompted by Dirk Eddelbuettel's proposal in PR#18913.
Credentials for basic HTTP authentication with download method ‘"libcurl"’ can now be provided in a ‘netrc’ file. The path to the file can be specified in ‘options("netrc")’.
‘tools::deparseLatex()’ gains a ‘math’ argument, now used by the default ‘bibstyle’ to format ‘bibentry()’ fields with ‘$...$’ syntax via Rd \eqn markup.
‘gzcon()’ can now decompress a concatenation of compressed streams PR#18887.
Bibliographic citations and references in Rd files can now be auto-generated from bibentries in bibliographic databases in R or BibTeX formats. See ‘RShowDoc("R-exts#Bibliographic-citations-and-references")’ for more information.
Arguments to ‘loadNamespace()’ which will be ignored because the namespace is already loaded are now noted.
‘chkDots()’' optional argument ‘allowed’ has been implemented thanks to Trevor Davis' proposal in PR#18936.
‘wilcox.test()’ can now perform exact (conditional) inference in case of ties. Based on contributions by Torsten Hothorn.
‘wilcox.test()’ can now optionally compute improved asymptotic p-values by including up to 3 correction terms of the Edgeworth series for the normal approximation.
‘barplot(.., orderH = *)’ for stacked bar plots allows to sort the stacks each according to size.
New argument ‘panel.first’ for ‘hist()’ (via ‘plot.histogram()’), ‘barplot()’, ‘bxp()’, and hence implicitly ‘boxplot()’. All except the former also gain a new ‘panel.last’. Suggested by Marieke Stolte and Julian Welz.
‘plot.default()’ gets a new switch ‘lim2’ to indicate that the default ‘xlim’ and ‘ylim’ range computations only use _jointly_ finite x- and y-values; indirectly suggested in PR#7986 by Jincai Jiang.
‘Rman.css’, the stylesheet for the ‘texi2any’-generated HTML versions of the R manuals, was improved following joint efforts at the ‘R Dev Days’ of useR! 2024 and RSECon25.
New system Rd macro ‘\manual{<name>}{<node>}’ to refer to a specific section _etc_ (possibly empty, for ‘Top’) of one of the R manuals (e.g., ‘R-exts’).
‘list.files()’ now has optional argument ‘fixed’ to allow literal pattern matching. Suggested and implemented by Duncan Murdoch in PR#18925.
‘substring(txt, i1, i2)’, ‘substr(..)’ and their replacement versions now accept ‘i2 = NULL’ to mean “to the end_of_string”, thus fulfilling Kevin Ushey (and others') suggestions in PR#18851.
The default method for ‘pretty()’ gets a new switch ‘bounds’ for completeness, corresponding to ‘.pretty()’. Also, it now catches typos such as ‘eps.corrected = 2’, noted in PR#18521 by Mikko Korpela.
Plain-text help now renders Rd \describe lists using line breaks after item labels. Set ‘tools::Rd2txt_options(descStyle=NULL)’ to get the old behaviour with a simple space; a ‘"colon"’ variant is also available.
‘x %notin% table’ newly in ‘base’ is an idiom for ‘!(x %in% table)’ and provided almost entirely for convenience and code readability, from an R-devel suggestion, after many years of private definitions mostly hidden in packages, including in R's ‘tools’ package.
The default method of ‘sequence()’ gets a new option ‘recycle’ to swap between current (not fully recycling) and future behaviour where all three of ‘(nvec, from, by)’ are jointly recycled.
‘ftable()’s default method and the ‘as.table()’ method for ‘"ftable"’s get a ‘perm’ argument with back compatible default. The ‘as.table()’ method also gets a ‘named.dim = FALSE’ switch, no longer creating a named ‘dim(<result>)’ by default.
‘match.arg()’ gets a new option ‘several.ok = "all"’, fulfilling the wish of Jim Hester in PR#16659.
‘provideDimnames()’ gets new switch ‘use.names’, as proposed including patch by Mikael Jagan, in PR#18975.
The default ‘summary()’ is more informative for character vectors, optionally resorting to the factor method via the new argument ‘character.method = "factor"’, e.g., when summarizing a data frame (PR#16750).
It also provides more useful summaries for complex vectors, with ‘polar’ determining if polar or cartesian coordinates are more relevant; mostly based on a proposal by Mikael Jagan.
Error messages from failed Rd \Sexpr code now include the call from the original condition (if available). Warning messages now include Rd source locations.
When the environment variable ‘R_WARN_BOUNDS_OPT’ is set to ‘"yes"’, ‘options(warn = val)’ will check if ‘val’ is inside ‘-1:2’; this may happen unconditionally in the future.
‘weighted.residuals()’ now returns weighted working residuals for ‘"glm"’ objects. It used to return deviance residuals, but these do not give the one-step approximated ‘dfbeta’ values, as pointed out by Ravi Varadhan. ‘influence.glm()’ has been amended so that it now returns an object with both a ‘"wt.res"’ and a ‘"dev.res"’ element.
Several influence measures for ‘"glm"’ objects have been updated to use Pearson residuals rather than deviance residuals (the latter are not unbiased) and to not use leave-one-out estimates of dispersion in models with fixed dispersion. Thanks to Ravi Varadhan for discussions and testing of these updates.
R now supports custom binary types which are of the form ‘"<system>.binary.<build>"’ where ‘<system>’ is lower-case name (letters only) of the system and ‘<build>’ is the name of the build (alphanumeric and dashes). The corresponding paths returned by ‘contrib.url’ (which govern the repository layout) with the above ‘type=’ have the form ‘bin/<system>/<build>/contrib/<x.y>’ where ‘<x.y>’ is the R version without patch level. This is a generalisation of the binary types previously supported on macOS. In addition, binary packages can have the extensions ‘.tar.bz2’, ‘.tar.xz’, ‘.tar.zst’ and ‘.tar.zstd’ with the corresponding compression support.
The value of ‘.Platform$pkgType’ which defines the native binary type for the current build of R can be overridden with ‘R_PLATFORM_PKGTYPE’ environment variable (previously this was only set by the macOS builds of R). This should be typically only done by the author of a binary R distribution to define the type of binaries supported by that build of R.
If R uses custom binary type in its ‘.Platform$pkgType’ then ‘R CMD INSTALL --build’ will produce ‘<package>_<ver>_R_<system>-<build>.tar.zstd’ binary files if R has ‘zstd’ support, ‘.tar.xz’ otherwise.
New facilities have been introduced for package integrity verification and package signing. The optional file ‘SHA256’ in a package contains SHA-256 hashes, lengths and paths of files provided in the package allowing for more reliable integrity verification (relative to ‘MD5’). This file is now generated by default in ‘R CMD INSTALL --build’ and optionally via ‘R CMD build --sha256’. A package can be signed by creating a detached GnuPG signature file ‘SHA256.sig’ signing the entirety of the ‘SHA256’ file. Upon installation, the signature is verified using GnuPG, thus ensuring the integrity of the ‘SHA256’ file and by induction all files in the package. Both source and binary packages can be signed. Currently, this only applies to tar-based packages, and the command-line GnuPG ‘gpg’ tool (or equivalent tool named in the ‘GPG’ environment variable) has to be available for signing and verification to work. ‘R CMD INSTALL --sign’ can be used to sign binary packages, including its use with ‘--build’. System-wide GnuPG keyrings for the R installation can be placed in ‘<R_HOME>/etc/keyrings’ as files with ‘.gpg’ extensions and will be checked first before consulting user's GnuPG keyring (if present).
Experimentally, several math library (‘math.h’) functions, such as ‘exp(.)’, ‘log1p()’, ‘sin()’, ‘atanh()’, when called from R, are now ensured to give fully accurate results in a small neighbourhood of special values, such as ‘exp(0) == 1’, ‘log1p(0) == 0’, etc. This makes R slightly less platform dependent for these functions, notably on platforms with less accurate system math libraries, see also <https://blog.r-project.org/2026/01/30/debugging-sensitivity-to-c-math-library-on-linux/>.
Function ‘free1way()’ implementing semiparametrically efficient inference procedures (likelihood- and permutation-based) in distribution-free stratified K-sample one-way layouts was added to the ‘stats’ package. Approximate (via ‘power.free1way.test()’) and simulation-based (utilising ‘rfree1way()’ for random number generation) power-assessment and sample-size planning as well as model diagnostics (available from a ‘plot’ method and probability-probability plots in ‘ppplot()’) complement the functionality. Provided by Torsten Hothorn.
‘plot.data.frame()’ now supports a ‘formula’ argument.
New Rd macro \linkS4methods{}, e.g., for easier linking to method docs in other packages, proposed and coded by Mikael Jagan in PR#18998.
Class ‘"difftime"’ is now also among the S4 ‘"OldClasses"’.
New function ‘bitstring()’ as a user-friendly wrapper around ‘intToBits()’, etc.
‘plot.lm()’ now omits the smoother in the residuals vs leverage plot. This never made much sense, but if you really want it, you can force the old behaviour by setting ‘panel.raw=panel.smooth’.
The graphics engine version, ‘R_GE_version’, has been bumped to ‘17’ and so packages that provide graphics devices should be reinstalled.
The ‘glyphFont()’ function gains a ‘variations’ argument, which allows variable font axes to be specified, e.g., ‘c(wght = 100)’.
Only the ‘quartz()’ device and Cairo-based graphics devices (but not ‘cairo_pdf()’) support variable font axes so far.
‘configure’ appends ‘bsdtar’ to the list of command names it tries when finding a default for ‘TAR’.
Failures in building the documentation for the base packages, including from parsing their Rd files, are no longer ignored by ‘make docs’.
Building the R manuals now requires Texinfo 6.8 or later.
A new ‘LIBR_LDFLAGS’ defaulting to ‘LDFLAGS’ allows more flexibility, e.g., for distributions such as Gentoo, Debian or Ubuntu, fixing PR#18992; additionally a ‘make’ failure to create ‘libR.pc’ should no longer be ignored, fixing PR#18993; both thanks to Benjamin Drung.
There is a new directory ‘tests/C++Standards’ which contains small packages which can be test-installed to check support for various C++ standards. This is principally for use on Windows as on a Unix-alike this partially duplicates tests done by ‘configure’ - although it can also be used to test the behaviour of ‘R CMD INSTALL’ on unsupported standards.
Specifying C++11 or C++14 in ‘src/Makevars’ has long given a note: in 99% of CRAN packages the specification was unnecessary as the default C++17 sufficed (in a few cases with a deprecation warning from some compilers).
Support for these standards has been removed: the default C++ standard will be used.
‘R CMD config’ variables ‘CXX11’, ‘CXX14’ and their associated ‘CXXxxFLAGS’, ‘CXXxxPICFLAGS’ ‘CXXxxSTD’, ‘SHLIBCXXxxLD’ and ‘SHLIBCXXxxLDFLAGS’ variables are no longer supported and reported as ‘defunct’.
When installing binary packages the time stamp in the ‘"Built"’ field is considered even if the package version is identical to allow binary package repositories to update binaries without the need to increase the package version.
New functions ‘GEcreateDD()’ and ‘GEfreeDD()’ for allocating (and initialising) ‘DevDesc’ structures. Can be used by external graphics devices. Satisfies PR#18292.
New function ‘R_eval_with_gd()’ designed to “lock” a graphics device during call to ‘eval()’ within device drawing routines. External _on-screen_ graphics devices should consider using this function to avoid crashes from the device being closed by the user (e.g., a mouse click) during drawing.
Declarations for non-API functions ‘LOGICAL0’, ‘INTEGER0’, ‘REAL0’, ‘COMPLEX0’, and ‘RAW0’ have been removed from installed header files.
Non-API entry points ‘Rf_acopy_string’ and ‘Rf_lazy_duplicate’ have been added to those reported by ‘R CMD check’.
Packages using the non-API functions ‘ATTRIB’ and ‘SET_ATTRIB’ will now receive check ‘NOTE’s. See ‘Writing R Extensions’ for alternatives to use.
‘R CMD check’ ‘NOTE’s on the use of these non-API entry points have been upgraded to ‘WARNING’s in preparation for removing declarations and, where possible, hiding these entry points: ‘R_nchar’, ‘R_tryWrap’, ‘Rf_GetOption’, ‘R_lsInternal’, ‘BODY’, ‘FORMALS’, ‘CLOENV’, ‘SET_TYPEOF’, ‘STRING_PTR’, ‘R_duplicate_attr’, ‘getConnection’, ‘R_data_class’, ‘STRING_PTR’, ‘SET_OBJECT’, ‘ATTRIB’, ‘SET_ATTRIB’, ‘Rf_findVarInFrame3’.
The deprecated macros ‘CHARACTER_DATA’ and ‘CHARACTER_POINTER’ now return ‘const’ pointers since using writable pointers in packages is not safe.
New function ‘DATAPTR_RW()’ for use in implementing ALTREP ‘Dataptr’ methods. This function should not be used in any other contexts.
New function ‘R_class()’ as the ‘C’ equivalent of ‘class()’ in R.
New function ‘Rf_isScalarString’.
The ‘R_ObjectTable’ type definitions formerly in ‘R_ext/Callbacks.h’ are now available in the new header file ‘R_ext/ObjectTable.h’. This new header file should be used in packages instead of ‘R_ext/Callbacks.h’.
Task callback support declared in ‘R_ext/Callbacks.h’ has been enabled again. It was disabled for R 4.5.0.
The non-API header file ‘R_ext/PrtUtil.h’ is no longer copied to the installed ‘include’ directory.
New function ‘R_mapAttrib’ for iterating over the attributes of an object.
New functions ‘R_altrep_class_name’ and ‘R_altrep_class_package’ for retrieving the class name symbol and package name symbol of an ALTREP object. These should be used instead of ‘ALTREP_CLASS’.
New function ‘R_getAttributes’ returns the same result as the R function ‘attributes’. New functions ‘R_getAttribCount’, ‘R_getAttribNames’, ‘R_hasAttrib’, ‘R_nrow’, and ‘R_ncol’.
The function ‘Rf_isFrame’ has been removed; use ‘Rf_isDataFrame’ instead.
The function ‘VECTOR_PTR’ has been removed.
The non-API function ‘DATAPTR’ is no longer declared in an installed header file.
These entry points are now marked as hidden and no longer have declarations in installed header files: ‘ENVFLAGS’, ‘EXTPTR_PROT’, ‘FRAME’, ‘ENCLOS’, ‘EXTPTR_PTR’, ‘EXTPTR_TAG’, ‘HASHTAB’, ‘IS_S4_OBJECT’, ‘LEVELS’, ‘NAMED’, ‘OBJECT’, ‘R_shallow_duplicate_attr’, ‘Rf_isValidString’, ‘Rf_lazy_duplicate’, ‘Rf_NonNullStringMatch’, ‘SETLENGTH’, ‘SETLEVELS’, ‘SET_BODY’, ‘SET_CLOENV’, ‘SET_ENCLOS’, ‘SET_FORMALS’, ‘SET_ENVFLAGS’, ‘SET_FRAME’, ‘SET_GROWABLE_BIT’, ‘SET_HASHTAB’, ‘SET_NAMED’, ‘SET_S4_OBJECT’, ‘SET_TRUELENGTH’, ‘STDVEC_DATAPTR’, ‘TRUELENGTH’, ‘UNSET_S4_OBJECT’, ‘XTRUELENGTH’.
New experimental API for working with variable bindings in environments. The function ‘R_GetBindingType’ identifies the binding type without forcing a delayed or active binding. New bindings care created by ‘R_MakeDelayedBinding’, ‘R_MakeForcedBinding’ and ‘R_MakeMissingBinding’. Delayed and forced bindings can be inspected with ‘R_ForcedBindingExpression’, ‘R_DelayedBindingExpression’, and ‘R_DelayedBindingEnvironment’. Bindings for ‘...’ in function call environments can be examined with ‘R_findDotsEnv’, ‘R_DotsExist’, ‘R_DotsLength’, ‘R_DotsNames’, ‘R_DotsElt’, ‘R_GetDotType’, ‘R_DotDelayedExpression’, ‘R_DotDelayedEnvironment’, and ‘R_DotForcedExpression’. Contributed by Lionel Henry, Davis Vaughan, and Charlie Gao in PR#18928.
New function ‘R_envSymbols’ returns a vector of the symbols for which an environment contains bindings (PR#18928).
‘R CMD check’ ‘NOTE’s on the use of the non-API entry points ‘PRCODE’, ‘SET_PRCODE’, ‘PRENV’, ‘SET_PRENV’, ‘PRVALUE’, ‘SET_PRVALUE’, ‘R_PromiseExpr’, and ‘Rf_allocSExp’ have been upgraded to ‘WARNING’s in preparation for removing declarations and, where possible, hiding these entry points.
New functions ‘R_getVar’ and ‘R_getVarEx’. In most cases these can be used instead of the non-API functions ‘Rf_findVar’ and ‘Rf_findVarInFrame’. Other cases can be handled by the new API for working with variable bindings.
Packages using any non-API variables will now receive check ‘NOTE’s.
‘R CMD check’ now reports further ‘clang’ warnings including ‘-Wkeyword-macro’. This is most commonly seen for the C23 keywords ‘bool’, ‘true’ and ‘false’, but is also seen for ‘nullptr’ (C23 and C++11). Masking these by macros _may_ generate correct code (but not always) and always results in confusing-to-read code.
The cascaded stylesheet ‘R.css’ now adds less vertical white space when rendering Rd files' \itemize, \enumerate, and \describe list \items to HTML.
Where R is used via extensive IDEs such as ‘RStudio’, their maintainers may need to adapt ‘R.css’ files accordingly.
‘R CMD check’ when passed a tarball looks at its contents and so no longer derives the package name from the tarball name (which can now be arbitrary).
Package ‘README.md’ files are now installed and featured in HTML help.
‘package.skeleton()’ now invisibly returns the path of the created directory, similar to ‘prompt()’ et al., and allows creating blank skeletons without any R objects.
‘structure(NULL, <name> = <val>)’ is now defunct.
Three ‘tk*.slaves()’ functions were deprecated in favor of ‘tk*.child()’ which do need Tcl/Tk version ‘8.6’ or higher.
‘chol(x, pivot=TRUE)’ now zeroes the trailing submatrix when the algorithm stops early. Following the help page instructions on how to reconstruct the matrix in positive semidefinite cases gave incorrect results if the rank was 2 or more less than the dimension (PR#15853).
Profiling ‘"mle"’ objects (‘stats4’ package) could fail because profile MLE used starting value from full MLE. Now starts from profile MLE from previous step.
Setting ‘attributes’ on primitive functions is now an error; previously it modified without copying (as noticed by Henrik Bengtsson on the R-devel mailing list).
Relatedly, changing the ‘environment()’ of a primitive function does no longer happen and gives a warning (to become an error, later).
Dataset ‘LifeCycleSavings’ had a misspelled row name: ‘"Guatamala"’ was corrected to ‘"Guatemala"’.
The ‘Pair(x,y)’ construction in the formula interface to paired tests did not work with the ‘subset’ argument, due to the absence of a ‘[.Pair’ method, which has now been added.
Subsetting ‘"table"’ objects keeps S3 classes more consistently, fixing PR#18845.
When ‘browser()’ is active or when otherwise debugging, R code such as ‘if(TRUE)’ now longer triggers a new browser level, fixing PR#18885 (differently than the fix for PR#15770), with thanks to Ivan Krylov.
‘text()’ now truncates ‘labels’ to maximum length of ‘x’ and ‘y’ (if it is longer), fixing PR#7084. Thanks to Heather Turner, Ella Kaye, and Philippe Grosjean.
‘<Date> %in% set’ is again as fast as it was before R 4.3.0, _via_ a new S3 method ‘mtfrm.Date’.
‘<character> %in% <Date>’ and vice versa are now documented to work in concordance with ‘==’ and as an exception to the typical ‘match()’ behaviour which relies on “univariate” ‘mtfrm()’ alone.
It is now possible to convert _to_ ‘"snpc"’ units via, e.g., ‘grid::convertWidth()’, fixing PR#18915. Thanks to Trevor Davis.
The ‘precip’ dataset had typos in the names ‘"Bismarck"’ and ‘"Pittsburgh"’ (PR#18895).
‘tools::checkReplaceFuns()’ now deals better with replacement methods _not_ available as regular functions in the namespace.
‘length(xpr) <- n’ now also works for ‘expression’ vectors, the same as for ‘list’s, i.e., padding with ‘NULL’ entries if the length is increased. Thanks to Mikael Jagan's PR#18917.
‘<complex>[i] <- NA’ now only sets the _real_ part to ‘NA’, consistently with the ‘as.complex(NA)’ behaviour since R 4.4.0; thanks to Mikael Jagan's PR#18918.
‘format(<list>)’ calling ‘format.default()’ now calls generic ‘format()’ on each list element (rather than ‘format.default()’).
‘tools::Rd2HTML()’ detects paragraphs in more cases of \Sexpr-generated Rd code, fixing a regression in R 3.6.0 originally reported by Georgi Boshnakov and later also in PR#18470. An inactive #ifdef block no longer breaks the paragraph.
Parsing a multi-line string from Rd \Sexpr code no longer doubles the newlines.
‘requireNamespace(.., versionCheck = *)’ now shows an error and returns ‘FALSE’ when the package version check is not fulfilled, thanks to Iris Simmons and Trevor Davis's PR#18255. Additionally, the ‘versionCheck’ argument is checked and when invalid, an error is signalled to avoid subsequent confusing error messages.
‘requireNamespace()’ now throws an error even if the name space is already loaded if it is called with an unmatched argument such as ‘quitely = TRUE’ or ‘quiet = TRUE’ (argument ‘quietly’ cannot be abbreviated as it follows ‘...’).
‘rep()’ signals more specific error messages, notably when using both ‘times’ and ‘each’ optional arguments. Fixes PR#18926, thanks to Ella Kaye and collaborators at useR! 2025's ‘R Dev Day’.
‘jitter(x, amount, factor)’ becomes more robust for non-finite ‘x’ or also negative ‘amount’, ‘factor’. ‘help(jitter)’ is easier to read, fixing PR#17279, thanks to its contributors.
Plain-text help (‘Rd2txt’) lacked markup for ‘\cite’d titles, which are now wrapped in single quotes.
Default column labels are now correctly aligned when printing a matrix with right alignment (PR#18943, thanks to Mikael Jagan).
‘poly(fct, n)’ signals an error again, for a non-‘ordered’ factor ‘fct’, thanks to Roland Fuss' notice on R-devel.
‘terms(<formula>, simplify=TRUE)’ now works correctly also in the cases where the formula has more than one term with NAs such as ‘f(u, b=NA)’ or ‘g(NA)’, finally fixing PR#15275 thanks to Mikael Jagan's patch.
The help page ‘example(matplot)’ now correctly labels Sepal vs Petal dimensions in its first iris data plot, thanks to Jeff Dick's post on R-devel.
‘diff(m, lag, dif)’ for matrix ‘m’ now still returns matrices, also when ‘lag * dif > nrow(m)’ (PR#18972, thanks to Mikael Jagan and Suharto Anggono). ‘diff(<ts-matrix>)’ remains matrix, even when it has length zero.
Values returned by active binding functions are now marked as not mutable to prevent unintended mutation in complex assignment operations.
The default method of ‘sequence()’ now allows to fully recycle all three of ‘(nvec, from, by)’ as always documented; with thanks to Mikael Jagan's report and patch in PR#18304. Its behaviour remains back compatible for now, but can be switched to future behaviour via environment variable ‘R_sequence_recycle’, or explicit ‘recycle = TRUE’.
Subassignment, ‘x[ind] <- val’, to 1-dimensional ‘array’s no longer “drops” them to simple vectors when ‘ind’ is a name, fixing PR#18973, reported by Thomas Soeiro.
The ‘implicitGeneric’ definition for ‘toeplitz()’ produced a default method that failed when ‘toeplitz(x, r)’ was called with more than the first argument. Simple fix from Mikael Jagan.
The error message for ‘array(dim = c())’ now uses ‘"'dim'"’, thanks to Hugo Gruson.
Some legal but strange nested complex assignments are handled a bit more robustly in interpreted code.
‘cacheMetaData()’ does not to mangle primitive generics.
The S4 method ‘norm(<ANY>, type = <missing>)’ for the implicit generic ‘norm()’ now uses ‘type = "O"’ as has been the intention for more than ten years, fixing PR#18979 thanks to Mikael Jagan.
On Windows terminals ‘Ctrl-C’ now breaks out of waiting for keyboard input, fixing PR#18982.
The default ‘summary()’ and its factor method now label missing values ‘NAs’ rather than ‘NA's’, fixing a decades-old grammatical faux pas inherited from S (PR#16348 and PR#18948).
Asymmetric ‘toeplitz(x, r)’ is type consistent now, even when ‘r’ of length 0 or 1 is not used directly. Fixes PR#18996, thanks to Mikael Jagan's patch and test.
‘format(r)’ now keeps ‘names(r)’ also for raw objects ‘r’.
‘rep.int()’ and ‘rep_len()’ again drop names also for factors, fixing a regression in R 4.0.0. (Thanks to a report by Rui Barradas and PR#18999 by Suharto Anggono.)
‘str(x)’ with a ‘list’-like ‘x’ of a class having an ‘str()’ S3 method using ‘NextMethod()’, now no longer outputs ‘"List of <...>"’ in the default method, thanks to Ian Farm's report and fix proposal in PR#19001.
‘as.POSIXlt(ch)’, ‘as.Date(ch)’ etc now also work correctly when ‘ch’ contains ‘"Inf"’, via ‘strptime(.)’, fixing PR#19006.
‘c(<POSIXlt>, ..)’ now fully preserves sub-second accuracy, fulfilling a part of Suharto Anggono's wishlist PR#18989.
The ‘"tzcode"’ attribute of ‘"POSIXlt"’ objects should no longer depend on earlier calls, fixing PR#19005 thanks to Ivan Krylov, a patch by Suharto Anggono and reports of “Non-deterministic POSIXlt tzone in Europe/London ..” on R-devel.
In intervals with very low density ‘cdplot()’ was unreliable, returning probabilities that are greater than one or ‘NaN’ (PR#19011). Fix from Christoph Dalitz and Achim Zeileis.
‘R CMD build’ now installs packages providing their own vignette engine (PR#18191). Patch by Paul Smith.
‘ar.burg()’, ‘ar.yw()’ and ‘ar.ols()’ deal better with non finite AIC values thanks to Simone Giannerini's remarks on R-devel.
The graphics engine version, ‘R_GE_version’, has been bumped to ‘17’
and so packages that provide graphics devices should be reinstalled.
The ‘glyphFont()’ function gains a ‘variations’ argument, which allows variable font axes to be specified, e.g., ‘c(wght = 100)’.
Only the ‘quartz()’ device and Cairo-based graphics devices (but not ‘cairo_pdf()’) support variable font axes so far.
‘configure’ appends ‘bsdtar’ to the list of command names it tries when
finding a default for ‘TAR’.
Failures in building the documentation for the base packages, including
from parsing their Rd files, are no longer ignored by ‘make docs’.
Building the R manuals now requires Texinfo 6.8 or later.
A new ‘LIBR_LDFLAGS’ defaulting to ‘LDFLAGS’ allows more flexibility,
e.g., for distributions such as Gentoo, Debian or Ubuntu, fixing
PR#18992; additionally a ‘make’ failure to create ‘libR.pc’ should no
longer be ignored, fixing PR#18993; both thanks to Benjamin Drung.
‘R CMD check’ now reports further ‘clang’ warnings including
‘-Wkeyword-macro’. This is most commonly seen for the C23 keywords
‘bool’, ‘true’ and ‘false’, but is also seen for ‘nullptr’ (C23 and
C++11). Masking these by macros _may_ generate correct code (but not
always) and always results in confusing-to-read code.
The cascaded stylesheet ‘R.css’ now adds less vertical white space when
rendering Rd files' \itemize, \enumerate, and \describe list \items to
HTML.
Where R is used via extensive IDEs such as ‘RStudio’, their maintainers may need to adapt ‘R.css’ files accordingly.
‘R CMD check’ when passed a tarball looks at its contents and so no
longer derives the package name from the tarball name (which can now be
arbitrary).
Package ‘README.md’ files are now installed and featured in HTML help.
‘package.skeleton()’ now invisibly returns the path of the created
directory, similar to ‘prompt()’ et al., and allows creating blank
skeletons without any R objects.
‘structure(NULL, <name> = <val>)’ is now defunct.
Three ‘tk*.slaves()’ functions were deprecated in favor of
‘tk*.child()’ which do need Tcl/Tk version ‘8.6’ or higher.
‘chol(x, pivot=TRUE)’ now zeroes the trailing submatrix when the
algorithm stops early. Following the help page instructions on how to
reconstruct the matrix in positive semidefinite cases gave incorrect
results if the rank was 2 or more less than the dimension (PR#15853).
Profiling ‘"mle"’ objects (‘stats4’ package) could fail because profile
MLE used starting value from full MLE. Now starts from profile MLE from
previous step.
Setting ‘attributes’ on primitive functions is now an error; previously
it modified without copying (as noticed by Henrik Bengtsson on the
R-devel mailing list).
Relatedly, changing the ‘environment()’ of a primitive function does no longer happen and gives a warning (to become an error, later).
Dataset ‘LifeCycleSavings’ had a misspelled row name: ‘"Guatamala"’ was
corrected to ‘"Guatemala"’.
The ‘Pair(x,y)’ construction in the formula interface to paired tests
did not work with the ‘subset’ argument, due to the absence of a
‘[.Pair’ method, which has now been added.
Subsetting ‘"table"’ objects keeps S3 classes more consistently, fixing
PR#18845.
When ‘browser()’ is active or when otherwise debugging, R code such as
‘if(TRUE)’ now longer triggers a new browser level, fixing PR#18885
(differently than the fix for PR#15770), with thanks to Ivan Krylov.
‘text()’ now truncates ‘labels’ to maximum length of ‘x’ and ‘y’ (if it
is longer), fixing PR#7084. Thanks to Heather Turner, Ella Kaye, and
Philippe Grosjean.
‘<Date> %in% set’ is again as fast as it was before R 4.3.0, _via_ a
new S3 method ‘mtfrm.Date’.
‘<character> %in% <Date>’ and vice versa are now documented to work in concordance with ‘==’ and as an exception to the typical ‘match()’ behaviour which relies on “univariate” ‘mtfrm()’ alone.
It is now possible to convert _to_ ‘"snpc"’ units via, e.g.,
‘grid::convertWidth()’, fixing PR#18915. Thanks to Trevor Davis.
The ‘precip’ dataset had typos in the names ‘"Bismarck"’ and
‘"Pittsburgh"’ (PR#18895).
‘tools::checkReplaceFuns()’ now deals better with replacement methods
_not_ available as regular functions in the namespace.
‘length(xpr) <- n’ now also works for ‘expression’ vectors, the same as
for ‘list’s, i.e., padding with ‘NULL’ entries if the length is
increased. Thanks to Mikael Jagan's PR#18917.
‘<complex>[i] <- NA’ now only sets the _real_ part to ‘NA’,
consistently with the ‘as.complex(NA)’ behaviour since R 4.4.0; thanks
to Mikael Jagan's PR#18918.
‘format(<list>)’ calling ‘format.default()’ now calls generic
‘format()’ on each list element (rather than ‘format.default()’).
‘tools::Rd2HTML()’ detects paragraphs in more cases of \Sexpr-generated
Rd code, fixing a regression in R 3.6.0 originally reported by Georgi
Boshnakov and later also in PR#18470. An inactive #ifdef block no
longer breaks the paragraph.
Parsing a multi-line string from Rd \Sexpr code no longer doubles the
newlines.
‘requireNamespace(.., versionCheck = *)’ now shows an error and returns
‘FALSE’ when the package version check is not fulfilled, thanks to Iris
Simmons and Trevor Davis's PR#18255. Additionally, the ‘versionCheck’
argument is checked and when invalid, an error is signalled to avoid
subsequent confusing error messages.
‘requireNamespace()’ now throws an error even if the name space is
already loaded if it is called with an unmatched argument such as
‘quitely = TRUE’ or ‘quiet = TRUE’ (argument ‘quietly’ cannot be
abbreviated as it follows ‘...’).
‘rep()’ signals more specific error messages, notably when using both
‘times’ and ‘each’ optional arguments. Fixes PR#18926, thanks to Ella
Kaye and collaborators at useR! 2025's ‘R Dev Day’.
‘jitter(x, amount, factor)’ becomes more robust for non-finite ‘x’ or
also negative ‘amount’, ‘factor’. ‘help(jitter)’ is easier to read,
fixing PR#17279, thanks to its contributors.
Plain-text help (‘Rd2txt’) lacked markup for ‘\cite’d titles, which are
now wrapped in single quotes.
Default column labels are now correctly aligned when printing a matrix
with right alignment (PR#18943, thanks to Mikael Jagan).
‘poly(fct, n)’ signals an error again, for a non-‘ordered’ factor
‘fct’, thanks to Roland Fuss' notice on R-devel.
‘terms(<formula>, simplify=TRUE)’ now works correctly also in the cases
where the formula has more than one term with NAs such as ‘f(u, b=NA)’
or ‘g(NA)’, finally fixing PR#15275 thanks to Mikael Jagan's patch.
The help page ‘example(matplot)’ now correctly labels Sepal vs Petal
dimensions in its first iris data plot, thanks to Jeff Dick's post on
R-devel.
‘diff(m, lag, dif)’ for matrix ‘m’ now still returns matrices, also
when ‘lag * dif > nrow(m)’ (PR#18972, thanks to Mikael Jagan and
Suharto Anggono). ‘diff(<ts-matrix>)’ remains matrix, even when it has
length zero.
Values returned by active binding functions are now marked as not
mutable to prevent unintended mutation in complex assignment
operations.
The default method of ‘sequence()’ now allows to fully recycle all
three of ‘(nvec, from, by)’ as always documented; with thanks to Mikael
Jagan's report and patch in PR#18304. Its behaviour remains back
compatible for now, but can be switched to future behaviour via
environment variable ‘R_sequence_recycle’, or explicit ‘recycle =
TRUE’.
Subassignment, ‘x[ind] <- val’, to 1-dimensional ‘array’s no longer
“drops” them to simple vectors when ‘ind’ is a name, fixing PR#18973,
reported by Thomas Soeiro.
The ‘implicitGeneric’ definition for ‘toeplitz()’ produced a default
method that failed when ‘toeplitz(x, r)’ was called with more than the
first argument. Simple fix from Mikael Jagan.
The error message for ‘array(dim = c())’ now uses ‘"'dim'"’, thanks to
Hugo Gruson.
Some legal but strange nested complex assignments are handled a bit
more robustly in interpreted code.
‘cacheMetaData()’ does not to mangle primitive generics.
The S4 method ‘norm(<ANY>, type = <missing>)’ for the implicit generic
‘norm()’ now uses ‘type = "O"’ as has been the intention for more than
ten years, fixing PR#18979 thanks to Mikael Jagan.
On Windows terminals ‘Ctrl-C’ now breaks out of waiting for keyboard
input, fixing PR#18982.
The default ‘summary()’ and its factor method now label missing values
‘NAs’ rather than ‘NA's’, fixing a decades-old grammatical faux pas
inherited from S (PR#16348 and PR#18948).
Asymmetric ‘toeplitz(x, r)’ is type consistent now, even when ‘r’ of
length 0 or 1 is not used directly. Fixes PR#18996, thanks to Mikael
Jagan's patch and test.
‘format(r)’ now keeps ‘names(r)’ also for raw objects ‘r’.
‘rep.int()’ and ‘rep_len()’ again drop names also for factors, fixing a
regression in R 4.0.0. (Thanks to a report by Rui Barradas and
PR#18999 by Suharto Anggono.)
‘str(x)’ with a ‘list’-like ‘x’ of a class having an ‘str()’ S3 method
using ‘NextMethod()’, now no longer outputs ‘"List of <...>"’ in the
default method, thanks to Ian Farm's report and fix proposal in
PR#19001.
‘as.POSIXlt(ch)’, ‘as.Date(ch)’ etc now also work correctly when ‘ch’
contains ‘"Inf"’, via ‘strptime(.)’, fixing PR#19006.
‘c(<POSIXlt>, ..)’ now fully preserves sub-second accuracy, fulfilling
a part of Suharto Anggono's wishlist PR#18989.
The ‘"tzcode"’ attribute of ‘"POSIXlt"’ objects should no longer depend
on earlier calls, fixing PR#19005 thanks to Ivan Krylov, a patch by
Suharto Anggono and reports of “Non-deterministic POSIXlt tzone in
Europe/London ..” on R-devel.
In intervals with very low density ‘cdplot()’ was unreliable, returning
probabilities that are greater than one or ‘NaN’ (PR#19011). Fix from
Christoph Dalitz and Achim Zeileis.
‘R CMD build’ now installs packages providing their own vignette engine
(PR#18191). Patch by Paul Smith.
‘ar.burg()’, ‘ar.yw()’ and ‘ar.ols()’ deal better with non finite AIC
values thanks to Simone Giannerini's remarks on R-devel.
The R citation now provides a DOI (10.32614/R.manuals): please update
your bibliographies accordingly.
The default C++ standard has been changed to C++20 where available
(which it is on all known platforms from 2021 on): if not C++17 is used
if available otherwise C++ is not supported (as before).
(GCC 16 has also switched to C++20 as its default.)
Packages can request C++17 if essential.
.
The default ‘AIC’ and ‘BIC’ methods now check whether the ‘methods’
namespace is loaded rather than ‘stats4’. They still use
‘stats4::logLik’ (and ‘stats4::nobs’), but packages no longer need to
load ‘stats4’ explicitly.
‘confint.default()’ now also works on S4 objects, as long as suitable
‘coef()’ and ‘vcov()’ methods exist.
‘binomial(identity)’ and ‘quasibinomial(identity)’ now work without
having to quote the argument.
‘str()’ now shows more via ‘format()’ for external pointers.
‘terms(<formula>, specials = *)’ now treats non-syntactic specials more
gracefully, thanks to Mikael Jagan's PR#18568.
‘help.start()’ gets a ‘lib.loc’ option and its default for
‘make.packages.html()’ is enhanced to allow, e.g., fast access to
‘.Library’ when that contains only base and recommended packages.
In ‘*.Rd’ help files, the \linkS4class macro now also works for links
to other packages via \linkS4class[<pkg>]{<myClass>}, much nicer than
the “workaround” \link[<pkg>:<myClass>-class]{<myClass>} necessary in
earlier versions of R.
Packages with the new syntax need to formally depend on ‘R >= 4.6.0’.
‘tools::analyze_license()’ now also computes SPDX license identifiers,
thanks to Thierry Onkelinx and LLuís Revilla.
‘read.dcf()’ now recognizes lines starting with ‘#’ as comment lines.
By Dirk Eddelbuettel, Laurent Gatto and Hugo Gruson.
‘tcltk::tclVersion()’ now only optionally includes the ‘patch level’,
as Tcl full versions can be of the form ‘8.7a5’ or ‘9.0b1’ without
three clear components.
‘untar(tar = "internal")’ supports ‘extras = "-P"’ to use unchanged the
recorded file paths (as many external ‘tar’ programs do).
‘extSoftVersion()[["zstd"]]’ now reports the version of the ‘zstd’
compression library if available, thanks to Trevor Davis' patch
proposal in PR#18914.
New logical ‘option()’ ‘quiet’, defaulting to false, set to ‘TRUE’ by
R's command-line option ‘--quiet’ (and similar), now can be switched
during an R session. Prompted by Dirk Eddelbuettel's proposal in
PR#18913.
Credentials for basic HTTP authentication with download method
‘"libcurl"’ can now be provided in a ‘netrc’ file. The path to the
file can be specified in ‘options("netrc")’.
‘tools::deparseLatex()’ gains a ‘math’ argument, now used by the
default ‘bibstyle’ to format ‘bibentry()’ fields with ‘$...$’ syntax
via Rd \eqn markup.
‘gzcon()’ can now decompress a concatenation of compressed streams
PR#18887.
Bibliographic citations and references in Rd files can now be
auto-generated from bibentries in bibliographic databases in R or
BibTeX formats. See
‘RShowDoc("R-exts#Bibliographic-citations-and-references")’ for more
information.
Arguments to ‘loadNamespace()’ which will be ignored because the
namespace is already loaded are now noted.
‘chkDots()’' optional argument ‘allowed’ has been implemented thanks to
Trevor Davis' proposal in PR#18936.
‘wilcox.test()’ can now perform exact (conditional) inference in case
of ties. Based on contributions by Torsten Hothorn.
‘wilcox.test()’ can now optionally compute improved asymptotic p-values
by including up to 3 correction terms of the Edgeworth series for the
normal approximation.
‘barplot(.., orderH = *)’ for stacked bar plots allows to sort the
stacks each according to size.
New argument ‘panel.first’ for ‘hist()’ (via ‘plot.histogram()’),
‘barplot()’, ‘bxp()’, and hence implicitly ‘boxplot()’. All except the
former also gain a new ‘panel.last’. Suggested by Marieke Stolte and
Julian Welz.
‘plot.default()’ gets a new switch ‘lim2’ to indicate that the default
‘xlim’ and ‘ylim’ range computations only use _jointly_ finite x- and
y-values; indirectly suggested in PR#7986 by Jincai Jiang.
‘Rman.css’, the stylesheet for the ‘texi2any’-generated HTML versions
of the R manuals, was improved following joint efforts at the ‘R Dev
Days’ of useR! 2024 and RSECon25.
New system Rd macro ‘\manual{<name>}{<node>}’ to refer to a specific
section _etc_ (possibly empty, for ‘Top’) of one of the R manuals
(e.g., ‘R-exts’).
‘list.files()’ now has optional argument ‘fixed’ to allow literal
pattern matching. Suggested and implemented by Duncan Murdoch in
PR#18925.
‘substring(txt, i1, i2)’, ‘substr(..)’ and their replacement versions
now accept ‘i2 = NULL’ to mean “to the end_of_string”, thus fulfilling
Kevin Ushey (and others') suggestions in PR#18851.
The default method for ‘pretty()’ gets a new switch ‘bounds’ for
completeness, corresponding to ‘.pretty()’. Also, it now catches typos
such as ‘eps.corrected = 2’, noted in PR#18521 by Mikko Korpela.
Plain-text help now renders Rd \describe lists using line breaks after
item labels. Set ‘tools::Rd2txt_options(descStyle=NULL)’ to get the
old behaviour with a simple space; a ‘"colon"’ variant is also
available.
‘x %notin% table’ newly in ‘base’ is an idiom for ‘!(x %in% table)’ and
provided almost entirely for convenience and code readability, from an
R-devel suggestion, after many years of private definitions mostly
hidden in packages, including in R's ‘tools’ package.
The default method of ‘sequence()’ gets a new option ‘recycle’ to swap
between current (not fully recycling) and future behaviour where all
three of ‘(nvec, from, by)’ are jointly recycled.
‘ftable()’s default method and the ‘as.table()’ method for ‘"ftable"’s
get a ‘perm’ argument with back compatible default. The ‘as.table()’
method also gets a ‘named.dim = FALSE’ switch, no longer creating a
named ‘dim(<result>)’ by default.
‘match.arg()’ gets a new option ‘several.ok = "all"’, fulfilling the
wish of Jim Hester in PR#16659.
‘provideDimnames()’ gets new switch ‘use.names’, as proposed including
patch by Mikael Jagan, in PR#18975.
The default ‘summary()’ is more informative for character vectors,
optionally resorting to the factor method via the new argument
‘character.method = "factor"’, e.g., when summarizing a data frame
(PR#16750).
It also provides more useful summaries for complex vectors, with ‘polar’ determining if polar or cartesian coordinates are more relevant; mostly based on a proposal by Mikael Jagan.
Error messages from failed Rd \Sexpr code now include the call from the
original condition (if available). Warning messages now include Rd
source locations.
When the environment variable ‘R_WARN_BOUNDS_OPT’ is set to ‘"yes"’,
‘options(warn = val)’ will check if ‘val’ is inside ‘-1:2’; this may
happen unconditionally in the future.
‘weighted.residuals()’ now returns weighted working residuals for
‘"glm"’ objects. It used to return deviance residuals, but these do not
give the one-step approximated ‘dfbeta’ values, as pointed out by Ravi
Varadhan. ‘influence.glm()’ has been amended so that it now returns an
object with both a ‘"wt.res"’ and a ‘"dev.res"’ element.
Several influence measures for ‘"glm"’ objects have been updated to use
Pearson residuals rather than deviance residuals (the latter are not
unbiased) and to not use leave-one-out estimates of dispersion in
models with fixed dispersion. Thanks to Ravi Varadhan for discussions
and testing of these updates.
R now supports custom binary types which are of the form
‘"<system>.binary.<build>"’ where ‘<system>’ is lower-case name
(letters only) of the system and ‘<build>’ is the name of the build
(alphanumeric and dashes). The corresponding paths returned by
‘contrib.url’ (which govern the repository layout) with the above
‘type=’ have the form ‘bin/<system>/<build>/contrib/<x.y>’ where
‘<x.y>’ is the R version without patch level. This is a generalisation
of the binary types previously supported on macOS. In addition, binary
packages can have the extensions ‘.tar.bz2’, ‘.tar.xz’, ‘.tar.zst’ and
‘.tar.zstd’ with the corresponding compression support.
The value of ‘.Platform$pkgType’ which defines the native binary type
for the current build of R can be overridden with ‘R_PLATFORM_PKGTYPE’
environment variable (previously this was only set by the macOS builds
of R). This should be typically only done by the author of a binary R
distribution to define the type of binaries supported by that build of
R.
If R uses custom binary type in its ‘.Platform$pkgType’ then ‘R CMD
INSTALL --build’ will produce
‘<package>_<ver>_R_<system>-<build>.tar.zstd’ binary files if R has
‘zstd’ support, ‘.tar.xz’ otherwise.
New facilities have been introduced for package integrity verification
and package signing. The optional file ‘SHA256’ in a package contains
SHA-256 hashes, lengths and paths of files provided in the package
allowing for more reliable integrity verification (relative to ‘MD5’).
This file is now generated by default in ‘R CMD INSTALL --build’ and
optionally via ‘R CMD build --sha256’. A package can be signed by
creating a detached GnuPG signature file ‘SHA256.sig’ signing the
entirety of the ‘SHA256’ file. Upon installation, the signature is
verified using GnuPG, thus ensuring the integrity of the ‘SHA256’ file
and by induction all files in the package. Both source and binary
packages can be signed. Currently, this only applies to tar-based
packages, and the command-line GnuPG ‘gpg’ tool (or equivalent tool
named in the ‘GPG’ environment variable) has to be available for
signing and verification to work. ‘R CMD INSTALL --sign’ can be used to
sign binary packages, including its use with ‘--build’. System-wide
GnuPG keyrings for the R installation can be placed in
‘<R_HOME>/etc/keyrings’ as files with ‘.gpg’ extensions and will be
checked first before consulting user's GnuPG keyring (if present).
Experimentally, several math library (‘math.h’) functions, such as
‘exp(.)’, ‘log1p()’, ‘sin()’, ‘atanh()’, when called from R, are now
ensured to give fully accurate results in a small neighbourhood of
special values, such as ‘exp(0) == 1’, ‘log1p(0) == 0’, etc. This
makes R slightly less platform dependent for these functions, notably
on platforms with less accurate system math libraries, see also
<https://blog.r-project.org/2026/01/30/debugging-sensitivity-to-c-math-library-on-linux/>.
Function ‘free1way()’ implementing semiparametrically efficient
inference procedures (likelihood- and permutation-based) in
distribution-free stratified K-sample one-way layouts was added to the
‘stats’ package. Approximate (via ‘power.free1way.test()’) and
simulation-based (utilising ‘rfree1way()’ for random number generation)
power-assessment and sample-size planning as well as model diagnostics
(available from a ‘plot’ method and probability-probability plots in
‘ppplot()’) complement the functionality. Provided by Torsten Hothorn.
‘plot.data.frame()’ now supports a ‘formula’ argument.
New Rd macro \linkS4methods{}, e.g., for easier linking to method docs
in other packages, proposed and coded by Mikael Jagan in PR#18998.
Class ‘"difftime"’ is now also among the S4 ‘"OldClasses"’.
New function ‘bitstring()’ as a user-friendly wrapper around
‘intToBits()’, etc.
‘plot.lm()’ now omits the smoother in the residuals vs leverage plot.
This never made much sense, but if you really want it, you can force
the old behaviour by setting ‘panel.raw=panel.smooth’.
.
.
Specifying C++11 or C++14 in ‘src/Makevars’ has long given a note: in
99% of CRAN packages the specification was unnecessary as the default
C++17 sufficed (in a few cases with a deprecation warning from some
compilers).
Support for these standards has been removed: the default C++ standard will be used.
‘R CMD config’ variables ‘CXX11’, ‘CXX14’ and their associated ‘CXXxxFLAGS’, ‘CXXxxPICFLAGS’ ‘CXXxxSTD’, ‘SHLIBCXXxxLD’ and ‘SHLIBCXXxxLDFLAGS’ variables are no longer supported and reported as ‘defunct’.
When installing binary packages the time stamp in the ‘"Built"’ field
is considered even if the package version is identical to allow binary
package repositories to update binaries without the need to increase
the package version.
.
.
The ‘R_ObjectTable’ type definitions formerly in ‘R_ext/Callbacks.h’ are now available in the new header file ‘R_ext/ObjectTable.h’. This new header file should be used in packages instead of ‘R_ext/Callbacks.h’.
