<?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>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><item><title>Breaking Release of the patentsview R Package</title><link>https://ropensci.org/blog/2026/03/10/patentsview-breaking-release/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><author>rOpenSci</author><guid>https://ropensci.org/blog/2026/03/10/patentsview-breaking-release/</guid><description>
&lt;p&gt;The &lt;a href="http://docs.ropensci.org/patentsview/"&gt;patentsview&lt;/a&gt; R package was created by Chris Baker to simplify interactions with the
PatentsView API as announced in Chris&amp;rsquo;
&lt;a href="https://ropensci.org/blog/2017/09/19/patentsview/"&gt;blog post&lt;/a&gt;
in 2017. The API can be queried for data from US patents granted since 1976 as well as
patent applications since 2001 (not all going on to become granted patents).&lt;br&gt;
As shown in the package&amp;rsquo;s vignettes, location data can be mapped, charts of
assignees can be created etc. using other R packages, only limited by the
developer&amp;rsquo;s imagination.&lt;/p&gt;
&lt;p&gt;Fast-forwarding to today finds us in a precarious
position as the PatentsView API team had made breaking changes and obsoleted
the original API (all calls to the original endpoints return 410 Gone).
As such we have spent some time now updating patentsview to work with these API changes.
The updated patentsview package is now on CRAN but, unfortunately, as this Tech Note was being prepared
the PatentsView API team made troubling changes.&lt;/p&gt;
&lt;p&gt;In late February they replaced their
&lt;a href="https://patentsview.org/forum"&gt;forum&lt;/a&gt; with a message saying the page was temporarily
unavailable. Further, they have also removed the link to request an API key, so it&amp;rsquo;s unclear
whether they&amp;rsquo;d honor requests for API keys using the link below. Nothing has been officially
announced but the long term viability of the API seems uncertain.&lt;/p&gt;
&lt;p&gt;&amp;#x1f374; Here you&amp;rsquo;ve come to a fork (and knife) in the road, continue reading
if you are/were using the original version of the patentsview package, and we&amp;rsquo;ll guide
you through the necessary changes. If you have an interest in US patent data but haven&amp;rsquo;t
used the patentsview package yet (and are willing to take the risk!), check out the &lt;a href="https://docs.ropensci.org/patentsview/articles/ropensci-blog-post.html"&gt;vignette&lt;/a&gt; reworked from Chris&amp;rsquo; original blog post to use the new version of the R package and API.&lt;/p&gt;
&lt;h2&gt;
New changes to the API:
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Users will need to &lt;a href="https://patentsview-support.atlassian.net/servicedesk/customer/portals"&gt;request an API key&lt;/a&gt; and set an environmental variable PATENTSVIEW_API_KEY to this value.&lt;/li&gt;
&lt;li&gt;Endpoint changes:
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;nber_subcategories&lt;/code&gt;, one of the original seven endpoints, was removed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cpc_subsections&lt;/code&gt; is now &lt;code&gt;cpc_group&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The remaining five original endpoints went from plural to singular, &lt;code&gt;patents&lt;/code&gt; is now &lt;code&gt;patent&lt;/code&gt;, for example.
Interestingly, the returned data structures are still plural for the most part.&lt;/li&gt;
&lt;li&gt;There are now 27 endpoints, and more than one may need to be called to retrieve fields that were
available from a single call to one of the original endpoints&lt;/li&gt;
&lt;li&gt;Some of the endpoints now return HATEOAS (Hypermedia as the Engine of Application State) links that can be called to retrieve additional data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Some fields are now nested and need to be fully qualified when used in a query,
for instance, &lt;code&gt;search_pv('{&amp;quot;cpc_current.cpc_group_id&amp;quot;:&amp;quot;A01B1/00&amp;quot;}')&lt;/code&gt; when using the patent endpoint.
In the fields parameter, nested fields can be fully qualified or a new API shorthand can be used,
which allows you to specify group names. When group names are used, all of the group&amp;rsquo;s nested fields will be returned.
For example, defining &lt;code&gt;fields = c(&amp;quot;assignees&amp;quot;)&lt;/code&gt; when
using the patent endpoint means that all nested assignees&amp;rsquo; fields will be returned by the API.&lt;/li&gt;
&lt;li&gt;Some field names have changed, most significantly, &lt;code&gt;patent_number&lt;/code&gt; is now &lt;code&gt;patent_id&lt;/code&gt;,
and some fields were removed entirely, for instance, &lt;code&gt;rawinventor_first_name&lt;/code&gt; and &lt;code&gt;rawinventor_last_name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The original version of the API had queryable fields and additional fields which could be
retrieved but couldn&amp;rsquo;t be part of a conditional query. That notion does not apply to the
new version of the API as all fields are now queryable. You may be able
to simplify your code if you found yourself doing post processing on returned data
because a field you were interested in was not queryable.&lt;/li&gt;
&lt;li&gt;Now there isn&amp;rsquo;t supposed to be a difference between
operators used on strings vs full text fields, as there was in the original
version of the API. See the tip below the &lt;a href="https://search.patentsview.org/docs/docs/Search%20API/SearchAPIReference/#syntax"&gt;Syntax section&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Result set paging has changed significantly. This only matter to users implementing their own
paging, as the package continues to handle result set paging with &lt;code&gt;search_pv()&lt;/code&gt;&amp;rsquo;s &lt;code&gt;all_pages = TRUE&lt;/code&gt;.
There is a new &lt;a href="https://docs.ropensci.org/patentsview/articles/result-set-paging.html"&gt;Result set paging&lt;/a&gt; vignette to explain the API&amp;rsquo;s paging,
using the &lt;code&gt;size&lt;/code&gt; and &lt;code&gt;after&lt;/code&gt; parameters rather than &lt;code&gt;page&lt;/code&gt; and &lt;code&gt;per_page&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Result set sizes are seemingly unbounded now. The original version of the API capped result sets at
100,000 rows.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The API team also &lt;a href="https://search.patentsview.org/docs/#naming-update"&gt;renamed the API&lt;/a&gt;,
PatentsView&amp;rsquo;s Search API is now the PatentSearch API.
Note that the R package will retain its name, continue to use &lt;code&gt;library(patentsview)&lt;/code&gt; to load the package.&lt;/p&gt;
&lt;h2&gt;
New changes to the R package:
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Throttling is now enforced by the API and handled by the R package (sleep as specified by the throttle response before a retry)&lt;/li&gt;
&lt;li&gt;There are five new vignettes
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.ropensci.org/patentsview/articles/api-changes.html"&gt;API Changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.ropensci.org/patentsview/articles/converting-an-existing-script.html"&gt;Converting an existing script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.ropensci.org/patentsview/articles/result-set-paging.html"&gt;Result set paging&lt;/a&gt;, should custom paging be needed&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.ropensci.org/patentsview/articles/understanding-the-api.html"&gt;Understanding the API&lt;/a&gt;, the API team&amp;rsquo;s jupyter notebook converted to R and enhanced&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ropensci.org/blog/2017/09/19/patentsview/"&gt;Accessing patent data with the patentsview package&lt;/a&gt;, the blog post that announced the original version of the R package has been updated to work with the new version of the API&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The R package changed internally from using httr to httr2. This only affects users if
they passed additional arguments (&lt;code&gt;...&lt;/code&gt;) to &lt;code&gt;search_pv()&lt;/code&gt;. Previously if they passed &lt;code&gt;config = httr::timeout(40)&lt;/code&gt;
they&amp;rsquo;d now pass &lt;code&gt;timeout = 40&lt;/code&gt; (name-value pairs of valid curl options, as found in &lt;code&gt;curl::curl_options()&lt;/code&gt; see &lt;a href="https://httr2.r-lib.org/reference/req_options.html"&gt;req_options&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Now that the R package is using httr2, users can make use of its &lt;code&gt;last_request()&lt;/code&gt; method to see what was sent to the API. This could be useful when trying to fix an invalid request. Also fun would be seeing the raw API response.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;httr2::last_request()
httr2::last_response()
httr2::last_response() |&amp;gt; httr2::resp_body_json()
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;
&lt;li&gt;A new function was added
&lt;code&gt;retrieve_linked_data()&lt;/code&gt; to retrieve data from a HATEOAS link the API sent back, retrying if throttled&lt;/li&gt;
&lt;li&gt;An existing function was removed. With the API changes, there is less of a need for
&lt;code&gt;cast_pv_data()&lt;/code&gt; which was previously part of the R package. The API now returns most fields as appropriate
types, boolean, numeric etc., instead of always returning strings.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
Online API documentation
&lt;/h2&gt;&lt;p&gt;The PatentsView API team has thoughtfully provided a Swagger UI page for the new version of the API at &lt;a href="https://search.patentsview.org/swagger-ui/"&gt;https://search.patentsview.org/swagger-ui/&lt;/a&gt;.
Think of it as an online version of Postman already loaded with the API&amp;rsquo;s new endpoints and returns.
The Swagger UI page documents what fields are returned by each endpoint on a successful call
(http response code 200).
You can even send in requests and see actual API responses if you enter your API key and press
an endpoint&amp;rsquo;s &amp;ldquo;Try it out&amp;rdquo; and &amp;ldquo;Execute&amp;rdquo; buttons. Even error responses can be informative, the API&amp;rsquo;s X-Status-Reason response header
usually points out what went wrong.&lt;/p&gt;
&lt;p&gt;In a similar format, the &lt;a href="https://search.patentsview.org/docs/docs/Search%20API/EndpointDictionary/"&gt;updated API documentation&lt;/a&gt;
lists what each endpoint does. Additionally, the R package&amp;rsquo;s &lt;code&gt;fieldsdf&lt;/code&gt; data frame has been updated,
now listing the new set of endpoints and fields that can be queried and/or returned. The R package&amp;rsquo;s
reference pages have also been updated.&lt;/p&gt;
&lt;h2&gt;
Final thoughts
&lt;/h2&gt;&lt;p&gt;As shown in the updated &lt;a href="https://docs.ropensci.org/patentsview/articles/top-assignees.html"&gt;Top Assignees&lt;/a&gt; vignette, there will be occasions now where multiple API calls are needed to retrieve the same data as in a single API call in the original version of the API and R package.
Additionally, the &lt;a href="https://docs.ropensci.org/patentsview/articles/ropensci-blog-post.html"&gt;reworked rOpenSci post&lt;/a&gt; explains what changes had to be made since assignee latitude
and longitude are no longer available from the patent endpoint.&lt;/p&gt;
&lt;p&gt;Issues for the R package can be raised in the &lt;a href="https://github.com/ropensci/patentsview/issues"&gt;patentsview repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As we mentioned at the start, the future of the PatentsView API is a bit uncertain. PatentsView is funded by the &lt;a href="https://www.uspto.gov/"&gt;USPTO&lt;/a&gt;, who may be looking to cut costs. However, until we know for certain, we hope patentsview serves you well. If nothing else,
it&amp;rsquo;s been a great run, starting in 2015 for the API and 2017 for the R package!&lt;/p&gt;</description></item><item><title>rOpenSci Dev Guide 1.0.0: Trilingual and Improved</title><link>https://ropensci.org/blog/2026/03/02/devguide-1.0.0/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><author>rOpenSci</author><guid>https://ropensci.org/blog/2026/03/02/devguide-1.0.0/</guid><description>
&lt;p&gt;&lt;a href='https://ropensci.org/es/blog/2026/03/02/r_open_sci_dev_guide_1_0_0_triling%C3%BCe_y_mejorada/'&gt;Read it in: Español&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href='https://ropensci.org/pt/blog/2026/03/02/guia_de_desenvolvimento_da_r_open_sci_1_0_0_tril%C3%ADngue_e_aprimorado/'&gt;Read it in: Português&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;rOpenSci Software Peer Review&amp;rsquo;s guidance is gathered in an &lt;a href="https://devguide.ropensci.org/booknews"&gt;online book&lt;/a&gt; that keeps improving!
This blog post summarises what&amp;rsquo;s new in our Dev Guide 1.0.0, with all changes listed in the &lt;a href="https://devguide.ropensci.org/booknews.html"&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
Now available in Portuguese!
&lt;/h2&gt;&lt;p&gt;Our guide is now trilingual (&lt;a href="https://devguide.ropensci.org/index.html"&gt;English&lt;/a&gt;, &lt;a href="https://devguide.ropensci.org/es/index.es.html"&gt;Spanish&lt;/a&gt;, &lt;a href="https://devguide.ropensci.org/pt/index.pt"&gt;Portuguese&lt;/a&gt;)!&lt;/p&gt;
&lt;p&gt;Find more about the awesome Portuguese translation project, initiated and powered by our Lusophone members in our &lt;a href="https://ropensci.org/blog/2025/11/25/translation-devguide-pt/"&gt;blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The translation project and ongoing multilingual maintenance uses our &lt;a href="https://docs.ropensci.org/babelquarto/"&gt;babelquarto package&lt;/a&gt; to render multilingual Quarto books and websites.
It was recently &lt;a href="https://github.com/ropensci/software-review/issues/720"&gt;peer-reviewed&lt;/a&gt; by Ella Kaye and João Granja-Correia.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re actively working on our &lt;a href="https://docs.ropensci.org/babeldown/"&gt;babeldown package&lt;/a&gt; to create and update translations using the DeepL API.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://github.com/ropensci/dev_guide/pull/940/files"&gt;dev guide&lt;/a&gt; itself, tools useful for internationalizing &lt;em&gt;packages&lt;/em&gt; are mentioned: &lt;a href="https://michaelchirico.github.io/potools/"&gt;potools&lt;/a&gt;, the experimental &lt;a href="https://eliocamp.github.io/rhelpi18n/"&gt;rhelpi18n&lt;/a&gt; package, selecting a &lt;a href="https://pkgdown.r-lib.org/articles/translations.html"&gt;language&lt;/a&gt; for a pkgdown website.&lt;/p&gt;
&lt;h2&gt;
Policy Updates
&lt;/h2&gt;&lt;p&gt;We made some changes to rOpenSci policies and scope:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;New category for &lt;a href="https://devguide.ropensci.org/softwarereview_policies#package-categories#:~:text=rOpenSci%20internal%20tools"&gt;rOpenSci internal and peer-review tools&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updates to the &lt;a href="https://devguide.ropensci.org/softwarereview_policies#package-categories#:~:text=data%20retrieval"&gt;data retrieval category&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New explicit rule to only &lt;a href="https://devguide.ropensci.org/softwarereview_author#lifecycle#:~:text=do%20not%20submit%20several"&gt;submit one package at a time&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New requirement to not call the &lt;a href="https://devguide.ropensci.org/pkg_building#version-control#:~:text=not%20be%20master"&gt;default branch &amp;ldquo;master&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removed requirement to use a &lt;code&gt;codemeta.json&lt;/code&gt; file, now deprecated. Codemeta continues to be &lt;a href="https://codemeta.github.io/"&gt;actively used and developed&lt;/a&gt;, but we have found it redundant with other metadata and Codemeta can generate these data as-needed from DESCRIPTION files.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Editor Guide, Author Guide &amp;amp; Reviewer Guide
&lt;/h2&gt;&lt;p&gt;The guides that live in our guide. &amp;#x1f638;&lt;/p&gt;
&lt;p&gt;The whole &lt;a href="https://devguide.ropensci.org/softwarereview_editor"&gt;editor guide&lt;/a&gt; was has been restructured to follow the typical flow of submissions,
and to better explain how to use the &lt;a href="https://dashboard.ropensci.org/"&gt;software-review dashboard&lt;/a&gt;.
We added a section on challenges, and documented how to put the system on vacation (which we generally do over the new year period).&lt;/p&gt;
&lt;p&gt;Likewise, we improved the organization and content of the &lt;a href="https://devguide.ropensci.org/softwarereview_author"&gt;author guide&lt;/a&gt; (thanks to &lt;a href="https://github.com/robitalec"&gt;Alec Robitaille&lt;/a&gt; and &lt;a href="https://github.com/jmaspons"&gt;Joan Maspons&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://devguide.ropensci.org/softwarereview_reviewer"&gt;reviewer guide&lt;/a&gt;, we removed the external link to the no-longer maintained Mozilla Review guide (one of our early design sources for peer-review) in favor of explicit enumerated items.&lt;/p&gt;
&lt;h2&gt;
Packaging Best Practices
&lt;/h2&gt;&lt;p&gt;In the packaging guide (another guide within the guide!), we added guidance for choosing &lt;a href="https://devguide.ropensci.org/pkg_building#example-datasets"&gt;example datasets&lt;/a&gt;.
Furthermore, we created a section for &lt;a href="https://devguide.ropensci.org/pkg_building#external-software"&gt;Packages wrapping external software&lt;/a&gt;.
The &lt;a href="https://devguide.ropensci.org/pkg_building#licence"&gt;licencing section&lt;/a&gt; now explicitly requires acknowledging authors of bundled code.
Last but not least, the &lt;a href="https://devguide.ropensci.org/pkg_building#pkgdependencies"&gt;section about dependencies&lt;/a&gt; recommends checking the development status of dependencies.&lt;/p&gt;
&lt;p&gt;The whole book now mentions the &lt;a href="https://posit-dev.github.io/air/"&gt;Air CLI&lt;/a&gt; every time it mentions the styler package, as Air can be viewed as styler&amp;rsquo;s successor.&lt;/p&gt;
&lt;p&gt;In the chapter about Package evolution, we added guidance on &lt;a href="https://devguide.ropensci.org/maintenance_evolution#data-deprecate"&gt;deprecating &lt;em&gt;data&lt;/em&gt;&lt;/a&gt;, and explained the &lt;a href="https://devguide.ropensci.org/maintenance_evolution#renaming-packages"&gt;drawbacks of renaming a widely-used package&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
Testing guidance
&lt;/h2&gt;&lt;p&gt;We updated our &lt;a href="https://devguide.ropensci.org/pkg_building.html#testing"&gt;testing guidance&lt;/a&gt; with&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a &lt;a href="https://devguide.ropensci.org/pkg_building.html#testing#:~:text=tinytest"&gt;mention of tinytest&lt;/a&gt; as an alternative to testthat;&lt;/li&gt;
&lt;li&gt;a note on keeping tests written with testthat &lt;a href="https://devguide.ropensci.org/pkg_building.html#testing#:~:text=self-contained"&gt;self-contained&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Package Documentation
&lt;/h2&gt;&lt;p&gt;With particular thanks to &lt;a href="https://github.com/rmgpanw"&gt;Alasdair Warwick &lt;/a&gt;, we improved the documentation &amp;#x1f609; of our documentation building system, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More details on the &lt;a href="https://devguide.ropensci.org/pkg_ci#rodocsci"&gt;technical aspects&lt;/a&gt; of docs building for rOpenSci packages;&lt;/li&gt;
&lt;li&gt;Updated &lt;a href="https://devguide.ropensci.org/pkg_building.html#mathjax"&gt;math guidance&lt;/a&gt; following pkgdown&amp;rsquo;s update.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also clarified different strategies to &lt;a href="https://devguide.ropensci.org/pkg_building#:~:text=nord"&gt;document internal functions&lt;/a&gt;, thanks to &lt;a href="https://github.com/cforgaci"&gt;Claudiu Forgaci&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
Metadata &amp;amp; Package Information
&lt;/h2&gt;&lt;p&gt;We documented more ways to acknowledge contributors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;in the &lt;a href="https://devguide.ropensci.org/pkg_building.html#authorship"&gt;authorship&lt;/a&gt; section of the packaging guide, with &lt;a href="https://ropensci.org/blog/2025/05/09/ror/"&gt;Research Organization Registry (ROR) IDs&lt;/a&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;in the chapter about &lt;a href="https://devguide.ropensci.org/maintenance_collaboration.html#attributions"&gt;collaboration&lt;/a&gt;, the &lt;a href="https://docs.ropensci.org/allcontributors/"&gt;allcontributors R package&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Conclusion
&lt;/h2&gt;&lt;p&gt;In this post we summarized the changes in the latest version of our book &lt;a href="https://devguide.ropensci.org"&gt;“rOpenSci Packages: Development, Maintenance, and Peer Review”&lt;/a&gt;.
We are thankful for all contributions that created this release.
We are already working on the next version.
Don&amp;rsquo;t hesitate to help us shape it by opening an &lt;a href="https://github.com/ropensci/dev_guide/issues"&gt;issue&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>Software Review in the Era of AI: What We Are Testing at rOpenSci</title><link>https://ropensci.org/blog/2026/02/26/ropensci-ai-policy/</link><pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate><author>rOpenSci</author><guid>https://ropensci.org/blog/2026/02/26/ropensci-ai-policy/</guid><description>
&lt;p&gt;The advent of large language models (LLMs) and generative AI tools has changed the nature of software development and of software review.
These developments are complex, challenging, and controversial, but require action to maintain and grow rOpenSci&amp;rsquo;s programs and community.
In response, we are starting with a preliminary set of policies to clarify our expectations for use of generative AI tools by authors, reviewers, and editors in software peer-review.
This blog post describes the challenges ahead and initial changes we are making.&lt;/p&gt;
&lt;h2&gt;
Challenge: Maintaining our core values
&lt;/h2&gt;&lt;p&gt;Our top challenge is maintaining our core values.&lt;/p&gt;
&lt;p&gt;A central value for rOpenSci is fostering a welcoming community, in particular through supporting and encouraging people who might otherwise feel excluded. Generative AI tools can help with that.
Large language models and generative AI tools may make many coding tasks easier and quicker, and can expand the community of people able to contribute to open source software and the OSS community.&lt;/p&gt;
&lt;p&gt;Yet there are many downsides to generative AI tools which challenge our core values. pyOpenSci has done an excellent job &lt;a href="https://www.pyopensci.org/blog/generative-ai-peer-review-policy.html"&gt;exploring these in this blog post&lt;/a&gt;.
They fall into two broad areas.&lt;/p&gt;
&lt;p&gt;First, use of AI can in many cases degrade the quality of both open-source scientific code and the process by which we create it.
LLMs can in many cases produce incorrect outputs, fail to generate time or efficiency benefits, or degrade the process of learning to code or the social cohesion of the community.
A core design of our software peer-review is to drive community building through healthy interactions between authors, reviewers, and contributors.
We aim to improve and promote the quality of research software, to facilitate good development practices among researchers, to foster collaboration, and to curate a community of practice.
Any use of AI must be compatible with that goal.&lt;/p&gt;
&lt;p&gt;Second, AI has the potential for tremendous broader impacts or externalities: environmental impacts, amplification of bias, infringement of creative and intellectual rights, or even driving increases in &lt;a href="https://pluralistic.net/2025/12/05/pop-that-bubble/#u-washington"&gt;social and economic inequality&lt;/a&gt;.
We have both collective and individual responsibilities to address these impacts, which include the right to opt out of uses of AI.&lt;/p&gt;
&lt;h2&gt;
Challenge: Changing the focus of software reviews
&lt;/h2&gt;&lt;p&gt;Editors and reviewers at rOpenSci are volunteers who devote their own time to help others improve the quality of their software.
Our review system works because they have always been able to assume that all aspects of code submitted for review have reflected decisions made by the human authors of software.
That, in turn, has ensured that the efforts of editors and reviewers are proportional to the primary efforts of software authors.&lt;/p&gt;
&lt;p&gt;Generative AI tools potentially change both of these situations.
They enable software to be produced with relatively little human input or oversight, which means editors and reviewers may put more consideration into software design, structure, and function than submitting authors.
We do not want software review to become a service in which our human volunteers validate largely AI-generated software.
That would put at risk the equal and constructive interaction of review, and likely reduce the motivation of editors and reviewers.
We need to ensure that our software review process remains focused on the decisions, designs, and implementations of the submitting authors.&lt;/p&gt;
&lt;p&gt;One option is requesting authors to outline the areas that have been AI generated, and specifying the scope of their own work.
However, this could result in our previously holistic process becoming one where only defined aspects or sections of software end up being reviewed.
Authors declaring that a certain tool was used to generate all tests may lead one reviewer to completely ignore those tests, while another reviewer may be passionately engaged in the ways by which exactly that tool writes tests.&lt;/p&gt;
&lt;p&gt;In any case, this will require everybody to be as open as possible about what, where, and how generative AI tools may have been used.&lt;/p&gt;
&lt;h2&gt;
Response: Preliminary policies
&lt;/h2&gt;&lt;p&gt;Our initial policy updates are not intended to restrict use of generative AI tools, but to encourage the rOpenSci community to approach these tools in ways that encourage, rather than diminish, healthy community interactions.&lt;/p&gt;
&lt;p&gt;Similar updates have already been implemented by both the &lt;a href="https://blog.joss.theoj.org/2026/01/preparing-joss-for-a-generative-ai-future"&gt;Journal of Open Source Software&lt;/a&gt; and &lt;a href="https://www.pyopensci.org/blog/generative-ai-peer-review-policy.html"&gt;pyOpenSci&lt;/a&gt;, and we are indebted to the work of all those who contributed to these policy statements.&lt;/p&gt;
&lt;p&gt;Importantly, our software review policies and practices have evolved over many years in response to community engagement and feedback.
The introduction of policies addressing generative AI tools is a part of that evolution, and these policies will also evolve further in responses to community engagement, and changing community practices.&lt;/p&gt;
&lt;h3&gt;
No change in scope
&lt;/h3&gt;&lt;p&gt;One potential response would be a change in the scope of packages we review.
JOSS has updated their &lt;a href="https://joss.theoj.org/about#ai-policy"&gt;scope definition&lt;/a&gt; to, among other things, require a longer record of continuous development, along with other criteria, such as evidence of impact and design.
At rOpenSci, authors often seek feedback on early-stage software.
Our review process commonly involves deep and broad consideration through extensive exchanges between authors, reviewers, and editors.
We are confident that this extends to many of the areas emphasized by JOSS&amp;rsquo;s updated criteria, and we therefore see no need to explicitly change either the scope or focus of review.&lt;/p&gt;
&lt;h3&gt;
Requiring openness of AI usage
&lt;/h3&gt;&lt;p&gt;Our policy updates aim to retain the same degree of openness and transparency we have always practiced, while extending to the new area of generative AI tools and practices.
We cannot know the eventual impact that generative AI tools may have on software review processes and practices at rOpenSci, and can ask only for an utmost degree of transparency from all involved.&lt;/p&gt;
&lt;p&gt;We now describe specific updates to both our practices and policies for authors, for editors, and for reviewers.
Software review aims to provide authors with feedback on their practices and choices, and not just on the lines of code they or an AI generated.
We also value the time and effort of editors and reviewers, and want them to be able to focus on the practices and choices of authors.&lt;/p&gt;
&lt;h3&gt;
Practical application: for authors
&lt;/h3&gt;&lt;p&gt;Authors who do not use generative AI tools will submit as always, with no extra requirements.
Those who do use such tools will be asked to describe their use, and to affirm that all generated material has been carefully reviewed by the authors.
We want these descriptions to help reviewers and editors to understand how they can best review code and provide useful feedback.&lt;/p&gt;
&lt;p&gt;We will be modifying our submission template to include this required section, and will be updating the &lt;a href="https://devguide.ropensci.org/softwarereview_author.html"&gt;Guide for Authors&lt;/a&gt; with additional guidance.&lt;/p&gt;
&lt;p&gt;A minimal example might be a statement that “we’re not very proficient in C, so we used an LLM to generate most of the code for the C algorithm.”
This might guide reviewers to pay particular attention to the tests for that part of the package.
A more extensive description might be that, “We used &amp;lt;tool-of-choice&amp;gt; to generate all tests, but have read, edited, and manually stepped through each test ourselves.”
This can help reviewers decide whether to pay more or less attention to the tests depending on their interests.
Either way, knowing that tests were generated by AI tools is useful and important to the review process.&lt;/p&gt;
&lt;p&gt;Descriptions may refer to relevant documentation in the repository, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Design documents which highlight key components and explain their design;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;agents.md&amp;rdquo; or equivalent files, along with explanations of how these have been used, along with clear description of the roles of the submitting authors;&lt;/li&gt;
&lt;li&gt;Overviews of developmental histories, for example in &amp;ldquo;NEWS.md&amp;rdquo; or equivalent files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We intend to maintain our requirement for “CONTRIBUTING.md” files, as any generative AI tools can also be directed to treat that as an “agents.md” file.&lt;/p&gt;
&lt;p&gt;This is our intended addition to the templates for authors submitting software for review:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;## Use of Generative AI
- [ ] Generative AI tools were used to produce some of the material in this submission.
If so, please describe: &amp;lt;!-- refer to our AI policies at http:// ... --&amp;gt;
If your repository includes an &amp;#34;agents.md&amp;#34; file or equivalent, please provide a link, and describe how this has been used in the development of your package.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;An example of such a description can be found in this &lt;a href="https://github.com/ropensci/software-review/issues/752#issuecomment-3938097125"&gt;recent software review submission&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
Practical application: for editors
&lt;/h3&gt;&lt;p&gt;Editors are the first to view software submitted to rOpenSci, and generally complete an initial &lt;a href="https://devguide.ropensci.org/editortemplate.html"&gt;Editors checklist&lt;/a&gt; indicating whether they think a package may proceed to review.
This checklist will also include an additional item:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- [ ] **Use of generative AI tools**: If the authors have used generative AI tools, have they sufficiently described their usage?
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This item will also require no additional action by editors unless authors have used generative AI tools.&lt;/p&gt;
&lt;p&gt;Initial editorial considerations have until now been largely technical, including many of the aspects now automated by &lt;a href="https://docs.ropensci.org/pkgcheck/"&gt;our &lt;code&gt;pkgcheck&lt;/code&gt; system&lt;/a&gt;.
In response to this new checklist item, editors may broaden their consideration to whether a package has had sufficient human contribution to be worth reviewing, alongside considerations of additional factors such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clear statements of package motivation and importance.&lt;/li&gt;
&lt;li&gt;Package development history.&lt;/li&gt;
&lt;li&gt;Evidence of design decisions motivating the software.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When recruiting reviewers for a package, editors may describe authors’ AI usage where relevant to help them understand the nature of the package and demands of review.&lt;/p&gt;
&lt;h3&gt;
Practical application: for reviewers
&lt;/h3&gt;&lt;p&gt;Review processes at rOpenSci frequently involve reviewers recommending potential improvements, and authors then implementing those.
In adapting to use of generative AI tools, we will strive to maintain the same culture of constructive feedback.
We hope that authors will provide sufficient information on any use of generative AI tools to guide reviewers towards aspects of their software requiring particular attention.&lt;/p&gt;
&lt;p&gt;Reviewers are permitted to use generative AI tools in preparing reviews for rOpenSci, but their use must meet the same criteria of supporting the goals of review.
Our &lt;a href="https://devguide.ropensci.org/softwarereview_reviewer.html"&gt;Guide for Reviewers&lt;/a&gt; will be updated to note the following points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generative AI tools may be used to aid the review process, but all review text must reflect the judgement of the reviewer.&lt;/li&gt;
&lt;li&gt;Typical and acceptable use of generative AI tools in software review includes getting an overview of software design, structure, and function.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Updates to the &lt;a href="https://devguide.ropensci.org/softwarereview_reviewer.html"&gt;Guide for Reviewers&lt;/a&gt; will also include examples of productive use of generative AI tools in the review process.
We aim to run pilots over the course of this year to test where in the review process AI can best be used to improve everyone&amp;rsquo;s experience, and to provide more robust guidelines and custom tools.&lt;/p&gt;
&lt;p&gt;Reviewers may also consider AI use in choosing whether to volunteer as a reviewer of a package, and authors should be aware that extensive AI use could increase the time to find reviewers.&lt;/p&gt;
&lt;h2&gt;
Moving forward
&lt;/h2&gt;&lt;p&gt;This is our first pass at providing guidelines governing the use of generative AI to ensure rOpenSci software review continues to improve while retaining its essential values.&lt;/p&gt;
&lt;p&gt;With more package submissions having some component of AI contribution, the editorial board thought it essential to provide these updates to manage the process as we learn more about what works and what does not.&lt;/p&gt;
&lt;p&gt;We invite you to further discuss the evolving role of AI in software review in &lt;a href="https://github.com/ropensci/software-review-meta/issues/107"&gt;this issue&lt;/a&gt;, and more importantly to join us as an author or reviewer in peer review, so we can learn together!&lt;/p&gt;</description></item></channel></rss>