Package Setup
A ‘Hello, world!’ Example.
Once you have Rust and {rextendr} installed, you can begin creating Rust-powered R packages.
The first step to using extendr is to create an R package. It is recommend to create a new package using the package {usethis}.
usethis::create_package("hellorust")If you are in the RStudio IDE, a new R project will be opened up for you with the file structure of a new R package.
.
├── DESCRIPTION
├── NAMESPACE
├── R
└── hellorust.Rproj
Now that you have a new R package, you can add extendr to it.
rextendr::use_extendr()This will add an extendr package template to the R packge. We will go through the package structure in more depth shortly.
.
├── DESCRIPTION
├── NAMESPACE
├── R
│ └── extendr-wrappers.R
├── hellorust.Rproj
└── src
├── Makevars
├── Makevars.ucrt
├── Makevars.win
├── entrypoint.c
├── hellorust-win.def
└── rust
├── Cargo.toml
└── src
└── lib.rs
Inside of the file src/rust/src/lib.rs is a hello world function.
/// Return string `"Hello world!"` to R.
/// @export
#[extendr]
fn hello_world() -> &'static str {
"Hello world!"
}Note that roxygen2 can be used with Rust documentation comments /// instead of //.
The function is made available to R via the macro extendr_module!.
// Macro to generate exports.
// This ensures exported functions are registered with R.
// See corresponding C code in `entrypoint.c`.
extendr_module! {
mod hellorust;
fn hello_world;
}Use the function rextendr::document() to automatically create R function wrappers to call the Rust function. This will recompile the Rust library.
rextendr::document()
#> rextendr::document()
#> ✔ Saving changes in the open files.
#> ℹ Generating extendr wrapper functions for package: hellorust.
#> ℹ Re-compiling hellorust (debug build)
#> .... truncated ....
#> ─ DONE (hellorust)
#> ✔ Writing 'R/extendr-wrappers.R'
#> ℹ Updating hellorust documentation
#> Writing NAMESPACE
#> ℹ Loading hellorust
#> Writing NAMESPACE
#> Writing hellorust-package.Rd
#> Writing hello_world.RdThe file R/extendr-wrappers.R was updated and now contains
#' Return string `"Hello world!"` to R.
#' @export
hello_world <- function() .Call(wrap__hello_world)Run devtools::load_all() to make the function available to your session.
devtools::load_all()
#> ℹ Loading hellorustThe package hellorust has been loaded and now you can run hello_world()
hello_world()
#> "Hello world!"