extendr v0.9.0 is release! π (hopefully) our last until v1.0.0!
Improved DX π¨π»βπ»
π’πππ§ππ©ππ€π£ ππͺπππ included!
- `anyhow` support out of the box
- deprecates `rextendr::document()` use {devtools} only!
- use std trait implementations instead of custom methods
#rstats #rust
extendr.rs/blog/posts/2...
Posts by Etienne Bacher
A Unified Dashboard and Orchestrator for Quality ChecksΒΆ Unit tests Β· Data validation Β· Linting Β· Spelling Run every quality check on your project using a single command: unit tests, data validation, linters, spell checkers. Scrutin watches for edits, figures out which checks are affected, and re-runs them in parallel. Drill into a failure to see the expected and actual values, as well as the relevant source code. Use quick keystrokes to fix linting and spelling issues, or to open files in your editor of choice.
π¨ #RStats and #PyData devs!
I'm looking for Ξ² testers for this thing I just built: A unified dashboard + orchestrator for code and data quality checks.
It has lots of neat features and I'm super eager for feedback and bug reports.
Check out the video demo:
vincentarelbundock.github.io/scrutin/
LGTM
New post on the @ropensci.org blog, "A Better R Programming Experience Thanks to Tree-sitter"
Edited by @etiennebacher.bsky.social, @davisvaughan.bsky.social, Steffi LaZerte
ropensci.org/blog/2026/04...
#RStats
#rstats tidypolars 0.18.0 is available! tidypolars provides the tidyverse syntax while using polars for better performance.
In this release:
- support more base R functions
- bug fixes (including better NA handling in several functions)
- and more
Changelog: www.tidypolars.etiennebacher.com/news/
R also has seq_len, seq_along, readLines, tryCatch, Filter, etc.
I'd say just pick a style and be consistent in a package
Diff where some code was moved out of f to a helper function g. The diff highlights parts of both functions without matching delimiters.
Diff where the same code was moved out of f to a helper function g. Difftastic does a better job of highlighting the whole definition of f, and just the name and left arrow defining g. No unmatched delimiters!
Native git diff for a function that got a new argument and whose definition is now on multiple lines because it got too long to fit on one line of 80 characters. Git highlights all the lines as changed.
Difftastic diff for a function that got a new argument and whose definition is now on multiple lines because it got too long to fit on one line of 80 characters. Difftastic only highlights the line with the new argument and the comma on the line before that.
New post! Better Git diff with difftastic
A diffing tool that understands syntax and can
- ignore formatting changes
- match delimiters in wrappers
- ...
masalmon.eu/2026/03/30/d...
#RStats
That's limited to R packages for now, but maybe in the future
One could argue that it's easy to forget ungroup(). But in any case this rule is disabled by default (and I also don't like all linting rules ;) )
A screenshot showing an R file: library(dplyr) mtcars |> group_by(cyl, am) |> mutate(mean_mpg = mean(mpg)) |> ungroup() and a terminal with the output of "jarl check test.R --select DPLYR". The output in the terminal shows that the chain "group_by() + mutate() / ungroup()" is reported by Jarl because it could be simplified to "mutate(..., .by = c(...))".
A screenshot showing an R file: library(dplyr) starwars |> filter(hair_color == "blond" | is.na(hair_color)) and a terminal with the output of "jarl check test.R --select DPLYR". The output in the terminal shows that the "filter()" is reported by Jarl because it could be simplified to "filter_out(hair_color != "blond")".
And finally, Jarl now accepts rules that apply to some packages only, e.g. only to `dplyr::filter()`. It comes with two rules in the "DPLYR" family for now, but feel free to suggest more (and in other pkgs)!
That's it for the summary, but check out the blog post and changelog for more info!
(4/4)
A screenshot showing an R file in a package: f <- function() 1 and a terminal with the output of "jarl check mypkg". The output in the terminal shows that "f" is reported by Jarl because it's defined but not used anywhere and not exported.
A screenshot showing two R files in a package: #' @examples #' f() f <- function() 1 and #' @examples #' f() f <- function() 2 and a terminal with the output of "jarl check mypkg". The output in the terminal shows that "f" is reported by Jarl because it's defined multiple times.
Still for package developers, Jarl can find unused functions (meaning not used anywhere in the package and not exported) as well as duplicated function definitions.
(3/4)
A screenshot showing a qmd file: --- format: html --- ```{r} any(is.na(x)) ``` ```{r} #| jarl-ignore-chunk: #| - any_is_na: this is just a demo any(is.na(x)) ``` and a terminal with the output of "jarl check .". The output in the terminal shows that the first "any(is.na(x))" is reported by Jarl but not the second one because of the suppression comment.
A screenshot showing an R file in a package: #' @title hi #' @examples #' any(is.na(x)) #' #' f() f <- function() 1 and a terminal with the output of "jarl check mypkg". The output in the terminal shows that "#' any(is.na(x))" is reported by Jarl.
Jarl now checks R code chunks in R Markdown and Quarto documents. The new comment "#| jarl-ignore-chunk" hides diagnostics and doesn't appear in rendered documents.
For package developers, Jarl also analyzes the "@examples" and "@examplesIf" sections if you use roxygen2.
(2/4)
#rstats I'm glad to announce Jarl 0.5.0!
Jarl is a very fast R linter, written in Rust. This release brings many improvements and fixes.
See the blog post: www.etiennebacher.com/posts/2026-0...
And the full changelog: jarl.etiennebacher.com/changelog
π§΅ to highlight some features below
(1/4)
Homepage of the R Mailing List Archives showing a search bar, three popular lists (R-help with 398,500 messages, R-devel with 63,425, and R-package-devel with 12,125), and a full directory of core lists and special interest groups.
29 years of #rstats community knowledge was sitting in hard-to-search pipermail archives. So I built a more modern home for it.
Introducing the R Mailing List Archives: 631,000+ messages from 32 lists, fully searchable and available as open data.
r-mailing-lists.thecoatlessprofessor.com
Yes, a bit, but also some coaching could have been done earlier (like dupont serin).
But sometimes the opponent just has a great day, at least we got to see beautiful rugby. And with this BP the tournament victory almost only depends on us
Also fair to assume that Scotland would have better defended if they didn't have a 25+ points margin
Back in December, I presented at a "Fast Computing" workshop hosted by the Bank of Portugal. The videos + materials are now all available online. github.com/BPLIM/Worksh...
(Also including cool talks by @s3alfisc.bsky.social, @sebkrantz.bsky.social, and others.)
A screenshot with three panels. The two top panels show two R files where an R function "expr_uses_col_from_dots" is defined (therefore two functions are given the same name). The bottom panel shows the output of "jarl check . --select duplicated_function_definition", highlighting one of the "expr_uses_col_from_dots" with the message: `expr_uses_col_from_dots` is defined more than once in this package. help: Other definition at R/utils-expr.R:885:1
This will be available in the next version of Jarl (0.5.0):
Alt+enter
Yes it's a complement, not a replacement. They don't do the same thing
And a bit of self promotion π: if you use R, you could try out my new linter Jarl
jarl.etiennebacher.com
A linter often plays well with a formatter, whose job is to automatically format the code to match some rules in terms of spacing, indentation, etc
A linter could also detect correctness issues in the code, for example to find code that can never run because it comes after a return() in a function.
Another example is detecting code that we know will error if it runs.
A linter checks for several patterns of code that could / should be fixed to improve it.
For instance, some code might produce the correct output but could be slow or hard to read because it doesn't use the most appropriate function for the job. A linter could detect that and recommend a fix.
Thank you, it's always nice to read that :)
Well deserved, congrats!
#rstats tidypolars 0.17.0 is available!
tidypolars provides the tidyverse syntax while using polars for better perf.
In this release:
- support new functions from dplyr 1.2.0 (filter_out, when_any...)
- pivot_wider with lazyframe
- bug fixes
and more
News: tidypolars.etiennebacher.com/news/
Not for now, this is sth that maybe will be implemented but I have some concerns, see github.com/etiennebache...
You had a great timing, I had already planned to release today ^^