<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>rOpenSci - open tools for open science</title><link>https://ropensci.org/rbloggers/index.xml</link><description>Recent content on rOpenSci - open tools for open science</description><generator>Hugo</generator><language>en</language><atom:link href="https://ropensci.org/rbloggers/index.xml" rel="self" type="application/rss+xml"/><item><title>Expanding the Editorial Team: Alec Robitaille and Lucy D'Agostino McGowan Join as Editors</title><link>https://ropensci.org/blog/2026/04/16/editors2026/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>rOpenSci</author><guid>https://ropensci.org/blog/2026/04/16/editors2026/</guid><description>
&lt;p&gt;At rOpenSci, we&amp;rsquo;re continually grateful for the support and engagement of our community, who help make research open-source stronger, more inclusive, and more collaborative. The &lt;a href="https://ropensci.org/software-review/"&gt;software peer review program&lt;/a&gt; continues to grow, and today we announce that our editorial team keeps expanding:&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re excited to welcome &lt;em&gt;Alec Robitaille&lt;/em&gt; and &lt;em&gt;Lucy D&amp;rsquo;Agostino McGowan&lt;/em&gt; as new editors. Alec joins our general review team, and Lucy our statistical software review team. Their expertise and dedication will help sustain and strengthen software peer review, ensuring that software reviews continue to meet the highest standards of quality, transparency, and impact.&lt;/p&gt;
&lt;p&gt;Meet our new editors!&lt;/p&gt;
&lt;h2&gt;
Alec Robitaille
&lt;/h2&gt;&lt;div class="float-left"&gt;&lt;figure class="m-0"&gt;&lt;img src="https://ropensci.org/img/team/alec-robitaille.png"
alt="headshot of Alec Robitaille"ZgotmplZ
ZgotmplZ
ZgotmplZ
style=" object-fit: cover; object-position: center; height: 250px; width: 200; margin-right: 15px"
/&gt;
&lt;p&gt;
Alec is a graduate student at Memorial University of Newfoundland and Labrador (Canada) studying foraging ecology, habitat selection and social networks in caribou and other ungulates. He has been involved in many projects along the way, from measuring muskrat habitat and lake ice dynamics at McGill University to estimating drought sensitivity in Canada&amp;rsquo;s forests with the Canadian Forestry Service. Passionate about teaching open science and programming, he regularly mentors peers, runs workshops, develops example repositories, and organizes a Bayesian stats colearning group. He maintains the package &lt;a href="https://github.com/ropensci/spatsoc"&gt;spatsoc&lt;/a&gt; (&lt;a href="https://github.com/ropensci/software-review/issues/237"&gt;reviewed&lt;/a&gt; by rOpenSci in 2018) and has developed smaller packages with diverse applications including remote sensing (&lt;a href="https://cran.r-project.org/web/packages/irg/"&gt;irg&lt;/a&gt;), social networks (&lt;a href="https://cran.r-project.org/web/packages/hwig/"&gt;hwig&lt;/a&gt;), camera trap monitoring (&lt;a href="https://github.com/robitalec/camtrapmonitoring"&gt;camtrapmonitoring&lt;/a&gt;), and animal movement (&lt;a href="https://cran.r-project.org/web/packages/distanceto/"&gt;distanceto&lt;/a&gt;). He reviewed the &lt;a href="https://github.com/ropensci/software-review/issues/568"&gt;ohun&lt;/a&gt;, &lt;a href="https://github.com/ropensci/software-review/issues/638"&gt;chopin&lt;/a&gt;, and &lt;a href="https://github.com/ropensci/software-review/issues/653"&gt;emodnet.wfs&lt;/a&gt; packages for rOpenSci, guest edited for the &lt;a href="https://github.com/ropensci/software-review/issues/663"&gt;rredlist&lt;/a&gt; package and is currently handling the reviews for the &lt;a href="https://github.com/ropensci/software-review/issues/732"&gt;ActiGlobe&lt;/a&gt;, and &lt;a href="https://github.com/ropensci/software-review/issues/754"&gt;saperlipopette&lt;/a&gt; packages.
&lt;/p&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;p&gt;Alec on &lt;a href="https://github.com/robitalec"&gt;GitHub&lt;/a&gt;, &lt;a href="http://robitalec.ca/"&gt;Website&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class='blockquote text-left'&gt;
&lt;p class="mb-0"&gt;I first connected with the rOpenSci community through the review process for the package spatsoc in 2018 as part of our manuscript submission at Methods in Ecology and Evolution. During the review, I was thoroughly impressed by how welcoming the community was, and how effective the process was in helping me learn how to improve the package. rOpenSci is a landmark in the R and open science ecosystems with an ever evolving community to learn from and to be a part of. I am very grateful to be given the opportunity to continue contributing to rOpenSci in this new role as editor.&lt;/p&gt;
&lt;footer class="blockquote-footer"&gt;Alec L. Robitaille &lt;/footer&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
Lucy D&amp;rsquo;Agostino McGowan
&lt;/h2&gt;&lt;div class="float-left"&gt;&lt;figure class="m-0"&gt;&lt;img src="https://ropensci.org/img/team/lucy-dagonstino-mcgowan.jpg"
alt="headshot of Lucy D&amp;#39;Agostino McGowan"ZgotmplZ
ZgotmplZ
ZgotmplZ
style=" object-fit: cover; object-position: center; height: 250px; width: 200; margin-right: 15px"
/&gt;
&lt;p&gt;
Lucy D’Agostino McGowan is an associate professor in the Department of Statistical Sciences at Wake Forest University. She received her PhD in Biostatistics from Vanderbilt University and completed her postdoctoral training at Johns Hopkins University Bloomberg School of Public Health. Her research focuses on causal inference, statistical communication, analytic design theory, and data science pedagogy. Lucy can be found blogging at &lt;a href="https://livefreeordichotomize.com/"&gt;livefreeordichotomize.com&lt;/a&gt;, on Blue Sky &lt;a href="https://bsky.app/profile/lucystats.bsky.social"&gt;@LucyStats.bsky.social&lt;/a&gt;, and podcasting on &lt;a href="https://open.spotify.com/show/1L8TqB17Peo7jNgXuPObwi"&gt;Casual Inference&lt;/a&gt;.
&lt;/p&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;p&gt;Lucy on &lt;a href="https://github.com/LucyMcGowan"&gt;GitHub&lt;/a&gt;, &lt;a href="https://www.lucymcgowan.com/"&gt;Website&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class='blockquote text-left'&gt;
&lt;p class="mb-0"&gt;I am so thrilled to join the rOpenSci editorial team! I love the rOpenSci community and mission and am grateful for the opportunity to contribute.&lt;/p&gt;
&lt;footer class="blockquote-footer"&gt;Lucy D&amp;rsquo;Agostino McGowan &lt;/footer&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
About the Software Peer Review Program
&lt;/h2&gt;&lt;p&gt;rOpenSci&amp;rsquo;s software peer review program brings together volunteers to collaboratively review scientific and statistical software according to transparent, constructive, and open standards. Editors manage submissions, coordinate reviewers, and help guide packages through review to improve code quality, documentation, and usability.&lt;/p&gt;
&lt;p&gt;This program is possible thanks to the many community members: authors submitting their packages, reviewers volunteering their time and expertise, and editors like Alec and Lucy who help managing reviews and maintaining a supportive process.&lt;/p&gt;
&lt;h2&gt;
Get Involved
&lt;/h2&gt;&lt;p&gt;Are you considering submitting your package for review? These resources will help:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;About &lt;a href="https://ropensci.org/software-review/"&gt;rOpenSci Software Peer Review&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Browse the online book &lt;a href="https://devguide.ropensci.org/"&gt;rOpenSci Packages: Development, Maintenance, and Peer Review&lt;/a&gt; and &lt;a href="https://stats-devguide.ropensci.org"&gt;rOpenSci Statistical Software Peer Review&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Read public &lt;a href="https://github.com/ropensci/software-review/issues"&gt;software review threads on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Would you like to review packages? Fill out the &lt;a href="https://airtable.com/app8dssb6a7PG6Vwj/shrnfDI2S9uuyxtDw"&gt;rOpenSci Reviewer Sign-Up Form&lt;/a&gt; to volunteer to review.&lt;/p&gt;
&lt;p&gt;Welcome again &lt;strong&gt;Alec and Lucy&lt;/strong&gt;! We&amp;rsquo;re thrilled to have you join the editorial team.&lt;/p&gt;</description></item><item><title>reviser: Analyzing Real-Time Data Revisions in R</title><link>https://ropensci.org/blog/2026/04/13/reviser/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><author>rOpenSci</author><guid>https://ropensci.org/blog/2026/04/13/reviser/</guid><description>
&lt;p&gt;Economic data are rarely static.
Gross domestic product (GDP), inflation, employment, and other official statistics arrive as early estimates, then get revised as new source data arrive, seasonal adjustment is updated, or benchmarking changes are applied.
Those revisions matter because they can change the narrative around turning points, policy mistakes, and forecast performance.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.ropensci.org/reviser/"&gt;&lt;code&gt;reviser&lt;/code&gt;&lt;/a&gt; is an R package by Marc Burri and Philipp Wegmüller for working with these vintage datasets directly.
A vintage dataset records multiple published versions of the same time series, so you can compare what was known at each release date with what was reported later.
&lt;code&gt;reviser&lt;/code&gt; gives you a consistent workflow to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reshape release vintages between wide and tidy formats;&lt;/li&gt;
&lt;li&gt;extract revisions relative to earlier or final releases;&lt;/li&gt;
&lt;li&gt;summarize bias, dispersion, and serial dependence in revisions;&lt;/li&gt;
&lt;li&gt;identify the first release that is statistically close to the eventual benchmark;&lt;/li&gt;
&lt;li&gt;nowcast future revisions with state-space models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The package is aimed at users who already work with real-time macroeconomic data and want tools that go beyond plotting revision triangles by hand.
One design goal is to keep that workflow in pure R.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;reviser&lt;/code&gt; was reviewed through &lt;a href="https://github.com/ropensci/software-review/issues/709"&gt;rOpenSci statistical software peer review&lt;/a&gt;.
Many thanks to reviewers &lt;a href="https://github.com/AlexGibberd"&gt;Alex Gibberd&lt;/a&gt;, and &lt;a href="https://github.com/TanguyBarthelemy"&gt;Tanguy Barthelemy&lt;/a&gt;, and to editor &lt;a href="https://github.com/rkillick"&gt;Rebecca Killick&lt;/a&gt;, for feedback that improved the package.&lt;/p&gt;
&lt;h2&gt;
Why revision analysis deserves its own workflow
&lt;/h2&gt;&lt;p&gt;Revisions are not just measurement noise.
They encode how information enters the data-production process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some revisions reflect genuinely new information.&lt;/li&gt;
&lt;li&gt;Others reflect noise that could, in principle, have been reduced earlier.&lt;/li&gt;
&lt;li&gt;Still others come from methodological changes or benchmark updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These distinctions matter if you are evaluating early data releases, building nowcasts, or asking whether first releases are already efficient summaries of the available information.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;reviser&lt;/code&gt; vignettes organize this workflow into three layers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Structure vintages consistently.&lt;/li&gt;
&lt;li&gt;Measure and test revision properties.&lt;/li&gt;
&lt;li&gt;Model the revision process when you want to predict future changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
A compact example with GDP vintages
&lt;/h2&gt;&lt;p&gt;The first step is to reshape the data into a tidy vintage format, where each row corresponds to an observed value, the date it refers to, and the publication date of that estimate.&lt;/p&gt;
&lt;p&gt;The package ships with a GDP example dataset in long vintage format.
Suppose we want to focus on U.S. GDP growth, visualize how estimates moved during the 2008-09 global financial crisis, and then ask whether early releases were systematically biased relative to a later benchmark.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reviser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dplyr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tsbox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gdp_us&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;gdp&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;US&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tsbox&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ts_pc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tsbox&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ts_span&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;1980-01-01&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gdp_wide&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;vintages_wide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gdp_us&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gdp_long&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;vintages_long&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gdp_wide&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keep_na&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the vintages in tidy form, we can plot how the published path changed over time.
The y-axis in the figure reports quarter-on-quarter GDP growth rates.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;plot_vintages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gdp_long&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pub_date&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nf"&gt;as.Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2009-01-01&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pub_date&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;as.Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2010-01-01&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;as.Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2008-01-01&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;as.Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2010-01-01&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;line&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Revisions of GDP during the 2008-09 global financial crisis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ylab&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Quarter-on-quarter GDP growth rate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src="https://ropensci.org/blog/2026/04/13/reviser/gdp-example-plot-1.svg"
alt="Multiple vintage paths for U.S. GDP growth, highlighting how estimates published in 2009 changed over time." width="100%"&gt;&lt;figcaption&gt;
&lt;p&gt;GDP growth vintages for the United States during the 2008-09 global financial crisis.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;During volatile periods, the vintage paths can diverge enough that the story told by the first release is noticeably different from the story told a year later.&lt;/p&gt;
&lt;p&gt;Once the data are in tidy vintage form, you can compare a set of early releases to a later benchmark release.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;final_release&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;get_nth_release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gdp_long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;early_releases&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;get_nth_release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gdp_long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;summary_tbl&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;get_revision_analysis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;early_releases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;final_release&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Warning: Both &amp;#39;release&amp;#39; and &amp;#39;pub_date&amp;#39; columns are present in &amp;#39;df.
The &amp;#39;release&amp;#39; column will be used for grouping.
&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;summary_tbl&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;`Bias &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;`, `&lt;/span&gt;&lt;span class="nf"&gt;Bias &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;robust&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;`, `Noise&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Signal`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;
=== Revision Analysis Summary ===
# A tibble: 7 × 5
id release `Bias (mean)` `Bias (robust p-value)` `Noise/Signal`
&amp;lt;chr&amp;gt; &amp;lt;chr&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt; &amp;lt;dbl&amp;gt;
1 US release_0 -0.014 0.52 0.22
2 US release_1 -0.015 0.425 0.202
3 US release_2 -0.013 0.507 0.205
4 US release_3 -0.003 0.851 0.194
5 US release_4 -0.014 0.326 0.157
6 US release_5 -0.021 0.181 0.152
7 US release_6 -0.018 0.202 0.13
=== Interpretation ===
id=US, release=release_0:
• No significant bias detected (p = 0.52 )
• Moderate revision volatility (Noise/Signal = 0.22 )
id=US, release=release_1:
• No significant bias detected (p = 0.425 )
• Moderate revision volatility (Noise/Signal = 0.202 )
id=US, release=release_2:
• No significant bias detected (p = 0.507 )
• Moderate revision volatility (Noise/Signal = 0.205 )
id=US, release=release_3:
• No significant bias detected (p = 0.851 )
• Moderate revision volatility (Noise/Signal = 0.194 )
id=US, release=release_4:
• No significant bias detected (p = 0.326 )
• Moderate revision volatility (Noise/Signal = 0.157 )
id=US, release=release_5:
• No significant bias detected (p = 0.181 )
• Moderate revision volatility (Noise/Signal = 0.152 )
id=US, release=release_6:
• No significant bias detected (p = 0.202 )
• Moderate revision volatility (Noise/Signal = 0.13 )
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is where &lt;code&gt;reviser&lt;/code&gt; moves beyond a reshape-and-plot package.
The revision summary reports quantities that applied work often needs but usually rebuilds ad hoc: mean bias, quantiles, volatility, noise-to-signal ratios, and hypothesis tests for bias, serial correlation, and news-versus-noise interpretations.&lt;/p&gt;
&lt;p&gt;In the bundled example, the early U.S. GDP releases over this sample show little evidence of systematic bias relative to the later benchmark.
The package also supports efficient-release diagnostics, where the question is not only whether revisions exist, but when additional revisions stop adding meaningful information.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;efficient_release&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;get_first_efficient_release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;early_releases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;final_release&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;efficient_release&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Efficient release: 0
Model summary:
Call:
stats::lm(formula = formula, data = df_wide)
Residuals:
Min 1Q Median 3Q Max
-0.89186 -0.12669 0.02046 0.11475 0.97986
Coefficients:
Estimate Std. Error t value Pr(&amp;gt;|t|)
(Intercept) 0.00299 0.02223 0.134 0.893
release_0 0.97412 0.01692 57.567 &amp;lt;2e-16 ***
---
Signif. codes: 0 &amp;#39;***&amp;#39; 0.001 &amp;#39;**&amp;#39; 0.01 &amp;#39;*&amp;#39; 0.05 &amp;#39;.&amp;#39; 0.1 &amp;#39; &amp;#39; 1
Residual standard error: 0.2518 on 166 degrees of freedom
(10 observations deleted due to missingness)
Multiple R-squared: 0.9523, Adjusted R-squared: 0.952
F-statistic: 3314 on 1 and 166 DF, p-value: &amp;lt; 2.2e-16
Test summary:
Linear hypothesis test:
(Intercept) = 0
release_0 = 1
Model 1: restricted model
Model 2: final ~ release_0
Note: Coefficient covariance matrix supplied.
Res.Df Df F Pr(&amp;gt;F)
1 168
2 166 2 1.9283 0.1486
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That is exactly the kind of result that is hard to see from a revision triangle alone but straightforward to formalize once the workflow is standardized.
In this sample, the result points to the first release as already being statistically close to the later benchmark, which suggests subsequent revisions add relatively little systematic information.&lt;/p&gt;
&lt;h2&gt;
From descriptive analysis to revision nowcasting
&lt;/h2&gt;&lt;p&gt;For many users, revision summaries will be the main use case.
But &lt;code&gt;reviser&lt;/code&gt; also includes model-based tools for users who want to treat revisions as an explicit latent-data problem.
That matters if you need to make decisions on preliminary data but also want a structured way to estimate how those figures are likely to change later.&lt;/p&gt;
&lt;p&gt;Two vignettes walk through nowcasting revisions with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the generalized Kishor-Koenig family via &lt;code&gt;kk_nowcast()&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;the Jacobs-Van Norden model via &lt;code&gt;jvn_nowcast()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both approaches cast the revision problem into state-space form, which makes it possible to estimate the dynamics of news and noise in successive data releases.
For technical users, this is the part of the package that turns revision analysis from retrospective diagnosis into a forecasting problem.&lt;/p&gt;
&lt;p&gt;Here is a compact &lt;code&gt;kk_nowcast()&lt;/code&gt; example following the Kishor-Koenig workflow from the &lt;a href="https://docs.ropensci.org/reviser/articles/nowcasting-revisions-kk.html"&gt;vignette&lt;/a&gt; for the Euro Area (EA).&lt;br&gt;
The key idea is to first identify an efficient release &lt;code&gt;e&lt;/code&gt;, then estimate the revision system on the corresponding panel of releases.
In this euro area example, the efficient-release step selects &lt;code&gt;e = 2&lt;/code&gt;, so the model treats the third published release as the earliest one that is already close to the later benchmark.
That is a useful substantive result on its own: it suggests that most of the economically relevant signal arrives within the first few releases, while later revisions are smaller adjustments around that path.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gdp_ea&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;reviser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;gdp&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tsbox&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;ts_pc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dplyr&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;EA&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pub_date&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nf"&gt;as.Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;2020-01-01&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;releases&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;get_nth_release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gdp_ea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;final_release&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;get_nth_release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gdp_ea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;efficient_release&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;get_first_efficient_release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;releases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;final_release&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fit_kk&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;kk_nowcast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;efficient_release&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;efficient_release&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;KK&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;MLE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fit_kk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;
=== Kishor-Koenig Model ===
Convergence: Success
Log-likelihood: 125.7
AIC: -231.41
BIC: -198.23
Parameter Estimates:
Parameter Estimate Std.Error
F0 0.633 0.131
G0_0 0.950 0.031
G0_1 -0.037 0.152
G0_2 -0.181 0.220
G1_0 -0.009 0.011
G1_1 0.594 0.061
G1_2 0.194 0.092
v0 0.380 0.068
eps0 0.008 0.001
eps1 0.001 0.000
&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fit_kk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src="https://ropensci.org/blog/2026/04/13/reviser/kk-nowcast-example-1.svg"
alt="Diagnostic plot from a Kishor-Koenig nowcast model for euro area GDP revisions, summarizing the fitted revision dynamics." width="100%"&gt;&lt;figcaption&gt;
&lt;p&gt;Diagnostic plot from the Kishor-Koenig nowcast example.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The fitted object contains estimated parameters, filtered and smoothed latent states, and plotting methods for the implied efficient-release path.
That gives you a direct route from descriptive revision analysis to a state-space nowcast of future revisions.
For a broader audience, the main takeaway is not the individual coefficients.
It is that the model converges cleanly on this sample, summarizes the revision process in a compact latent-state form, and provides a practical way to judge whether a new release is likely to be revised materially later on.
Substantively, the model separates persistent signal from transitory revision noise, so the output is useful when you want to judge whether new releases are likely to be revised materially.&lt;/p&gt;
&lt;h2&gt;
What reviser adds
&lt;/h2&gt;&lt;p&gt;What stands out in &lt;code&gt;reviser&lt;/code&gt; is not a single function, but the coherence of the workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the package has explicit conventions for vintage data;&lt;/li&gt;
&lt;li&gt;descriptive revision analysis and formal testing sit in the same API;&lt;/li&gt;
&lt;li&gt;efficient-release analysis connects directly to applied questions about which release to trust;&lt;/li&gt;
&lt;li&gt;nowcasting tools extend the same workflow rather than forcing a separate modeling stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you work with real-time macroeconomic data, that combination is useful because revision analysis is usually fragmented across custom scripts, one-off spreadsheets, and package combinations that do not share a common data structure.&lt;/p&gt;
&lt;h2&gt;
Try it and push it further
&lt;/h2&gt;&lt;p&gt;You can install the package from the rOpenSci R-universe:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;install.packages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;reviser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://ropensci.r-universe.dev&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://cloud.r-project.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then start with the package site and vignettes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docs: &lt;a href="https://docs.ropensci.org/reviser"&gt;https://docs.ropensci.org/reviser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;source: &lt;a href="https://github.com/ropensci/reviser"&gt;https://github.com/ropensci/reviser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We would be happy to hear feedback from those of you trying out the package with different datasets.
If you have a real-time dataset with a different release structure, that would be a good stress test for the package.
If you find gaps in the workflow or have a use case to share, open an issue or contribute an example.
Revision analysis gets more useful as it becomes easier to compare workflows across datasets rather than rebuilding them from scratch each time.&lt;/p&gt;</description></item><item><title>Collaborating between Bioconductor and R-universe on Development of Common Infrastructure</title><link>https://ropensci.org/blog/2026/04/08/r-universe-bioc/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><author>rOpenSci</author><guid>https://ropensci.org/blog/2026/04/08/r-universe-bioc/</guid><description>
&lt;p&gt;For more than two decades, the &lt;a href="https://www.bioconductor.org/"&gt;Bioconductor project&lt;/a&gt; has been a cornerstone of the R ecosystem, providing high-quality, peer-reviewed tools for bioinformatics and computational biology. Its curated repository model, rigorous review standards, and tightly coordinated release process have helped establish Bioconductor as one of the most trusted distribution channels in scientific computing.&lt;/p&gt;
&lt;p&gt;However, the infrastructure that supports such a long-standing and large-scale project inevitably accumulates technical debt. Legacy build systems, bespoke tooling, and historically grown workflows add up to costly and unsustainable maintenance work. For this reason, Bioconductor is collaborating with &lt;a href="https://r-universe.dev/"&gt;R-universe&lt;/a&gt; to gradually modernize parts of its infrastructure, while accommodating the project’s scale, governance, and established processes. In turn, Bioconductor is helping R-universe expand and refine its features as we learn to serve the complex needs of the Bioconductor community.&lt;/p&gt;
&lt;p&gt;This collaboration reflects a core principle of R-universe as an R Consortium &lt;a href="https://r-consortium.org/all-projects/"&gt;Infrastructure Steering Committee (ISC)&lt;/a&gt; top-level project: supporting reviewed package repositories such as rOpenSci and Bioconductor, and providing modern, open, and reusable infrastructure that strengthens the broader R ecosystem.&lt;/p&gt;
&lt;h2&gt;
A shared mission: Tooling for managed repositories
&lt;/h2&gt;&lt;p&gt;R-universe was designed as a next-generation package distribution and build system for R. It provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continuous building and checking of R packages across platforms&lt;/li&gt;
&lt;li&gt;Binary packages for Windows, macOS, Linux, and WebAssembly&lt;/li&gt;
&lt;li&gt;Transparent and reproducible build environments managed via GitHub actions&lt;/li&gt;
&lt;li&gt;Dashboards and metadata APIs for monitoring ecosystem health and activity&lt;/li&gt;
&lt;li&gt;CRAN-like package repositories with discoverable metrics and documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From the outset, a key objective has been to support curated and reviewed communities — such as rOpenSci and Bioconductor — by offering modern infrastructure without requiring them to redesign their governance model or review processes.&lt;/p&gt;
&lt;p&gt;For Bioconductor, this means incrementally introducing piece-wise functionality, with consideration for established release cycles and quality control mechanisms:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Setting up independent build and dashboard tooling, replicating processes from the current Bioconductor build systems on R-universe infrastructure&lt;/li&gt;
&lt;li&gt;Mirroring Windows and macOS binaries produced on R-universe to Bioconductor&lt;/li&gt;
&lt;li&gt;Exploring further integration of results and metadata produced by R-universe for Bioconductor health/activity monitoring and aiding the curation processes&lt;/li&gt;
&lt;li&gt;Potential future steps toward deeper automation and harmonization&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By taking small gradual steps towards adopting R-universe components, everyone gets the opportunity to experiment with new tooling and evaluate where adjustments may be needed in order to minimize disruption to existing practices.&lt;/p&gt;
&lt;p&gt;An important milestone in this venture is that Bioconductor now uses R-universe to build the Windows and macOS binaries, which significantly reduces costs and the maintenance load on the Bioconductor team. Beyond binary distribution, we are currently exploring deeper integration of R-universe’s continuous check results into Bioconductor’s quality control and release processes.&lt;/p&gt;
&lt;h2&gt;
Two Universes: Release and Development
&lt;/h2&gt;&lt;p&gt;Bioconductor maintains two distinct repositories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;release&lt;/strong&gt; branch for stable packages&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;devel&lt;/strong&gt; branch for ongoing development and the next release cycle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To mirror this structure, we currently operate two dedicated R-universe instances:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Development branch:&lt;/strong&gt; &lt;a href="https://bioc.r-universe.dev"&gt;https://bioc.r-universe.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release branch:&lt;/strong&gt; &lt;a href="https://bioc-release.r-universe.dev"&gt;https://bioc-release.r-universe.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These universes integrate directly with Bioconductor’s existing Git infrastructure and provide continuous builds for packages in both branches.&lt;/p&gt;
&lt;p&gt;Through the R-universe dashboard, package maintainers and users can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inspect cross-platform check results&lt;/li&gt;
&lt;li&gt;Review extended BiocCheck diagnostics&lt;/li&gt;
&lt;li&gt;Monitor build logs and dependency graphs&lt;/li&gt;
&lt;li&gt;Explore rich package metadata and metrics&lt;/li&gt;
&lt;li&gt;Publish binary packages for Windows, macOS, and Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This provides a familiar yet modern interface for Bioconductor contributors, aligned with what users increasingly expect from contemporary R package infrastructure.&lt;/p&gt;
&lt;p&gt;Information about each package is available on &lt;code&gt;https://bioc.r-universe.dev/{pkgname}&lt;/code&gt;. For example, &lt;a href="https://bioc.r-universe.dev/DESeq2"&gt;https://bioc.r-universe.dev/DESeq2&lt;/a&gt; provides details on the DESeq2 package as shown below:&lt;/p&gt;
&lt;div class="box" &gt;
&lt;figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"&gt;
&lt;div class="img"&gt;
&lt;img itemprop="thumbnail" src="https://docs.r-universe.dev/img/bioc-pkg.png" alt="screenshot of r-universe package"/&gt;
&lt;/div&gt;
&lt;a href="https://docs.r-universe.dev/img/bioc-pkg.png" itemprop="contentUrl" aria-disabled="true"&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;If this is your first time visiting R-universe, we recommend clicking the &amp;ldquo;Website Tour&amp;rdquo; button which will walk you through the most important information in 1 or 2 minutes.&lt;/p&gt;
&lt;h2&gt;
Technical Documentation for Bioconductor Maintainers
&lt;/h2&gt;&lt;p&gt;The R-universe project maintains comprehensive technical documentation at &lt;a href="https://docs.r-universe.dev"&gt;https://docs.r-universe.dev&lt;/a&gt;. For Bioconductor specifically, we created a dedicated section summarizing the most relevant topics for developers to get started with R-universe: &lt;a href="https://docs.r-universe.dev/bioconductor/"&gt;https://docs.r-universe.dev/bioconductor/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As the collaboration evolves and new components get introduced, the documentation will continue to be expanded. The goal is to provide Bioconductor maintainers with a clear reference point for understanding how R-universe fits into their development workflow, while maintaining compatibility with the established practices that have made Bioconductor a successful project within the R community.&lt;/p&gt;
&lt;h2&gt;
Looking Ahead
&lt;/h2&gt;&lt;p&gt;Adopting new infrastructure inevitably involves adjustments. For Bioconductor developers, integrating with a new build and distribution system will likely require some changes to workflows, and time to become familiar with new or different package checks, build diagnostics, and binary distribution.&lt;/p&gt;
&lt;p&gt;However, by gradually moving toward common infrastructure, the Bioconductor project will benefit from improvements that are being continuously developed and maintained for the broader R ecosystem. A system based on modern continuous integration (CI) will provide developers with improved tooling, and will give the core team more time to focus on community coordination and quality control, rather than on maintaining costly infrastructure. At the same time, the shared platform provided by R-universe can help to increase the visibility and accessibility of Bioconductor software to the greater R community.&lt;/p&gt;
&lt;p&gt;We look forward to continuing this alliance and to working with the Bioconductor community to ensure that the next generation of infrastructure supports the project for many years to come.&lt;/p&gt;</description></item><item><title>A Better R Programming Experience Thanks to Tree-sitter</title><link>https://ropensci.org/blog/2026/04/02/tree-sitter-overview/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>rOpenSci</author><guid>https://ropensci.org/blog/2026/04/02/tree-sitter-overview/</guid><description>
&lt;p&gt;A little bit less than two years ago, building on work by Jim Hester and Kevin Ushey, Davis Vaughan completed a very impactful JavaScript file for the R community: an R grammar for the Tree-sitter parsing generator. He even got a round of applause for it during a talk at the useR! 2024 conference! So, did he get cheered for&amp;hellip; grammatical rules in a &lt;a href="https://github.com/r-lib/tree-sitter-r/blob/next/grammar.js"&gt;JavaScript file&lt;/a&gt;? &amp;#x1f605;&lt;/p&gt;
&lt;p&gt;No, the audience was excited about the &lt;em&gt;improved developer experience for R&lt;/em&gt; that this file unlocked. R tooling around Tree-sitter is how you get&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reformatting through &lt;a href="https://posit-dev.github.io/air/"&gt;Air&lt;/a&gt; and linting through &lt;a href="https://jarl.etiennebacher.com/"&gt;Jarl&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;auto-completion or help on hover in the &lt;a href="https://lionel-.github.io/slidedecks/2024-07-11-ark"&gt;Positron IDE&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;better &lt;a href="https://github.com/orgs/community/discussions/120397"&gt;search&lt;/a&gt; for R on GitHub;&lt;/li&gt;
&lt;li&gt;and more!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll explain what Tree-sitter is, and how tools built on Tree-sitter can benefit your R development workflow.&lt;/p&gt;
&lt;h2&gt;
Code parsing: what is Tree-sitter?
&lt;/h2&gt;&lt;p&gt;&lt;a href="https://tree-sitter.github.io/tree-sitter/"&gt;Tree-sitter&lt;/a&gt; is a code parsing generator written in C, with bindings existing in several languages including Rust (and R!).&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s rewind a little bit. What does it mean to parse code?&lt;/p&gt;
&lt;p&gt;Basically, given a string of code like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;na.rm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;How do you know that &lt;code&gt;mean&lt;/code&gt; is a function name, &lt;code&gt;na.rm&lt;/code&gt; an argument name, &lt;code&gt;TRUE&lt;/code&gt; a logical? You have to &lt;em&gt;parse&lt;/em&gt; that code into what&amp;rsquo;s called a parse tree. You do that in your head when reading R code. &amp;#x1f638;&lt;/p&gt;
&lt;p&gt;R itself can obviously parse R code, thanks to its &lt;a href="https://github.com/wch/r-source/blob/trunk/src/main/gram.y"&gt;grammar&lt;/a&gt;. See for instance the &lt;a href="https://github.com/wch/r-source/commit/a1425adea54bcc98eef86081522b5dbb3e149cdc#diff-ba804d7fa3fa053c1f57d46369f4432cb55c9c4f69f46ae6510d0d1fcc59f382"&gt;commit that introduced R&amp;rsquo;s native pipe&lt;/a&gt;, which necessitated extending R&amp;rsquo;s syntax thus modifying its grammar.&lt;/p&gt;
&lt;p&gt;You can use &lt;a href="https://rdrr.io/r/base/parse.html"&gt;&lt;code&gt;parse()&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://rdrr.io/r/utils/getParseData.html"&gt;&lt;code&gt;getParseData()&lt;/code&gt;&lt;/a&gt; to parse R code.&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre class='chroma'&gt;&lt;code class='language-r' data-lang='r'&gt;&lt;span&gt;&lt;span class='nf'&gt;&lt;a href='https://rdrr.io/r/base/parse.html'&gt;parse&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt; text &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;"a &amp;lt;- mean(x, na.rm = TRUE)"&lt;/span&gt;,&lt;/span&gt;
&lt;span&gt; keep.source &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kc'&gt;TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;|&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt; &lt;span class='nf'&gt;&lt;a href='https://rdrr.io/r/utils/getParseData.html'&gt;getParseData&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; line1 col1 line2 col2 id parent token terminal text&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 23 1 1 1 26 23 0 expr FALSE &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 1 1 1 1 1 1 3 SYMBOL TRUE a&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 3 1 1 1 1 3 23 expr FALSE &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 2 1 3 1 4 2 23 LEFT_ASSIGN TRUE &amp;lt;-&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 21 1 6 1 26 21 23 expr FALSE &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 4 1 6 1 9 4 6 SYMBOL_FUNCTION_CALL TRUE mean&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 6 1 6 1 9 6 21 expr FALSE &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 5 1 10 1 10 5 21 '(' TRUE (&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 7 1 11 1 11 7 9 SYMBOL TRUE x&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 9 1 11 1 11 9 21 expr FALSE &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 8 1 12 1 12 8 21 ',' TRUE ,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 13 1 14 1 18 13 21 SYMBOL_SUB TRUE na.rm&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 14 1 20 1 20 14 21 EQ_SUB TRUE =&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 15 1 22 1 25 15 16 NUM_CONST TRUE TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 16 1 22 1 25 16 21 expr FALSE &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; 17 1 26 1 26 17 21 ')' TRUE )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Or you could transform that same data into XML using Gábor Csárdi&amp;rsquo;s &lt;a href="https://r-lib.github.io/xmlparsedata/"&gt;{xmlparsedata}&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre class='chroma'&gt;&lt;code class='language-r' data-lang='r'&gt;&lt;span&gt;&lt;span class='nf'&gt;&lt;a href='https://rdrr.io/r/base/parse.html'&gt;parse&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt; text &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s'&gt;"a &amp;lt;- mean(x, na.rm = TRUE)"&lt;/span&gt;,&lt;/span&gt;
&lt;span&gt; keep.source &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kc'&gt;TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;|&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt; &lt;span class='nf'&gt;xmlparsedata&lt;/span&gt;&lt;span class='nf'&gt;::&lt;/span&gt;&lt;span class='nf'&gt;&lt;a href='https://rdrr.io/pkg/xmlparsedata/man/xml_parse_data.html'&gt;xml_parse_data&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;pretty &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kc'&gt;TRUE&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;|&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt; &lt;span class='nf'&gt;xml2&lt;/span&gt;&lt;span class='nf'&gt;::&lt;/span&gt;&lt;span class='nf'&gt;&lt;a href='http://xml2.r-lib.org/reference/read_xml.html'&gt;read_xml&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;|&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt; &lt;span class='nf'&gt;&lt;a href='https://rdrr.io/r/base/character.html'&gt;as.character&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;|&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt; &lt;span class='nf'&gt;&lt;a href='https://rdrr.io/r/base/cat.html'&gt;cat&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;exprlist&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;expr line1="1" col1="1" line2="1" col2="26" start="28" end="53"&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;expr line1="1" col1="1" line2="1" col2="1" start="28" end="28"&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;SYMBOL line1="1" col1="1" line2="1" col2="1" start="28" end="28"&amp;gt;a&amp;lt;/SYMBOL&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;/expr&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;LEFT_ASSIGN line1="1" col1="3" line2="1" col2="4" start="30" end="31"&amp;gt;&amp;amp;lt;-&amp;lt;/LEFT_ASSIGN&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;expr line1="1" col1="6" line2="1" col2="26" start="33" end="53"&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;expr line1="1" col1="6" line2="1" col2="9" start="33" end="36"&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;SYMBOL_FUNCTION_CALL line1="1" col1="6" line2="1" col2="9" start="33" end="36"&amp;gt;mean&amp;lt;/SYMBOL_FUNCTION_CALL&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;/expr&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;OP-LEFT-PAREN line1="1" col1="10" line2="1" col2="10" start="37" end="37"&amp;gt;(&amp;lt;/OP-LEFT-PAREN&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;expr line1="1" col1="11" line2="1" col2="11" start="38" end="38"&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;SYMBOL line1="1" col1="11" line2="1" col2="11" start="38" end="38"&amp;gt;x&amp;lt;/SYMBOL&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;/expr&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;OP-COMMA line1="1" col1="12" line2="1" col2="12" start="39" end="39"&amp;gt;,&amp;lt;/OP-COMMA&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;SYMBOL_SUB line1="1" col1="14" line2="1" col2="18" start="41" end="45"&amp;gt;na.rm&amp;lt;/SYMBOL_SUB&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;EQ_SUB line1="1" col1="20" line2="1" col2="20" start="47" end="47"&amp;gt;=&amp;lt;/EQ_SUB&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;expr line1="1" col1="22" line2="1" col2="25" start="49" end="52"&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;NUM_CONST line1="1" col1="22" line2="1" col2="25" start="49" end="52"&amp;gt;TRUE&amp;lt;/NUM_CONST&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;/expr&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;OP-RIGHT-PAREN line1="1" col1="26" line2="1" col2="26" start="53" end="53"&amp;gt;)&amp;lt;/OP-RIGHT-PAREN&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;/expr&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;/expr&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;/exprlist&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;In both cases, you recognize words such as &lt;code&gt;LEFT_ASSIGN&lt;/code&gt; or &lt;code&gt;SYMBOL_FUNCTION_CALL&lt;/code&gt;. Parsing is an essential step before the code is actually executed, but parsed code can also be used for other purposes, such as analyzing code without brittle regular expressions (does it call a particular &lt;a href="https://nrennie.rbind.io/blog/how-to-make-your-own-rstats-wrapped/"&gt;function&lt;/a&gt;?), navigating code (going from a function call to the definition of that function), or modifying code (replacing all occurrences of a function with another one).&lt;/p&gt;
&lt;p&gt;Now, Tree-sitter performs this same code parsing but &lt;strong&gt;faster&lt;/strong&gt; especially thanks to its support of incremental parsing &amp;ndash; which is key to updating the syntax tree as you are typing in your editor for instance! Tree-sitter is agnostic in that it can parse any code as long as there is a grammar for it (think, Rosetta Stone plugins). It&amp;rsquo;s been used for many languages which means many tools have been built around it.&lt;/p&gt;
&lt;p&gt;To have Tree-sitter &amp;ldquo;learn&amp;rdquo; a new language you need to give it a file containing the definition of the syntax of that language, what&amp;rsquo;s called a &lt;em&gt;grammar&lt;/em&gt;. This is where the aforementioned JavaScript file by Davis Vaughan and collaborators comes into play! The &lt;a href="https://github.com/r-lib/tree-sitter-r"&gt;treesitter-r repo&lt;/a&gt;, which provides a translation of the R grammar in the format expected by Tree-sitter, is the base of all tools presented in this post which use R code as their input.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how to use the {treesitter} R package for the same code as earlier. The {treesitter} R package allows us to use Tree-sitter from R. To parse R code with it, we need the &lt;code&gt;language()&lt;/code&gt; function from {treesitter.r}&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre class='chroma'&gt;&lt;code class='language-r' data-lang='r'&gt;&lt;span&gt;&lt;span class='kr'&gt;&lt;a href='https://rdrr.io/r/base/library.html'&gt;library&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;&lt;a href='https://github.com/DavisVaughan/r-tree-sitter'&gt;treesitter&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; Attaching package: 'treesitter'&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; The following object is masked from 'package:base':&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; range&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class='nv'&gt;language&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='nf'&gt;treesitter.r&lt;/span&gt;&lt;span class='nf'&gt;::&lt;/span&gt;&lt;span class='nf'&gt;&lt;a href='https://rdrr.io/pkg/treesitter.r/man/language.html'&gt;language&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='nv'&gt;parser&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='nf'&gt;&lt;a href='https://davisvaughan.github.io/r-tree-sitter/reference/parser.html'&gt;parser&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;language&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='nv'&gt;text&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;-&lt;/span&gt; &lt;span class='s'&gt;"a &amp;lt;- mean(x, na.rm = TRUE)"&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='nf'&gt;&lt;a href='https://davisvaughan.github.io/r-tree-sitter/reference/parser-parse.html'&gt;parser_parse&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;parser&lt;/span&gt;, &lt;span class='nv'&gt;text&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &amp;lt;tree_sitter_tree&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; ── Text ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; a &amp;lt;- mean(x, na.rm = TRUE)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; ── S-Expression ────────────────────────────────────────────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #0000BB;'&gt;(&lt;/span&gt;program &lt;span style='color: #555555;'&gt;[(0, 0), (0, 26)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #00BB00;'&gt;(&lt;/span&gt;binary_operator &lt;span style='color: #555555;'&gt;[(0, 0), (0, 26)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; lhs: &lt;span style='color: #BB0000;'&gt;(&lt;/span&gt;identifier &lt;span style='color: #555555;'&gt;[(0, 0), (0, 1)]&lt;/span&gt;&lt;span style='color: #BB0000;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; operator: "&amp;lt;-" &lt;span style='color: #555555;'&gt;[(0, 2), (0, 4)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; rhs: &lt;span style='color: #BB0000;'&gt;(&lt;/span&gt;call &lt;span style='color: #555555;'&gt;[(0, 5), (0, 26)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; function: &lt;span style='color: #00BBBB;'&gt;(&lt;/span&gt;identifier &lt;span style='color: #555555;'&gt;[(0, 5), (0, 9)]&lt;/span&gt;&lt;span style='color: #00BBBB;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; arguments: &lt;span style='color: #00BBBB;'&gt;(&lt;/span&gt;arguments &lt;span style='color: #555555;'&gt;[(0, 9), (0, 26)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; open: "(" &lt;span style='color: #555555;'&gt;[(0, 9), (0, 10)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; argument: &lt;span style='color: #BBBB00;'&gt;(&lt;/span&gt;argument &lt;span style='color: #555555;'&gt;[(0, 10), (0, 11)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; value: &lt;span style='color: #BB00BB;'&gt;(&lt;/span&gt;identifier &lt;span style='color: #555555;'&gt;[(0, 10), (0, 11)]&lt;/span&gt;&lt;span style='color: #BB00BB;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #BBBB00;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #BBBB00;'&gt;(&lt;/span&gt;comma &lt;span style='color: #555555;'&gt;[(0, 11), (0, 12)]&lt;/span&gt;&lt;span style='color: #BBBB00;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; argument: &lt;span style='color: #BBBB00;'&gt;(&lt;/span&gt;argument &lt;span style='color: #555555;'&gt;[(0, 13), (0, 25)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; name: &lt;span style='color: #BB00BB;'&gt;(&lt;/span&gt;identifier &lt;span style='color: #555555;'&gt;[(0, 13), (0, 18)]&lt;/span&gt;&lt;span style='color: #BB00BB;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; "=" &lt;span style='color: #555555;'&gt;[(0, 19), (0, 20)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; value: &lt;span style='color: #BB00BB;'&gt;(&lt;/span&gt;true &lt;span style='color: #555555;'&gt;[(0, 21), (0, 25)]&lt;/span&gt;&lt;span style='color: #BB00BB;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #BBBB00;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; close: ")" &lt;span style='color: #555555;'&gt;[(0, 25), (0, 26)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #00BBBB;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #BB0000;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #00BB00;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #0000BB;'&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Tree-sitter is the workhorse of many tools, that are mentioned in the diagram below. All of them are dependent on tree-sitter and the R grammar provided to it. Some of them are command-line interfaces (CLIs), while others are R packages.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://ropensci.org/blog/2026/04/02/tree-sitter-overview/tree-sitter.png"
alt="Diagram of Tree-sitter tooling for R. At the center is Tree-sitter especially its Rust bindings and the R grammar for treesitter. At the top is the input, R scripts. At the bottom from treesitter is the treesitter R package,; ast-grep that is used by astgrepr which is used by flir and that is used by the CLAUDE.md instructions for parsing code; Air that is used by Jarl; Ark that is used by the Positron IDE; R code browsing on GitHub."&gt;
&lt;/figure&gt;
&lt;h2&gt;
Browsing code interactively: Positron IDE, GitHub
&lt;/h2&gt;&lt;p&gt;The real reason why the audience applauded Davis Vaughan is that he explained how the R grammar for Tree-sitter had been &lt;a href="https://github.com/orgs/community/discussions/120397"&gt;deployed to GitHub&lt;/a&gt; so that we get almost as good experience browsing R code on GitHub as browsing, say, JS code. If we search for a function name in a repository for instance, its definition will be indicated in the search results. See &lt;a href="https://www.youtube.com/watch?v=Gm0ikRBAfwc"&gt;Davis&amp;rsquo; slides&lt;/a&gt; (also available in &lt;a href="https://github.com/DavisVaughan/2024-07-09_useR-2024"&gt;PDF&lt;/a&gt;), or refer to the video below showing how typing &lt;code&gt;vetiver_model&lt;/code&gt; in the search bar from the R vetiver repo makes the function definition the first result, on which one can click to land into the definition.&lt;/p&gt;
&lt;video controls preload="auto" width="100%" playsinline class="html-video"&gt;
&lt;source src="https://ropensci.org/blog/2026/04/02/tree-sitter-overview/searching-for-vetiver-model-r-new.mp4" type="video/mp4"&gt;
&lt;span&gt;&lt;/span&gt;
&lt;/video&gt;
&lt;p&gt;Also very useful is the use of Tree-sitter by &lt;a href="https://github.com/posit-dev/ark"&gt;Ark&lt;/a&gt;, the R kernel &lt;a href="https://lionel-.github.io/slidedecks/2024-07-11-ark/#/language-server-protocol-1"&gt;used in the Positron IDE&lt;/a&gt;. Ark is how you get autocompletion and help on hover in Positron. The video below shows how you can extend the selection to further steps of a pipeline in Positron.&lt;/p&gt;
&lt;video controls preload="auto" width="100%" playsinline class="html-video"&gt;
&lt;source src="https://ropensci.org/blog/2026/04/02/tree-sitter-overview/expand-selection-2.mp4" type="video/mp4"&gt;
&lt;span&gt;&lt;/span&gt;
&lt;/video&gt;
&lt;p&gt;This use case of Tree-sitter is also featured in &lt;a href="https://www.youtube.com/watch?v=Gm0ikRBAfwc"&gt;Davis&amp;rsquo; slides&lt;/a&gt;. See also Lionel Henry&amp;rsquo;s and Davis Vaughan&amp;rsquo;s talk about Ark at &lt;a href="https://youtu.be/8uRcB34Hhsw?si=UeWqIi9PtEOWqRsp&amp;amp;t=2109"&gt;posit conf 2024&lt;/a&gt;, especially the part about &lt;a href="https://youtu.be/8uRcB34Hhsw?si=GBqntC6tW7D2WhBN&amp;amp;t=2455"&gt;code assistance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Other development environments such as &lt;a href="https://lists.gnu.org/archive/html/emacs-devel/2022-11/msg01443.html"&gt;Emacs&lt;/a&gt; also have support for Tree-sitter.&lt;/p&gt;
&lt;h2&gt;
Searching/browsing code
&lt;/h2&gt;&lt;p&gt;You can parse and search R code using the {treesitter} R package and &lt;a href="https://tree-sitter.github.io/tree-sitter/4-code-navigation.html"&gt;treesitter query syntax&lt;/a&gt;. The {treesitter} R package is a dependency of the &lt;a href="https://simonpcouch.github.io/gander/"&gt;{gander} package&lt;/a&gt; by Simon Couch, that is meant to be used for a better experience with LLMs when writing R code. Another use case of the {treesitter} R package is the {igraph.r2cdocs} &lt;a href="https://roxygen2.r-lib.org/dev/articles/extending.html"&gt;extension&lt;/a&gt; to {roxygen2} for the {igraph} package, that &lt;a href="https://github.com/igraph/igraph.r2cdocs/blob/6be2a327a18deb823302caeab8b60a916f6fac62/R/roxygen.R#L119"&gt;parses all of igraph R code&lt;/a&gt; to then be able to identify, for each exported function, whether it (in)directly calls a function whose name ends with &lt;code&gt;_impl&lt;/code&gt;, indicating a wrapper to a C igraph function whose docs can be then be linked from the manual of the R function.&lt;/p&gt;
&lt;p&gt;The {pkgdepends} package calls Tree-sitter (&lt;a href="https://github.com/r-lib/pkgdepends/blob/main/src/tree-sitter.c"&gt;C&lt;/a&gt;) to detect &lt;a href="https://github.com/r-lib/pkgdepends/blob/634661a7d91b41476fd1ab653fe3087a6e40b8a9/R/scan-deps.R#L340"&gt;dependencies in files&lt;/a&gt;. Below we run it on the source of the &lt;a href="https://docs.ropensci.org/saperlipopette/"&gt;saperlipopette R package&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre class='chroma'&gt;&lt;code class='language-r' data-lang='r'&gt;&lt;span&gt;&lt;span class='nf'&gt;pkgdepends&lt;/span&gt;&lt;span class='nf'&gt;::&lt;/span&gt;&lt;span class='nf'&gt;&lt;a href='https://r-lib.github.io/pkgdepends/reference/scan_deps.html'&gt;scan_deps&lt;/a&gt;&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt; &lt;span class='s'&gt;"../../../../../CHAMPIONS/saperlipopette"&lt;/span&gt;,&lt;/span&gt;
&lt;span&gt; &lt;span class='s'&gt;"../../../../../CHAMPIONS"&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='o'&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #BBBB00;'&gt;Dependencies:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;brio &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/blame.R, R/check-editor.R, R/clean-dir.R, R/committed-to-main.R, R/committed-to-wrong-branch.R, R/conflict…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;cli &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ inst/exo_bisect-Rprofile.en.R, inst/exo_bisect-Rprofile.es.R, inst/exo_bisect-Rprofile.fr.R, inst/exo_blame-…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;devtools &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ saperlipopette.Rproj&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;fs &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/blame.R, R/check-editor.R, R/clean-dir.R, R/committed-to-main.R, R/committed-to-wrong-branch.R, R/conflict…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;gert &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ inst/exo_check_editor-Rprofile.en.R, inst/exo_check_editor-Rprofile.es.R, inst/exo_check_editor-Rprofile.fr.…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;knitr &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ README.Rmd&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;parsedate &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/utils-git.R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;purrr &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/create-all.R, R/debug.R, R/log-deleted-file.R, R/log-deleted-line.R, R/revparse.R, R/roxygen2.R, R/worktre…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;rlang &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/create-all.R, R/roxygen2.R, R/utils-fs.R, R/utils-usethis.R, R/zzz.R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;rmarkdown &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ README.Rmd, vignettes/saperlipopette.qmd&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;roxygen2 &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/roxygen2.R, saperlipopette.Rproj&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;saperlipopette&lt;/span&gt;&lt;span style='color: #555555;'&gt; @ README.Rmd, vignettes/saperlipopette.qmd&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;tibble &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/roxygen2.R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;usethis &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/blame.R, R/check-editor.R, R/clean-dir.R, R/committed-to-main.R, R/committed-to-wrong-branch.R, R/conflict…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;vctrs &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/roxygen2.R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;withr &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ R/blame.R, R/check-editor.R, R/clean-dir.R, R/committed-to-main.R, R/committed-to-wrong-branch.R, R/conflict…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #BBBB00;'&gt;Test dependencies:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;fs &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ tests/testthat/test-blame.R, tests/testthat/test-check-editor.R, tests/testthat/test-clean-dir.R, tests/test…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;gert &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ tests/testthat/test-blame.R, tests/testthat/test-clean-dir.R, tests/testthat/test-committed-to-main.R, tests…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;rlang &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ tests/testthat/test-blame.R, tests/testthat/test-check-editor.R, tests/testthat/test-clean-dir.R, tests/test…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;saperlipopette&lt;/span&gt;&lt;span style='color: #555555;'&gt; @ tests/testthat.R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;testthat &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ tests/testthat.R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span class='c'&gt;#&amp;gt; &lt;span style='color: #555555;'&gt;+ &lt;/span&gt;&lt;span style='color: #0000BB;'&gt;withr &lt;/span&gt;&lt;span style='color: #555555;'&gt; @ tests/testthat/test-blame.R, tests/testthat/test-check-editor.R, tests/testthat/test-clean-dir.R, tests/test…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://ast-grep.github.io/"&gt;ast-grep&lt;/a&gt; is a useful tool built on Tree-sitter for searching and re-writing code, with a clearer query syntax than Tree-sitter&amp;rsquo;s. Its name is reminiscent of grep, but with ast-grep we do not need to write brittle regular expressions &amp;#x1f638;. &lt;a href="https://astgrepr.etiennebacher.com/"&gt;{astgrepr}&lt;/a&gt; by Etienne Bacher is an R wrapper to the Rust bindings of ast-grep, and is used in Etienne&amp;rsquo;s &lt;a href="https://flir.etiennebacher.com/"&gt;{flir} package&lt;/a&gt; for &lt;a href="https://flir.etiennebacher.com/articles/adding_rules"&gt;refactoring&lt;/a&gt; code.&lt;/p&gt;
&lt;p&gt;The ast-grep command-line interface (CLI) itself is featured in a useful &lt;a href="https://emilhvitfeldt.com/post/ast-grep-r-claude-code/"&gt;blog post by Emil Hvitfeldt&lt;/a&gt; where he explains how to document the usage of ast-grep for Claude.&lt;/p&gt;
&lt;h2&gt;
Formatting and linting: Air, Jarl
&lt;/h2&gt;&lt;p&gt;Speaking of CLIs&amp;hellip;&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://ropensci.org/blog/2026/04/02/tree-sitter-overview/meme.png"
alt="Cute kitten attacked by robots. The text says &amp;#39;Everytime you use Claude for something a CLI can do, a kitten dies&amp;#39;."&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://posit-dev.github.io/air/cli.html"&gt;Air&lt;/a&gt;, by Davis Vaughan and Lionel Henry, is a CLI built on Tree-sitter, in Rust. It &lt;em&gt;reformats&lt;/em&gt; code blazingly fast.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jarl.etiennebacher.com/"&gt;Jarl&lt;/a&gt;, by Etienne Bacher, is a CLI built on Air, therefore also on Tree-sitter, in Rust. It &lt;em&gt;lints&lt;/em&gt; and &lt;em&gt;fixes&lt;/em&gt; code, also blazingly fast. It can even detect &lt;a href="https://jarl.etiennebacher.com/rules/unreachable_code"&gt;unreachable code&lt;/a&gt;, &lt;a href="https://jarl.etiennebacher.com/rules/unused_function"&gt;unused functions&lt;/a&gt; and &lt;a href="https://jarl.etiennebacher.com/rules/duplicated_function_definition"&gt;duplicated function definitions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In both of these examples, the creation of &lt;em&gt;CLIs&lt;/em&gt; wrapping Rust bindings was more efficient than the creation of R packages wrapping the {treesitter} R package, for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rust CLIs can edit code very fast&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;;&lt;/li&gt;
&lt;li&gt;CLIs are integrated in extensions for popular IDEs (for instance Positron);&lt;/li&gt;
&lt;li&gt;a CLI is easier to install on CI than an R package that needs, well, an R installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
More tools
&lt;/h2&gt;&lt;p&gt;A brief mention of some other interesting tools we&amp;rsquo;ve explored a bit less.&lt;/p&gt;
&lt;h3&gt;
Configuring: {ts} for parsing JSON and TOML (not R!)
&lt;/h3&gt;&lt;p&gt;The &lt;a href="https://github.com/r-lib/ts"&gt;{ts}&lt;/a&gt; package by Gábor Csárdi is the backbone of two R packages used for editing and manipulating:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TOML &lt;a href="https://gaborcsardi.github.io/tstoml/"&gt;{tstoml}&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;JSON &lt;a href="https://gaborcsardi.github.io/tsjsonc/"&gt;{tsjson}&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compared to existing parsers in R for those formats, these two packages preserve comments.&lt;/p&gt;
&lt;h3&gt;
Testing code: {muttest}
&lt;/h3&gt;&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Mutation_testing"&gt;Mutation testing&lt;/a&gt; is a kind of testing where you, say, randomly swap &lt;code&gt;+&lt;/code&gt; with &lt;code&gt;-&lt;/code&gt; in your code (you &lt;em&gt;mutate&lt;/em&gt; it) and you run your tests to see whether they catch the mutant. The &lt;a href="https://github.com/jakubsob/muttest"&gt;{muttest} package&lt;/a&gt; by Jakub Sobolewski is an R package for mutation testing, that depends on the {treesitter} R package.&lt;/p&gt;
&lt;h3&gt;
Diffing code: difftastic
&lt;/h3&gt;&lt;p&gt;The difftastic CLI by Wilfred Hughes is &amp;ldquo;a structural diff tool that understands syntax&amp;rdquo;. ✨ This means that difftastic doesn&amp;rsquo;t only compare line or &amp;ldquo;words&amp;rdquo; but actual syntax by looking at lines around the lines that changed (by default, 3). Even better, it understands R out of the box. See this &lt;a href="https://masalmon.eu/2026/03/30/difftastic/"&gt;blog post with examples of R code diffing&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
Conclusion: more to come?
&lt;/h2&gt;&lt;p&gt;In this post, we&amp;rsquo;ve presented an overview of Tree-sitter based tooling for R or in R.&lt;/p&gt;
&lt;p&gt;Note that this ecosystem of tools is very actively developed, so some tools might come and go. However, the idea that plugging the R grammar into a general parsing generator brings cool features to us R developers, will remain true. Maybe &lt;em&gt;you&lt;/em&gt; will contribute to this ecosystem, either through an existing tool or by creating a new one?&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;We could also parse C code with it using &lt;a href="https://sounkou-bioinfo.github.io/treesitter.c/"&gt;{treesitter.c}&lt;/a&gt;.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Rust is a lower level language than R so has less overhead; furthermore this kind of Rust code can be easily parallelized.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>rOpenSci News Digest, March 2026</title><link>https://ropensci.org/blog/2026/03/30/news-mars-2026/</link><pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate><author>rOpenSci</author><guid>https://ropensci.org/blog/2026/03/30/news-mars-2026/</guid><description>
&lt;!-- Before sending DELETE THE INDEX_CACHE and re-knit! --&gt;
&lt;p&gt;Dear rOpenSci friends, it&amp;rsquo;s time for our monthly news roundup! &lt;!-- blabla --&gt; You can read this post &lt;a href="https://ropensci.org/blog/2026/03/30/news-mars-2026"&gt;on our blog&lt;/a&gt;. Now let&amp;rsquo;s dive into the activity at and around rOpenSci!&lt;/p&gt;
&lt;h2&gt;
rOpenSci HQ
&lt;/h2&gt;&lt;h3&gt;
rOpenSci Dev Guide 1.0.0: Trilingual and Improved
&lt;/h3&gt;&lt;p&gt;rOpenSci Software Peer Review&amp;rsquo;s guidance is gathered in an online book that keeps improving! It is now available in &lt;a href="https://devguide.ropensci.org/"&gt;English&lt;/a&gt;, &lt;a href="https://devguide.ropensci.org/es/index.es.html"&gt;Spanish&lt;/a&gt; and &lt;a href="https://devguide.ropensci.org/pt/index.pt.html"&gt;Portuguese&lt;/a&gt;. Read more in the &lt;a href="https://ropensci.org/blog/2026/03/02/devguide-1.0.0/"&gt;release announcement&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
Champions Program Update
&lt;/h3&gt;&lt;p&gt;We are still going through the Champions selection process, and we&amp;rsquo;re excited to share that the new group of mentors has already been selected and is now actively reviewing Champions applications.&lt;/p&gt;
&lt;p&gt;This cohort brings together a wonderful mix of returning Champions stepping into mentorship roles, mentors continuing their contributions, and new members joining the program. The 2026 mentors are Andrea Gómez Vargas, Pablo Paccioretti, Alber Hamersson Sánchez Ipia, Erick Isaac Navarro Delgado, Francisco Cardozo, Luis Verde Arregoitia, Monika Ávila Márquez, Guadalupe Pascal, Pao Corrales, and Elio Campitelli. Together, they represent a diverse and vibrant community across Colombia, Mexico, Argentina, Brazil, and Bolivia, with some currently based in Switzerland, Canada, the United States, and Australia. We&amp;rsquo;re very happy to see this growing, interconnected network supporting the next cohort of Champions.&lt;/p&gt;
&lt;h3&gt;
R-Universe update
&lt;/h3&gt;&lt;p&gt;You can now download artifacts and log files from R-Universe without being logged in with a GitHub account, for example &lt;a href="https://ropensci.r-universe.dev/opencv#checktable"&gt;https://ropensci.r-universe.dev/opencv#checktable&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
Software review and usage of AI tools
&lt;/h3&gt;&lt;p&gt;Authors submitting new software for &lt;a href="https://ropensci.org/software-review/"&gt;peer review&lt;/a&gt; are now required to explain potential usage of generative AI tools in their package development. All submission templates now include a mandatory check-box:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- [ ] Generative AI tools were used to produce some of the material in this submission.
If so, please describe usage, and include links to any relevant aspects of your repository.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the start of our updates to accommodate generative AI tools in package development, as described in our &lt;a href="https://ropensci.org/blog/2026/02/26/ropensci-ai-policy/"&gt;recent blog post&lt;/a&gt;. The next phase will involve updates to our &lt;a href="https://devguide.ropensci.org"&gt;&lt;em&gt;Dev Guide&lt;/em&gt;&lt;/a&gt;, explaining requirements and recommendations for authors, reviewers, and editors. All updates are intended to permit generative AI tools to be used in any useful way, while minimising the burden on those who volunteer their own time to keep our software peer review service running.&lt;/p&gt;
&lt;h3&gt;
Software review bot updates
&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;ropensci-review-bot&lt;/code&gt; now delivers an initial report to all new software pre-submissions and submissions, identifying the five most similar packages from both all rOpenSci packages, and all CRAN packages. The matches are generated by our &lt;a href="https://docs.ropensci.org/pkgmatch"&gt;ropensci-review-tools/pkgmatch package&lt;/a&gt; (itself reviewed in &lt;a href="https://github.com/ropensci/software-review/issues/671"&gt;this review issue&lt;/a&gt;). Matching is based on an &lt;a href="https://en.wikipedia.org/wiki/Tf%E2%80%93idf"&gt;&amp;ldquo;term frequency-inverse document frequency&amp;rdquo; algorithm&lt;/a&gt;, using inverse document frequencies from all rOpenSci and CRAN packages. Similar package reports can also be manually triggered (by editors only) with &lt;code&gt;@ropensci-review-bot similar packages&lt;/code&gt;, like in &lt;a href="https://github.com/ropensci/software-review/issues/671#issuecomment-4117805740"&gt;this example for the pkgmatch package itself&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
Coworking
&lt;/h3&gt;&lt;p&gt;Read &lt;a href="https://ropensci.org/blog/2023/06/21/coworking/"&gt;all about coworking&lt;/a&gt;!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tuesday April 7th 2026, 9:00 Americas Pacific (16:00 UTC) &lt;a href="https://ropensci.org/events/coworking-2026-04/"&gt;&amp;ldquo;Getting to know the CSID Network&amp;rdquo;&lt;/a&gt; with &lt;a href="https://ropensci.org/author/steffi-lazerte/"&gt;Steffi LaZerte&lt;/a&gt; and cohosts &lt;a href="https://ropensci.org/author/irene-ramos/"&gt;Irene Ramos&lt;/a&gt; and &lt;a href="https://ropensci.org/author/adamu-saleh-saidu"&gt;Adamu Saleh Saidu&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Learn more about the &lt;a href="https://csidnet.org/"&gt;CSID Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Meet cohosts, Irene Ramos and Adamu Saleh Saidu, and learn more about the CSID Network and how you might get involved.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tuesday May 5th 2026, 9:00 Australia Western (01:00 UTC) &lt;a href="https://ropensci.org/events/coworking-2026-05/"&gt;&amp;ldquo;Code Review with rOpenSci&amp;rdquo;&lt;/a&gt; with &lt;a href="https://ropensci.org/author/steffi-lazerte/"&gt;Steffi LaZerte&lt;/a&gt; and cohost &lt;a href="https://ropensci.org/author/liz-hare/"&gt;Liz Hare&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Explore resources for Code Review&lt;/li&gt;
&lt;li&gt;Sign up to volunteer to do &lt;a href="https://airtable.com/app8dssb6a7PG6Vwj/shrnfDI2S9uuyxtDw"&gt;software peer-review&lt;/a&gt; at rOpenSci&lt;/li&gt;
&lt;li&gt;Meet cohost, Liz Hare, and discuss resources for Code Review with rOpenSci.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And remember, you can always cowork independently on work related to R, work on packages that tend to be neglected, or work on what ever you need to get done!&lt;/p&gt;
&lt;h2&gt;
Software &amp;#x1f4e6;
&lt;/h2&gt;&lt;h3&gt;
New packages
&lt;/h3&gt;&lt;p&gt;The following package recently became a part of our software suite:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.ropensci.org/suwo"&gt;suwo&lt;/a&gt;, developed by Marcelo Araya-Salas together with Jorge Elizondo-Calvo and Alejandro Rico-Guevara: Streamline searching/downloading of nature media files (e.g. audios, photos) from online repositories. The package offers functions for obtaining media metadata from online repositories, downloading associated media files and updating data sets with new records. It has been &lt;a href="https://github.com/ropensci/software-review/issues/729"&gt;reviewed&lt;/a&gt; by Eric R. Scott and Hugo Gruson.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Discover &lt;a href="https://ropensci.org/packages"&gt;more packages&lt;/a&gt;, read more about &lt;a href="https://ropensci.org/software-review"&gt;Software Peer Review&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
New versions
&lt;/h3&gt;&lt;p&gt;The following eleven packages have had an update since the last newsletter: &lt;a href="https://docs.ropensci.org/cffr" title="Generate Citation File Format (cff) Metadata for R Packages"&gt;cffr&lt;/a&gt; (&lt;a href="https://github.com/ropensci/cffr/releases/tag/v1.3.0"&gt;&lt;code&gt;v1.3.0&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/pkgmatch" title="Find R Packages Matching Either Descriptions or Other R Packages"&gt;pkgmatch&lt;/a&gt; (&lt;a href="https://github.com/ropensci-review-tools/pkgmatch/releases/tag/v0.5.2"&gt;&lt;code&gt;v0.5.2&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/tarchetypes" title="Archetypes for Targets"&gt;tarchetypes&lt;/a&gt; (&lt;a href="https://github.com/ropensci/tarchetypes/releases/tag/0.14.1"&gt;&lt;code&gt;0.14.1&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/rgbif" title="Interface to the Global Biodiversity Information Facility API"&gt;rgbif&lt;/a&gt; (&lt;a href="https://github.com/ropensci/rgbif/releases/tag/v3.8.5"&gt;&lt;code&gt;v3.8.5&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/saperlipopette" title="Create Example Git Messes"&gt;saperlipopette&lt;/a&gt; (&lt;a href="https://github.com/ropensci-training/saperlipopette/releases/tag/v0.1.1"&gt;&lt;code&gt;v0.1.1&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/gutenbergr" title="Download and Process Public Domain Works from Project Gutenberg"&gt;gutenbergr&lt;/a&gt; (&lt;a href="https://github.com/ropensci/gutenbergr/releases/tag/v0.5.0"&gt;&lt;code&gt;v0.5.0&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/trud" title="Query the NHS TRUD API"&gt;trud&lt;/a&gt; (&lt;a href="https://github.com/ropensci/trud/releases/tag/v0.2.1"&gt;&lt;code&gt;v0.2.1&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/naijR" title="Operations to Ease Data Analyses Specific to Nigeria"&gt;naijR&lt;/a&gt; (&lt;a href="https://github.com/ropensci/naijR/releases/tag/v0.7.0"&gt;&lt;code&gt;v0.7.0&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/sasquatch" title="Use SAS, R, and quarto Together"&gt;sasquatch&lt;/a&gt; (&lt;a href="https://github.com/ropensci/sasquatch/releases/tag/v0.1.3"&gt;&lt;code&gt;v0.1.3&lt;/code&gt;&lt;/a&gt;), &lt;a href="https://docs.ropensci.org/lingtypology" title="Linguistic Typology and Mapping"&gt;lingtypology&lt;/a&gt; (&lt;a href="https://github.com/ropensci/lingtypology/releases/tag/v1.1.25"&gt;&lt;code&gt;v1.1.25&lt;/code&gt;&lt;/a&gt;), and &lt;a href="https://docs.ropensci.org/rerddap" title="General Purpose Client for ERDDAP™ Servers"&gt;rerddap&lt;/a&gt; (&lt;a href="https://github.com/ropensci/rerddap/releases/tag/v1.2.3"&gt;&lt;code&gt;v1.2.3&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Post on dfms release: &lt;a href="https://sebkrantz.github.io/Rblog/2026/01/29/releasing-dfms-1-0-fast-and-feature-rich-estimation-of-dynamic-factor-models-in-r/"&gt;Releasing dfms 1.0: Fast and Feature-Rich Estimation of Dynamic Factor Models in R&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
Software Peer Review
&lt;/h2&gt;&lt;p&gt;There are fifteen recently closed and active submissions and 5 submissions on hold. Issues are at different stages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One at &lt;a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%226/approved%22"&gt;&amp;lsquo;6/approved&amp;rsquo;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ropensci/software-review/issues/729"&gt;suwo&lt;/a&gt;, Access Nature Media Repositories Through R. Submitted by &lt;a href="https://marce10.github.io/"&gt;Marcelo Araya-Salas&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One at &lt;a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%225/awaiting-reviewer(s)-response%22"&gt;&amp;lsquo;5/awaiting-reviewer(s)-response&amp;rsquo;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ropensci/software-review/issues/671"&gt;pkgmatch&lt;/a&gt;, Find R Packages Matching Either Descriptions or Other R Packages. Submitted by &lt;a href="https://mpadge.github.io"&gt;mark padgham&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Two at &lt;a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%224/review(s)-in-awaiting-changes%22"&gt;&amp;lsquo;4/review(s)-in-awaiting-changes&amp;rsquo;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/741"&gt;logolink&lt;/a&gt;, An Interface for Running NetLogo Simulations. Submitted by &lt;a href="http://danielvartan.com"&gt;Daniel Vartanian&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/615"&gt;galamm&lt;/a&gt;, Generalized Additive Latent and Mixed Models. Submitted by &lt;a href="https://osorensen.github.io/"&gt;Øystein Sørensen&lt;/a&gt;. (Stats).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Six at &lt;a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%223/reviewer(s)-assigned%22"&gt;&amp;lsquo;3/reviewer(s)-assigned&amp;rsquo;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/760"&gt;pvEBayes&lt;/a&gt;, Empirical Bayes Methods for Pharmacovigilance. Submitted by &lt;a href="https://github.com/YihaoTancn"&gt;Yihao Tan&lt;/a&gt;. (Stats).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/754"&gt;saperlipopette&lt;/a&gt;, Create Example Git Messes. Submitted by &lt;a href="https://masalmon.eu/"&gt;Maëlle Salmon&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/730"&gt;ernest&lt;/a&gt;, A Toolkit for Nested Sampling. Submitted by &lt;a href="https://github.com/kylesnap"&gt;Kyle Dewsnap&lt;/a&gt;. (Stats).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/718"&gt;rcrisp&lt;/a&gt;, Automate the Delineation of Urban River Spaces. Submitted by &lt;a href="https://github.com/cforgaci"&gt;Claudiu Forgaci&lt;/a&gt;. (Stats).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/709"&gt;reviser&lt;/a&gt;, Tools for Studying Revision Properties in Real-Time Time Series Vintages. Submitted by &lt;a href="https://marcburri.github.io/"&gt;Marc Burri&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/704"&gt;priorsense&lt;/a&gt;, Prior Diagnostics and Sensitivity Analysis. Submitted by &lt;a href="https://github.com/n-kall"&gt;Noa Kallioinen&lt;/a&gt;. (Stats).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Two at &lt;a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%222/seeking-reviewer(s)%22"&gt;&amp;lsquo;2/seeking-reviewer(s)&amp;rsquo;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/750"&gt;nycOpenData&lt;/a&gt;, Convenient Access to NYC Open Data API Endpoints. Submitted by &lt;a href="https://github.com/martinezc1"&gt;Christian Martinez&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/743"&gt;RAMEN&lt;/a&gt;, RAMEN: Regional Association of Methylome variability with the Exposome and geNome. Submitted by &lt;a href="https://erick-navarrodelgado.netlify.app"&gt;Erick Navarro-Delgado&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Three at &lt;a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%221/editor-checks%22"&gt;&amp;lsquo;1/editor-checks&amp;rsquo;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/744"&gt;RAQSAPI&lt;/a&gt;, A Simple Interface to the US EPA Air Quality System Data Mart API. Submitted by &lt;a href="https://github.com/mccroweyclinton-EPA"&gt;mccroweyclinton-EPA&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/740"&gt;fcmconfr&lt;/a&gt;, Fuzzy Cognitive Map Analysis in R. Submitted by &lt;a href="https://github.com/bhroston"&gt;benroston&lt;/a&gt;. (Stats).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/ropensci/software-review/issues/717"&gt;coevolve&lt;/a&gt;, Fit Bayesian Generalized Dynamic Phylogenetic Models using Stan. Submitted by &lt;a href="https://scottclaessens.github.io/"&gt;Scott Claessens&lt;/a&gt;. (Stats).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find out more about &lt;a href="https://ropensci.org/software-review"&gt;Software Peer Review&lt;/a&gt; and how to get involved.&lt;/p&gt;
&lt;h2&gt;
On the blog
&lt;/h2&gt;&lt;!-- Do not forget to rebase your branch! --&gt;
&lt;h3&gt;
Software Review
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://ropensci.org/blog/2026/02/26/ropensci-ai-policy"&gt;Software Review in the Era of AI: What We Are Testing at rOpenSci&lt;/a&gt; by Mark Padgham, Noam Ross, Maëlle Salmon, Yanina Bellini Saibene, Mauro Lepore, Emily Riederer, Jouni Helske, and Francisco Rodriguez-Sanchez. rOpenSci is testing preliminary policies on the use of generative AI tools, with proposed updates to documentation and procedures for authors submitting software for review, for editors, and for reviewers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://ropensci.org/blog/2026/03/02/devguide-1.0.0"&gt;rOpenSci Dev Guide 1.0.0: Trilingual and Improved&lt;/a&gt; by Maëlle Salmon, Mark Padgham, and Noam Ross. Updates in version 1.0.0 of the online book &amp;lsquo;rOpenSci Packages: Development, Maintenance, and Peer Review&amp;rsquo;. Other languages: &lt;a href='https://ropensci.org/es/blog/2026/03/02/r_open_sci_dev_guide_1_0_0_trilingüe_y_mejorada' lang='es'&gt;rOpenSci Dev Guide 1.0.0: Trilingüe y mejorada (es)&lt;/a&gt;, &lt;a href='https://ropensci.org/pt/blog/2026/03/02/guia_de_desenvolvimento_da_r_open_sci_1_0_0_trilíngue_e_aprimorado' lang='pt'&gt;Guia de desenvolvimento da rOpenSci 1.0.0: trilíngue e aprimorado (pt)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class="center"&gt;&lt;img src="https://ropensci.org/blog/2026/03/30/news-mars-2026/cover.png"
alt="cover of rOpenSci dev guide, showing a package production line with small humans discussing, examining and promoting packages" width="400"&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ropensci.org/blog/2026/03/10/patentsview-breaking-release"&gt;Breaking Release of the patentsview R Package&lt;/a&gt; by Russ Allen and Chris Baker. Breaking Release of the patentsview R Package.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Calls for contributions
&lt;/h2&gt;&lt;h3&gt;
Calls for maintainers
&lt;/h3&gt;&lt;p&gt;If you&amp;rsquo;re interested in maintaining any of the R packages below, you might enjoy reading our blog post &lt;a href="https://ropensci.org/blog/2023/02/07/what-does-it-mean-to-maintain-a-package/"&gt;What Does It Mean to Maintain a Package?&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.ropensci.org/NLMR"&gt;NLMR&lt;/a&gt;, R package to simulate neutral landscape models. &lt;a href="https://github.com/ropensci/NLMR/issues/116"&gt;Issue for volunteering&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.ropensci.org/landscapetools"&gt;landscapetools&lt;/a&gt;, R package for some of the less-glamorous tasks involved in landscape analysis. &lt;a href="https://github.com/ropensci/landscapetools/issues/48"&gt;Issue for volunteering&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.ropensci.org/hddtools"&gt;hddtools&lt;/a&gt;, Tools to discover hydrological data, accessing catalogues and databases from various data providers. &lt;a href="https://github.com/ropensci/hddtools/issues/36"&gt;Issue for volunteering&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.ropensci.org/qualtRics/"&gt;qualtRics&lt;/a&gt;, download Qualtrics survey data. &lt;a href="https://github.com/ropensci/qualtRics/issues/383"&gt;Issue for volunteering&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Calls for contributions
&lt;/h3&gt;&lt;p&gt;Refer to our &lt;a href="https://ropensci.org/help-wanted/"&gt;help wanted page&lt;/a&gt; &amp;ndash; before opening a PR, we recommend asking in the issue whether help is still needed.&lt;/p&gt;
&lt;h2&gt;
Package development corner
&lt;/h2&gt;&lt;p&gt;Some useful tips for R package developers. &amp;#x1f440;&lt;/p&gt;
&lt;h3&gt;
A new R core member!
&lt;/h3&gt;&lt;p&gt;The R Foundation announced that &lt;a href="https://uk.linkedin.com/in/heathrturnr"&gt;Heather Turner&lt;/a&gt; has joined the &lt;a href="https://www.r-project.org/contributors.html"&gt;R Core Team&lt;/a&gt;! &amp;#x1f389;&lt;/p&gt;
&lt;h3&gt;
How to browse the R mailing lists
&lt;/h3&gt;&lt;p&gt;The &lt;a href="https://www.r-project.org/mail.html"&gt;official mailing lists of the R project&lt;/a&gt; like &lt;a href="https://blog.r-hub.io/2019/04/11/r-package-devel/"&gt;R-package-devel&lt;/a&gt; are full of important and useful information. How to browse them, given that the default website is not easy to search? You can use the &lt;a href="https://mail-archive.com/r-devel@r-project.org/"&gt;mail-archive&lt;/a&gt; website (thanks to Hugo Gruson for the reminder!) or a new project by James Balamuta: the &lt;a href="https://r-mailing-lists.thecoatlessprofessor.com/"&gt;R Mailing Lists Archive&lt;/a&gt;!&lt;/p&gt;
&lt;h3&gt;
&amp;ldquo;Claude Code: Setting up ast-grep with R support&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Thanks to Mauro Lepore for sharing this blog post by Emil Hvitfeldt: &lt;a href="https://emilhvitfeldt.com/post/ast-grep-r-claude-code/"&gt;&amp;ldquo;Claude Code: Setting up ast-grep with R support&amp;rdquo;&lt;/a&gt;. ast-grep is a tool for querying code by syntax rather than brittle regular expressions. The blog post describes how to add R support to this tool, and how to take advantage of it when using Claude.&lt;/p&gt;
&lt;h3&gt;
On muffling messages from packages
&lt;/h3&gt;&lt;p&gt;A follow-up on our post &lt;a href="https://ropensci.org/blog/2024/02/06/verbosity-control-packages/"&gt;&amp;ldquo;Please Shut Up! Verbosity Control in Packages&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;With the {cli} R package you can change the default handler for messages. See the &lt;a href="https://cli.r-lib.org/articles/semantic-cli.html#cli-messages"&gt;docs&lt;/a&gt;. It seems mostly used to muffle messages, e.g. in &lt;a href="https://github.com/etiennebacher/flir/blob/9254cd01d258d0bafcee41a44e5caa7104fed832/R/lint.R#L104"&gt;flir&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Here&amp;rsquo;s how the usethis R package &lt;a href="https://github.com/r-lib/usethis/commit/f0f3f91494a1b15c1b08ee78dc73ab7d1cf8b6a8"&gt;muffles gert message selectively&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Last words
&lt;/h2&gt;&lt;p&gt;Thanks for reading! If you want to get involved with rOpenSci, check out our &lt;a href="https://contributing.ropensci.org"&gt;Contributing Guide&lt;/a&gt; that can help direct you to the right place, whether you want to make code contributions, non-code contributions, or contribute in other ways like sharing use cases. You can also support our work through &lt;a href="https://ropensci.org/donate"&gt;donations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t subscribed to our newsletter yet, you can &lt;a href="https://ropensci.org/news/"&gt;do so via a form&lt;/a&gt;. Until it&amp;rsquo;s time for our next newsletter, you can keep in touch with us via our &lt;a href="https://ropensci.org/"&gt;website&lt;/a&gt; and &lt;a href="https://hachyderm.io/@rOpenSci"&gt;Mastodon account&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>