R et Rust : une histoire d’amour naissante

Joseph Barbier - Rencontres R 2026

A propos


Consulting

Open source

Data(viz)

Pourquoi venir parler de Rust ?



  • Pas pour vous dire que c’est mieux que R
  • Pas pour vous dire que vous devez re-écrire vos projets en Rust

Pourquoi venir parler de Rust ?


  • Open source : Linux, Firefox, Windows, Deno, …

  • Industrie : AWS, Dropbox, Cloudflare, Discord, Datadog, …

D’où ça vient ?

Performance (⚠️⚠️⚠️)

Memory safety

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;

    println!("{}", s1);
    println!("{}", s2);
}


error[E0382]: borrow of moved value: `s1`
 --> /Users/josephbarbier/l/talk/src/rencontresR2026/script.rs:5:20
  |
2 |     let s1 = String::from("hello");
  |         -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait
3 |     let s2 = s1;
  |              -- value moved here
4 |
5 |     println!("{}", s1);
  |                    ^^ value borrowed here after move
  |
help: consider cloning the value if the performance cost is acceptable
  |
3 |     let s2 = s1.clone();
  |                ++++++++

Type safety

fn main() {
    let x: i32 = 10;
    let y: &str = "20";

    let result = x + y;
}


error[E0277]: cannot add `&str` to `i32`
 --> /Users/josephbarbier/l/talk/src/rencontresR2026/script2.rs:5:20
  |
5 |     let result = x + y;
  |                    ^ no implementation for `i32 + &str`
  |
  = help: the trait `Add<&str>` is not implemented for `i32`
  = help: the following other types implement trait `Add<Rhs>`:
            `&i32` implements `Add<i32>`
            `&i32` implements `Add`
            `i32` implements `Add<&i32>`
            `i32` implements `Add`



  • “Oui mais en R aussi j’aurai une erreur”

Expérience développeur

Ecosystème Python

  • uv: package/project manager
  • ruff: linter & formatter
  • ty: type checker
  • pyrefly: type checker
  • polars: data manipulation
  • pydantic: data validation
  • monty: interpreter
  • prek: pre-commit hook
  • et plein d’autres!

R ❤️ Rust : ça existe déjà
(et ça marche)

Rust dans l’écosystème R

  • Ark: kernel R (utilisé dans Positron IDE)
  • Air: formatter et serveur de langage
  • Jarl: linter
  • yaml12: YAML parser
  • polars: R interface à polars
  • et plein d’autres !

Projet en développement

Tuto
Faire son premier projet R et Rust

Appeler Rust depuis R

use std::os::raw::c_double;

#[no_mangle]
pub extern "C" fn add_two(x: *mut c_double) {
    unsafe {
        *x = *x + 2.0;
    }
}


On compile avec cargo build, et ensuite:


dyn.load("target/release/libexample.dylib")

add_two <- function(x) {
    .C("add_two", as.double(x))[[1]]
}

add_two(41)
  • On perd la safety
  • Et pas d’abstraction R

Extendr

Comment on appelle Rust depuis R


use extendr_api::prelude::*;

/// @export
#[extendr]
fn hello() -> &'static str {
    "Hello RencontresR 2026 !"
}

extendr_module! {
    mod helloextendr;
    fn hello;
}


devtools::document() # build package
devtools::load_all() # load package

hello()
#> "Hello RencontresR 2026 !"

Est-ce que je dois arrêter R pour faire du Rust ? (non)


  • Rust ne remplace(ra) pas R
  • Rust fonctionne très bien avec R
  • Rust peut remplacer C/C++
  • Rust ne résoudra pas tous vos problèmes
  • Il est probable que vous n’ayez même pas besoin de Rust 😳
  • Mais c’est bien de savoir comment fonctionnent les outils qu’on utilise
    • rien n’est magique !
  • Et peut-être que ça vous donnera envie d’essayer

Un mot sur l’IA

Merci !

J’ai dit des choses fausses ?

  • venez m’en parler !

J’ai dit des choses pertinentes ?

  • venez m’en parler !


Autres ?