# Extendr Bindings

> extendr conventions for exposing a Rust core to R: extendr macros and module registration, Robj type mapping, NA handling, rextendr builds, R package scaffolding, and CRAN compliance. Load when generating or reviewing extendr R bindings for a Rust library.

- Skill: `goldziher/extendr-bindings` (Agent Skill)
- Install (CLI): `npx skillmds@latest add goldziher/extendr-bindings`
- Raw SKILL.md: https://api.skillmd.com/api/skills/goldziher/extendr-bindings/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: goldziher (https://skillmd.com/u/goldziher)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/goldziher/extendr-bindings

---


- Use `extendr` crate for Rust-R interop. `#[extendr]` macro on functions, `extendr_module!` for registration.
- Type mapping: `Robj` for generic R objects, `Doubles`, `Integers`, `Strings`, `List` for typed access.
- Return `Result<T, extendr_api::Error>` for R error propagation. Use `.into()` for Rust-to-R conversion.
- NA handling: use `Rfloat::na()`, `Rint::na()` for missing values. Check with `.is_na()` before operations.
- Build with `rextendr::document()` in R for development, `cargo build --release` for production.
- Package integration: use `usethis::use_extendr()` for scaffolding. Maintain `src/rust/` in R package.
- Test R-side with `testthat`, Rust-side with standard `#[test]`. Use `rextendr::test()` for integration.
- CRAN compliance: `R CMD check --as-cran` must pass. No compiler warnings. Vendor Rust dependencies.
- Keep R wrapper functions thin — heavy computation in Rust, R provides user-facing API with roxygen2 docs.
- Anti-patterns: ignoring NA values, allocating R objects in Rust threads, panics in `#[extendr]` functions.

