extendr_api

Derive Macro IntoRobj

Source
#[derive(IntoRobj)]
Expand description

Derives an implementation of From<Struct> for Robj and From<&Struct> for Robj on this struct.

This allows the struct to be converted to a named list in R, where the list names correspond to the field names of the Rust struct.

§Examples

In the below example, converted contains an R list object with the same fields as the Foo struct.

use extendr_api::prelude::*;
use extendr_macros::IntoRobj;

#[derive(IntoRobj)]
struct Foo {
    a: u32,
    b: String
}
let converted: Robj = Foo {
    a: 5,
    b: String::from("bar")
}.into();
assert_eq!(converted, R!(r"list(a=5, b='bar')")?);

See TryFromRobj for a derive-macro in the other direction, i.e. instantiation of a rust type, by an R list with fields corresponding to said type.

§Details

Note, the From<Struct> for Robj behaviour is different from what is obtained by applying the standard #[extendr] macro to an impl block. The #[extendr] behaviour returns to R a pointer to Rust memory, and generates wrapper functions for calling Rust functions on that pointer. The implementation from #[derive(IntoRobj)] actually converts the Rust structure into a native R list, which allows manipulation and access to internal fields, but it’s a one-way conversion, and converting it back to Rust will produce a copy of the original struct.