Derive Macro extendr_api::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.