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.

goldziher a0fccb0 1.3 KB Updated

File contents

  • 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.

goldziher/ai-rulez/tree/main/internal/builtins/bindings/extendr/skills/extendr-bindings commit a0fccb074c

Frequently asked questions

npx skillmds@latest add goldziher/extendr-bindings