Enum extendr_api::robj::Robj[][src]

pub enum Robj {
    // some variants omitted
}

Wrapper for an R S-expression pointer (SEXP).

Create R objects from rust types and iterators:

use extendr_api::prelude::*;
test! {
    // Different ways of making integer scalar 1.
    let non_na : Option<i32> = Some(1);
    let a : Robj = vec![1].into();
    let b = r!(1);
    let c = r!(vec![1]);
    let d = r!(non_na);
    let e = r!([1]);
    assert_eq!(a, b);
    assert_eq!(a, c);
    assert_eq!(a, d);
    assert_eq!(a, e);

    // Different ways of making boolean scalar TRUE.
    let a : Robj = true.into();
    let b = r!(TRUE);
    assert_eq!(a, b);

    // Create a named list
    let a = list!(a = 1, b = "x");
    assert_eq!(a.len(), 2);

    // Use an iterator (like 1:10)
    let a = r!(1 ..= 10);
    assert_eq!(a, r!([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));

    // Use an iterator (like (1:10)[(1:10) %% 3 == 0])
    let a = (1 ..= 10).filter(|v| v % 3 == 0).collect_robj();
    assert_eq!(a, r!([3, 6, 9]));
}

Use iterators to get the contents of R objects.

use extendr_api::prelude::*;
test! {
    let a : Robj = r!([1, 2, 3, 4, 5]);
    let iter = a.as_integer_iter().unwrap();
    let robj = iter.filter(|&x| x < 3).collect_robj();
    assert_eq!(robj, r!([1, 2]));
}

Convert to/from Rust vectors.

use extendr_api::prelude::*;
test! {
    let a : Robj = r!(vec![1., 2., 3., 4.]);
    let b : Vec<f64> = a.as_real_vector().unwrap();
    assert_eq!(a.len(), 4);
    assert_eq!(b, vec![1., 2., 3., 4.]);
}

Iterate over names and values.

use extendr_api::prelude::*;
test! {
    let abc = list!(a = 1, b = "x", c = vec![1, 2]);
    let names : Vec<_> = abc.names().unwrap().collect();
    let names_and_values : Vec<_> = abc.as_named_list_iter().unwrap().collect();
    assert_eq!(names, vec!["a", "b", "c"]);
    assert_eq!(names_and_values, vec![("a", r!(1)), ("b", r!("x")), ("c", r!(vec![1, 2]))]);
}

NOTE: as much as possible we wish to make this object safe (ie. no segfaults).

If you avoid using unsafe functions it is more likely that you will avoid panics and segfaults. We will take great trouble to ensure that this is true.

Implementations

impl Robj[src]

pub fn as_pairlist_iter(&self) -> Option<PairlistIter>[src]

Get an iterator over a pairlist objects.

use extendr_api::prelude::*;
test! {
    let mut robj = R!(pairlist(a = 1, b = 2, 3)).unwrap();
    let objects : Vec<_> = robj.as_pairlist_iter().unwrap().collect();
    assert_eq!(objects, vec![r!(1.0), r!(2.0), r!(3.0)]);
}

pub fn as_pairlist_tag_iter(&self) -> Option<PairlistTagIter>[src]

Get an iterator over pairlist tags.

use extendr_api::prelude::*;
test! {
    let mut robj = R!(pairlist(a = 1, b = 2, 3)).unwrap();
    // let mut robj = pairlist!(a = 1, b = 2, 3);
    let tags : Vec<_> = robj.as_pairlist_tag_iter().unwrap().collect();
    assert_eq!(tags, vec!["a", "b", na_str()]);
}

pub fn as_list_iter(&self) -> Option<ListIter>[src]

Get an iterator over a list (VECSXP).

use extendr_api::prelude::*;
test! {
    let mut robj = list!(1, 2, 3);
    let objects : Vec<_> = robj.as_list_iter().unwrap().collect();
    assert_eq!(objects, vec![r!(1), r!(2), r!(3)]);
}

pub fn as_str_iter(&self) -> Option<StrIter>[src]

Get an iterator over a string vector. Returns None if the object is not a string vector but works for factors.

use extendr_api::prelude::*;

test! {
    let obj = Robj::from(vec!["a", "b", "c"]);
    assert_eq!(obj.as_str_iter().unwrap().collect::<Vec<_>>(), vec!["a", "b", "c"]);

    let factor = factor!(vec!["abcd", "def", "fg", "fg"]);
    assert_eq!(factor.levels().unwrap().collect::<Vec<_>>(), vec!["abcd", "def", "fg"]);
    assert_eq!(factor.as_integer_vector().unwrap(), vec![1, 2, 3, 3]);
    assert_eq!(factor.as_str_iter().unwrap().collect::<Vec<_>>(), vec!["abcd", "def", "fg", "fg"]);
    assert_eq!(factor.as_str_iter().unwrap().collect::<Vec<_>>(), vec!["abcd", "def", "fg", "fg"]);

    let obj = Robj::from(vec![Some("a"), Some("b"), None]);
    assert_eq!(obj.as_str_iter().unwrap().map(|s| s.is_na()).collect::<Vec<_>>(), vec![false, false, true]);

    let obj = Robj::from(vec!["a", "b", na_str()]);
    assert_eq!(obj.as_str_iter().unwrap().map(|s| s.is_na()).collect::<Vec<_>>(), vec![false, false, true]);

    let obj = Robj::from(vec!["a", "b", "NA"]);
    assert_eq!(obj.as_str_iter().unwrap().map(|s| s.is_na()).collect::<Vec<_>>(), vec![false, false, false]);
}

pub fn as_env_iter(&self) -> Option<EnvIter>[src]

Iterate over an environment.

impl Robj[src]

pub fn as_vector<'a, E>(&self) -> Option<RColumn<&'a [E]>> where
    Self: AsTypedSlice<'a, E>, 
[src]

pub fn as_matrix<'a, E>(&self) -> Option<RMatrix<&'a [E]>> where
    Self: AsTypedSlice<'a, E>, 
[src]

pub fn as_matrix3d<'a, E>(&self) -> Option<RMatrix3D<&'a [E]>> where
    Self: AsTypedSlice<'a, E>, 
[src]

impl Robj[src]

The following impls add operators to Robj.

pub fn dollar<'a, T>(&self, symbol: T) -> Result<Robj> where
    Symbol<'a>: From<T>, 
[src]

Do the equivalent of x$y

use extendr_api::prelude::*;
test! {
let env = r!(Env{
   parent: global_env(),
   names_and_values: vec![("a".to_string(), r!(1)), ("b".to_string(), r!(2))]});
assert_eq!(env.dollar("a").unwrap(), r!(1));
assert_eq!(env.dollar("b").unwrap(), r!(2));
}

pub fn slice<T>(&self, rhs: T) -> Result<Robj> where
    T: Into<Robj>, 
[src]

Do the equivalent of x[y]

use extendr_api::prelude::*;
test! {
let vec = r!([10, 20, 30]);
assert_eq!(vec.slice(2).unwrap(), r!(20));
assert_eq!(vec.slice(2..=3).unwrap(), r!([20, 30]));
}

pub fn index<T>(&self, rhs: T) -> Result<Robj> where
    T: Into<Robj>, 
[src]

Do the equivalent of x[[y]]

use extendr_api::prelude::*;
test! {
let vec = r!([10, 20, 30]);
assert_eq!(vec.index(2).unwrap(), r!(20));
assert_eq!(vec.index(2..=3).is_err(), true);
}

pub fn tilde<T>(&self, rhs: T) -> Result<Robj> where
    T: Into<Robj>, 
[src]

Do the equivalent of x ~ y

use extendr_api::prelude::*;
test! {
let x = r!(Symbol("x"));
let y = r!(Symbol("y"));
let tilde = x.tilde(y).unwrap();
assert_eq!(tilde, r!(Lang(&[r!(Symbol("~")), r!(Symbol("x")), r!(Symbol("y"))])));
assert_eq!(tilde.inherits("formula"), true);
}

pub fn double_colon<T>(&self, rhs: T) -> Result<Robj> where
    T: Into<Robj>, 
[src]

Do the equivalent of x :: y

use extendr_api::prelude::*;
test! {
let base = r!(Symbol("base"));
let env = r!(Symbol(".getNamespace"));
let base_env = base.double_colon(env).unwrap();
assert_eq!(base_env.is_function(), true);
}

impl Robj[src]

The following impls wrap specific Rinternals.h functions.

pub fn is_null(&self) -> bool[src]

Return true if this is the null object.

pub fn is_symbol(&self) -> bool[src]

Return true if this is a symbol.

pub fn is_logical(&self) -> bool[src]

Return true if this is a boolean (logical) vector

pub fn is_real(&self) -> bool[src]

Return true if this is a real (f64) vector.

pub fn is_complex(&self) -> bool[src]

Return true if this is a complex vector.

pub fn is_expr(&self) -> bool[src]

Return true if this is an expression.

pub fn is_environment(&self) -> bool[src]

Return true if this is an environment.

pub fn is_promise(&self) -> bool[src]

Return true if this is an environment.

pub fn is_string(&self) -> bool[src]

Return true if this is a string.

pub fn is_object(&self) -> bool[src]

Return true if this is an object.

pub fn get_current_srcref(val: i32) -> Robj[src]

Get the source ref.

pub fn get_src_filename(&self) -> Robj[src]

Get the source filename.

pub fn as_char(&self) -> Robj[src]

Convert to a string vector.

pub fn coerce_vector(&self, sexptype: u32) -> Robj[src]

Convert to vectors of many kinds.

pub fn pair_to_vector_list(&self) -> Robj[src]

Convert a pairlist (LISTSXP) to a vector list (VECSXP).

pub fn vector_to_pair_list(&self) -> Robj[src]

Convert a vector list (VECSXP) to a pair list (LISTSXP)

pub fn as_character_factor(&self) -> Robj[src]

Convert a factor to a string vector.

pub fn alloc_matrix(sexptype: SEXPTYPE, rows: i32, cols: i32) -> Robj[src]

Allocate a matrix object.

pub fn duplicate(&self) -> Self[src]

Compatible way to duplicate an object. Use obj.clone() instead for Rust compatibility.

pub fn find_function<K: Into<Robj>>(&self, key: K) -> Option<Robj>[src]

Find a function in an environment ignoring other variables.

This evaulates promises if they are found.

See also global_function().

use extendr_api::prelude::*;
test! {
   let my_fun = base_env().find_function(sym!(ls)).unwrap();
   assert_eq!(my_fun.is_function(), true);

   // Note: this may crash on some versions of windows which don't support unwinding.
   // assert!(base_env().find_function(sym!(qwertyuiop)).is_none());
}

pub fn find_var<K: Into<Robj>>(&self, key: K) -> Option<Robj>[src]

Find a variable in an environment.

See also global_var().

Note that many common variables and functions are contained in promises which must be evaluated and this function may throw an R error.

use extendr_api::prelude::*;
test! {
   let iris_dataframe = global_env()
       .find_var(sym!(iris)).unwrap().eval_promise().unwrap();
   assert_eq!(iris_dataframe.is_frame(), true);
   assert_eq!(iris_dataframe.len(), 5);

   // Note: this may crash on some versions of windows which don't support unwinding.
   //assert_eq!(global_env().find_var(sym!(imnotasymbol)), None);
}

pub fn eval_promise(&self) -> Result<Robj>[src]

If this object is a promise, evaluate it, otherwise return the object.

use extendr_api::prelude::*;
test! {
   let iris_promise = global_env().find_var(sym!(iris)).unwrap();
   let iris_dataframe = iris_promise.eval_promise().unwrap();
   assert_eq!(iris_dataframe.is_frame(), true);
}

pub fn ncols(&self) -> usize[src]

Number of columns of a matrix

pub fn nrows(&self) -> usize[src]

Number of rows of a matrix

pub fn xlengthgets(&self, new_len: usize) -> Result<Robj>[src]

Copy a vector and resize it. See. https://github.com/hadley/r-internals/blob/master/vectors.md

pub fn alloc_vector(sexptype: u32, len: usize) -> Robj[src]

Allocated an owned object of a certain type.

pub fn conformable(a: &Robj, b: &Robj) -> bool[src]

Return true if two arrays have identical dims.

pub fn is_array(&self) -> bool[src]

Return true if this is an array.

pub fn is_factor(&self) -> bool[src]

Return true if this is factor.

pub fn is_frame(&self) -> bool[src]

Return true if this is a data frame.

pub fn is_function(&self) -> bool[src]

Return true if this is a function.

pub fn is_integer(&self) -> bool[src]

Return true if this is an integer vector (INTSXP) but not a factor.

pub fn is_language(&self) -> bool[src]

Return true if this is a language object (LANGSXP).

pub fn is_pairlist(&self) -> bool[src]

Return true if this is NILSXP or LISTSXP.

pub fn is_matrix(&self) -> bool[src]

Return true if this is a matrix.

pub fn is_list(&self) -> bool[src]

Return true if this is NILSXP or VECSXP.

pub fn is_number(&self) -> bool[src]

Return true if this is INTSXP, LGLSXP or REALSXP but not a factor.

pub fn is_primitive(&self) -> bool[src]

Return true if this is a primitive function BUILTINSXP, SPECIALSXP.

pub fn is_ts(&self) -> bool[src]

Return true if this is a time series vector (see tsp).

pub fn is_user_binop(&self) -> bool[src]

Return true if this is a user defined binop.

pub fn is_valid_string(&self) -> bool[src]

Return true if this is a valid string.

pub fn is_valid_string_f(&self) -> bool[src]

Return true if this is a valid string.

pub fn is_vector(&self) -> bool[src]

Return true if this is a vector.

pub fn is_vector_atomic(&self) -> bool[src]

Return true if this is an atomic vector.

pub fn is_vector_list(&self) -> bool[src]

Return true if this is a vector list.

pub fn is_vectorizable(&self) -> bool[src]

Return true if this is can be made into a vector.

pub fn is_missing_arg(&self) -> bool[src]

pub fn is_unbound_value(&self) -> bool[src]

pub fn is_package_env(&self) -> bool[src]

pub fn package_env_name(&self) -> Robj[src]

pub fn is_namespace_env(&self) -> bool[src]

pub fn namespace_env_spec(&self) -> Robj[src]

impl Robj[src]

pub fn rtype(&self) -> RType[src]

Get the type of an R object.

use extendr_api::prelude::*;
test! {
    assert_eq!(r!(NULL).rtype(), RType::Null);
    assert_eq!(sym!(xyz).rtype(), RType::Symbol);
    assert_eq!(r!(Pairlist{names_and_values: vec![("a", r!(1))]}).rtype(), RType::Pairlist);
    assert_eq!(R!(function() {})?.rtype(), RType::Function);
    assert_eq!(new_env().rtype(), RType::Enviroment);
    assert_eq!(lang!("+", 1, 2).rtype(), RType::Language);
    assert_eq!(r!(Primitive("if")).rtype(), RType::Special);
    assert_eq!(r!(Primitive("+")).rtype(), RType::Builtin);
    assert_eq!(r!(Character("hello")).rtype(), RType::Character);
    assert_eq!(r!(TRUE).rtype(), RType::Logical);
    assert_eq!(r!(1).rtype(), RType::Integer);
    assert_eq!(r!(1.0).rtype(), RType::Real);
    assert_eq!(r!("1").rtype(), RType::String);
    assert_eq!(r!(List(&[1, 2])).rtype(), RType::List);
    assert_eq!(parse("x + y")?.rtype(), RType::Expression);
    assert_eq!(r!(Raw(&[1_u8, 2, 3])).rtype(), RType::Raw);
}

pub fn len(&self) -> usize[src]

Get the extended length of the object.

use extendr_api::prelude::*;
test! {

let a : Robj = r!(vec![1., 2., 3., 4.]);
assert_eq!(a.len(), 4);
}

pub fn local<K: Into<Robj>>(&self, key: K) -> Option<Robj>[src]

Get a variable from an enviroment, but not its ancestors.

use extendr_api::prelude::*;
test! {

let env = new_env();
env.set_local(sym!(x), "fred");
assert_eq!(env.local(sym!(x)), Some(r!("fred")));
}

pub fn set_local<K: Into<Robj>, V: Into<Robj>>(&self, key: K, value: V)[src]

Set or define a variable in an enviroment.

use extendr_api::prelude::*;
test! {

let env = new_env();
env.set_local(sym!(x), "harry");
env.set_local(sym!(x), "fred");
assert_eq!(env.local(sym!(x)), Some(r!("fred")));
}

pub fn parent(&self) -> Option<Robj>[src]

Get the parent of an environment.

use extendr_api::prelude::*;
test! {

let global_parent = global_env().parent().unwrap();
assert_eq!(global_parent.is_environment(), true);
assert_eq!(base_env().parent(), None);
assert_eq!(r!(1).parent(), None);
}

pub fn is_na(&self) -> bool[src]

Is this object is an NA scalar? Works for character, integer and numeric types.

use extendr_api::prelude::*;
test! {

assert_eq!(r!(NA_INTEGER).is_na(), true);
assert_eq!(r!(NA_REAL).is_na(), true);
assert_eq!(r!(NA_STRING).is_na(), true);
}

pub fn as_integer_slice<'a>(&self) -> Option<&'a [i32]>[src]

Get a read-only reference to the content of an integer vector.

use extendr_api::prelude::*;
test! {

let robj = r!([1, 2, 3]);
assert_eq!(robj.as_integer_slice().unwrap(), [1, 2, 3]);
}

pub fn as_integer_iter(&self) -> Option<Int>[src]

Get an iterator over integer elements of this slice.

use extendr_api::prelude::*;
test! {

let robj = r!([1, 2, 3]);
let mut tot = 0;
for val in robj.as_integer_iter().unwrap() {
  tot += val;
}
assert_eq!(tot, 6);
}

pub fn as_integer_vector(&self) -> Option<Vec<i32>>[src]

Get a Vec copied from the object.

use extendr_api::prelude::*;
test! {

let robj = r!([1, 2, 3]);
assert_eq!(robj.as_integer_slice().unwrap(), vec![1, 2, 3]);
}

pub fn as_logical_slice(&self) -> Option<&[Bool]>[src]

Get a read-only reference to the content of a logical vector using the tri-state Bool. Returns None if not a logical vector.

use extendr_api::prelude::*;
test! {
    let robj = r!([TRUE, FALSE, NA_LOGICAL]);
    assert_eq!(robj.as_logical_slice().unwrap(), [TRUE, FALSE, NA_LOGICAL]);
}

pub fn as_logical_vector(&self) -> Option<Vec<Bool>>[src]

Get a Vec copied from the object using the tri-state Bool. Returns None if not a logical vector.

use extendr_api::prelude::*;
test! {
    let robj = r!([TRUE, FALSE, NA_LOGICAL]);
    assert_eq!(robj.as_logical_vector().unwrap(), vec![TRUE, FALSE, NA_LOGICAL]);
}

pub fn as_logical_iter(&self) -> Option<Logical>[src]

Get an iterator over logical elements of this slice.

use extendr_api::prelude::*;
test! {
    let robj = r!([TRUE, FALSE, NA_LOGICAL]);
    let (mut nt, mut nf, mut nna) = (0, 0, 0);
    for val in robj.as_logical_iter().unwrap() {
      match val {
        TRUE => nt += 1,
        FALSE => nf += 1,
        NA_LOGICAL => nna += 1,
        _ => ()
      }
    }
    assert_eq!((nt, nf, nna), (1, 1, 1));
}

pub fn as_real_slice(&self) -> Option<&[f64]>[src]

Get a read-only reference to the content of a double vector. Note: the slice may contain NaN or NA values. We may introduce a "Real" type to handle this like the Bool type.

use extendr_api::prelude::*;
test! {
    let robj = r!([Some(1.), None, Some(3.)]);
    let mut tot = 0.;
    for val in robj.as_real_slice().unwrap() {
      if !val.is_na() {
        tot += val;
      }
    }
    assert_eq!(tot, 4.);
}

pub fn as_real_iter(&self) -> Option<Real>[src]

Get an iterator over real elements of this slice.

use extendr_api::prelude::*;
test! {
    let robj = r!([1., 2., 3.]);
    let mut tot = 0.;
    for val in robj.as_real_iter().unwrap() {
      if !val.is_na() {
        tot += val;
      }
    }
    assert_eq!(tot, 6.);
}

pub fn as_real_vector(&self) -> Option<Vec<f64>>[src]

Get a Vec copied from the object.

use extendr_api::prelude::*;
test! {
    let robj = r!([1., 2., 3.]);
    assert_eq!(robj.as_real_vector().unwrap(), vec![1., 2., 3.]);
}

pub fn as_raw_slice(&self) -> Option<&[u8]>[src]

Get a read-only reference to the content of an integer or logical vector.

use extendr_api::prelude::*;
test! {
    let robj = r!(Raw(&[1, 2, 3]));
    assert_eq!(robj.as_raw_slice().unwrap(), &[1, 2, 3]);
}

pub fn as_integer_slice_mut(&mut self) -> Option<&mut [i32]>[src]

Get a read-write reference to the content of an integer or logical vector. Note that rust slices are 0-based so slice[1] is the middle value.

use extendr_api::prelude::*;
test! {
    let mut robj = r!([1, 2, 3]);
    let slice : & mut [i32] = robj.as_integer_slice_mut().unwrap();
    slice[1] = 100;
    assert_eq!(robj, r!([1, 100, 3]));
}

pub fn as_real_slice_mut(&mut self) -> Option<&mut [f64]>[src]

Get a read-write reference to the content of a double vector. Note that rust slices are 0-based so slice[1] is the middle value.

use extendr_api::prelude::*;
test! {
    let mut robj = r!([1.0, 2.0, 3.0]);
    let slice = robj.as_real_slice_mut().unwrap();
    slice[1] = 100.0;
    assert_eq!(robj, r!([1.0, 100.0, 3.0]));
}

pub fn as_raw_slice_mut(&mut self) -> Option<&mut [u8]>[src]

Get a read-write reference to the content of a raw vector.

use extendr_api::prelude::*;
test! {
    let mut robj = r!(Raw(&[1, 2, 3]));
    let slice = robj.as_raw_slice_mut().unwrap();
    slice[1] = 100;
    assert_eq!(robj, r!(Raw(&[1, 100, 3])));
}

pub fn as_string_vector(&self) -> Option<Vec<String>>[src]

Get a vector of owned strings. Owned strings have long lifetimes, but are much slower than references.

use extendr_api::prelude::*;
test! {
   let robj1 = Robj::from("xyz");
   assert_eq!(robj1.as_string_vector(), Some(vec!["xyz".to_string()]));
   let robj2 = Robj::from(1);
   assert_eq!(robj2.as_string_vector(), None);
}

pub fn as_str_vector(&self) -> Option<Vec<&str>>[src]

Get a vector of string references. String references (&str) are faster, but have short lifetimes.

use extendr_api::prelude::*;
test! {
   let robj1 = Robj::from("xyz");
   assert_eq!(robj1.as_str_vector(), Some(vec!["xyz"]));
   let robj2 = Robj::from(1);
   assert_eq!(robj2.as_str_vector(), None);
}

pub fn as_str<'a>(&self) -> Option<&'a str>[src]

Get a read-only reference to a scalar string type.

use extendr_api::prelude::*;
test! {
   let robj1 = Robj::from("xyz");
   let robj2 = Robj::from(1);
   assert_eq!(robj1.as_str(), Some("xyz"));
   assert_eq!(robj2.as_str(), None);
}

pub fn as_integer(&self) -> Option<i32>[src]

Get a scalar integer.

use extendr_api::prelude::*;
test! {
   let robj1 = Robj::from("xyz");
   let robj2 = Robj::from(1);
   let robj3 = Robj::from(NA_INTEGER);
   assert_eq!(robj1.as_integer(), None);
   assert_eq!(robj2.as_integer(), Some(1));
   assert_eq!(robj3.as_integer(), None);
}

pub fn as_real(&self) -> Option<f64>[src]

Get a scalar real.

use extendr_api::prelude::*;
test! {
   let robj1 = Robj::from(1);
   let robj2 = Robj::from(1.);
   let robj3 = Robj::from(NA_REAL);
   assert_eq!(robj1.as_real(), None);
   assert_eq!(robj2.as_real(), Some(1.));
   assert_eq!(robj3.as_real(), None);
}

pub fn as_bool(&self) -> Option<bool>[src]

Get a scalar rust boolean.

use extendr_api::prelude::*;
test! {
   let robj1 = Robj::from(TRUE);
   let robj2 = Robj::from(1.);
   let robj3 = Robj::from(NA_LOGICAL);
   assert_eq!(robj1.as_bool(), Some(true));
   assert_eq!(robj2.as_bool(), None);
   assert_eq!(robj3.as_bool(), None);
}

pub fn as_logical(&self) -> Option<Bool>[src]

Get a scalar boolean as a tri-boolean Bool value.

use extendr_api::prelude::*;
test! {
   let robj1 = Robj::from(TRUE);
   let robj2 = Robj::from([TRUE, FALSE]);
   let robj3 = Robj::from(NA_LOGICAL);
   assert_eq!(robj1.as_logical(), Some(TRUE));
   assert_eq!(robj2.as_logical(), None);
   assert_eq!(robj3.as_logical(), Some(NA_LOGICAL));
}

pub fn eval(&self) -> Result<Robj>[src]

Evaluate the expression in R and return an error or an R object.

use extendr_api::prelude::*;
test! {

   let add = lang!("+", 1, 2);
   assert_eq!(add.eval().unwrap(), r!(3));
}

pub fn eval_blind(&self) -> Robj[src]

Evaluate the expression and return NULL or an R object.

use extendr_api::prelude::*;
test! {
   let bad = lang!("imnotavalidfunctioninR", 1, 2);
   assert_eq!(bad.eval_blind(), r!(NULL));
}

pub fn is_owned(&self) -> bool[src]

Return true if the object is owned by this wrapper. If so, it will be released when the wrapper drops.

use extendr_api::prelude::*;
test! {
   let owned = r!(1);      // Allocated vector.
   let borrowed = r!(());  // R_NilValue
   assert_eq!(owned.is_owned(), true);
   assert_eq!(borrowed.is_owned(), false);
}

impl Robj[src]

These are helper functions which give access to common properties of R objects.

pub fn get_attrib<'a, N>(&self, name: N) -> Option<Robj> where
    Self: 'a,
    Robj: From<N> + 'a, 
[src]

Get a specific attribute as a borrowed robj if it exists.

use extendr_api::prelude::*;
test! {

   let mut robj = r!("hello");
   robj.set_attrib(Symbol("xyz"), 1);
   assert_eq!(robj.get_attrib(Symbol("xyz")), Some(r!(1)));
}

pub fn set_attrib<N, V>(&self, name: N, value: V) -> Result<Robj> where
    N: Into<Robj>,
    V: Into<Robj>, 
[src]

Set a specific attribute and return the object.

Note that some combinations of attributes are illegal and this will return an error.

use extendr_api::prelude::*;
test! {

   let mut robj = r!("hello").set_attrib(Symbol("xyz"), 1)?;
   assert_eq!(robj.get_attrib(Symbol("xyz")), Some(r!(1)));
}

pub fn names(&self) -> Option<StrIter>[src]

Get the names attribute as a string iterator if one exists.

use extendr_api::prelude::*;
test! {
   let list = list!(a = 1, b = 2, c = 3);
   let names : Vec<_> = list.names().unwrap().collect();
   assert_eq!(names, vec!["a", "b", "c"]);
}

pub fn set_names<T>(&self, names: T) -> Result<Robj> where
    T: IntoIterator,
    T::IntoIter: Iterator,
    T::Item: ToVectorValue + AsRef<str>, 
[src]

Set the names attribute from a string iterator.

Returns Error::NamesLengthMismatch if the length of the names does not match the length of the object.

use extendr_api::prelude::*;
test! {
    let mut obj = r!([1, 2, 3]).set_names(&["a", "b", "c"]).unwrap();
    assert_eq!(obj.names().unwrap().collect::<Vec<_>>(), vec!["a", "b", "c"]);
    assert_eq!(r!([1, 2, 3]).set_names(&["a", "b"]), Err(Error::NamesLengthMismatch));
}

pub fn dim(&self) -> Option<Int>[src]

Get the dim attribute as an integer iterator if one exists.

use extendr_api::prelude::*;
test! {

   let array = R!(array(data = c(1, 2, 3, 4), dim = c(2, 2), dimnames = list(c("x", "y"), c("a","b")))).unwrap();
   let dim : Vec<_> = array.dim().unwrap().collect();
   assert_eq!(dim, vec![2, 2]);
}

pub fn dimnames(&self) -> Option<ListIter>[src]

Get the dimnames attribute as a list iterator if one exists.

use extendr_api::prelude::*;
test! {
   let array = R!(array(data = c(1, 2, 3, 4), dim = c(2, 2), dimnames = list(c("x", "y"), c("a","b")))).unwrap();
   let names : Vec<_> = array.dimnames().unwrap().collect();
   assert_eq!(names, vec![r!(["x", "y"]), r!(["a", "b"])]);
}

pub fn as_named_list_iter(&self) -> Option<NamedListIter>[src]

Return an iterator over names and values of a list if they exist.

use extendr_api::prelude::*;
test! {
   let list = list!(a = 1, b = 2, c = 3);
   let names_and_values : Vec<_> = list.as_named_list_iter().unwrap().collect();
   assert_eq!(names_and_values, vec![("a", r!(1)), ("b", r!(2)), ("c", r!(3))]);
}

pub fn class(&self) -> Option<StrIter>[src]

Get the class attribute as a string iterator if one exists.

use extendr_api::prelude::*;
test! {
   let formula = R!(y ~ A * x + b).unwrap();
   let class : Vec<_> = formula.class().unwrap().collect();
   assert_eq!(class, ["formula"]);
}

pub fn set_class<T>(&self, class: T) -> Result<Robj> where
    T: IntoIterator,
    T::IntoIter: Iterator,
    T::Item: ToVectorValue + AsRef<str>, 
[src]

Set the class attribute from a string iterator.

May return an error for some class names.

use extendr_api::prelude::*;
test! {
    let mut obj = r!([1, 2, 3]).set_class(&["a", "b", "c"])?;
    assert_eq!(obj.class().unwrap().collect::<Vec<_>>(), vec!["a", "b", "c"]);
    assert_eq!(obj.inherits("a"), true);
}

pub fn inherits(&self, classname: &str) -> bool[src]

Return true if this class inherits this class.

use extendr_api::prelude::*;
test! {
   let formula = R!(y ~ A * x + b).unwrap();
   assert_eq!(formula.inherits("formula"), true);
}

pub fn levels(&self) -> Option<StrIter>[src]

Get the levels attribute as a string iterator if one exists.

use extendr_api::prelude::*;
test! {
   let factor = factor!(vec!["abcd", "def", "fg", "fg"]);
   let levels : Vec<_> = factor.levels().unwrap().collect();
   assert_eq!(levels, vec!["abcd", "def", "fg"]);
}

pub fn ls(&self) -> Option<Vec<&str>>[src]

Get the names in an environment.

use extendr_api::prelude::*;
test! {
   let names_and_values : std::collections::HashMap<_, _> = (0..4).map(|i| (format!("n{}", i), r!(i))).collect();
   let env = r!(Env{parent: global_env(), names_and_values});
   assert_eq!(env.ls().unwrap(), vec!["n0", "n1", "n2", "n3"]);
}

impl Robj[src]

pub fn as_symbol(&self) -> Option<Symbol<'_>>[src]

Convert a symbol object to a Symbol wrapper.

use extendr_api::prelude::*;
test! {
    let fred = sym!(fred);
    assert_eq!(fred.as_symbol(), Some(Symbol("fred")));
}

pub fn as_character(&self) -> Option<Character<'_>>[src]

Convert a character object to a Character wrapper.

use extendr_api::prelude::*;
test! {
    let fred = r!(Character("fred"));
    assert_eq!(fred.as_character(), Some(Character("fred")));
}

pub fn as_raw(&self) -> Option<Raw<'_>>[src]

Convert a raw object to a Character wrapper.

use extendr_api::prelude::*;
test! {
    let bytes = r!(Raw(&[1, 2, 3]));
    assert_eq!(bytes.len(), 3);
    assert_eq!(bytes.as_raw(), Some(Raw(&[1, 2, 3])));
}

pub fn as_lang(&self) -> Option<Lang<PairlistIter>>[src]

Convert a language object to a Lang wrapper.

use extendr_api::prelude::*;
test! {
    let call_to_xyz = r!(Lang(&[r!(Symbol("xyz")), r!(1), r!(2)]));
    assert_eq!(call_to_xyz.is_language(), true);
    assert_eq!(call_to_xyz.len(), 3);
    assert_eq!(format!("{:?}", call_to_xyz), r#"r!(Lang([sym!(xyz), r!(1), r!(2)]))"#);
}

pub fn as_pairlist(&self) -> Option<Pairlist<Vec<(&str, Robj)>>>[src]

Convert a pair list object (LISTSXP) to a Pairlist wrapper.

use extendr_api::prelude::*;
test! {
    let names_and_values = vec![("a", r!(1)), ("b", r!(2)), (na_str(), r!(3))];
    let pairlist = Pairlist{ names_and_values };
    let robj = r!(pairlist.clone());
    assert_eq!(robj.as_pairlist().unwrap(), pairlist);
}

pub fn as_list(&self) -> Option<List<ListIter>>[src]

Convert a list object (VECSXP) to a List wrapper.

use extendr_api::prelude::*;
test! {
    let list = r!(List(&[r!(0), r!(1), r!(2)]));
    assert_eq!(list.is_list(), true);
    assert_eq!(format!("{:?}", list), r#"r!(List([r!(0), r!(1), r!(2)]))"#);
}

pub fn as_expr(&self) -> Option<Expr<Vec<Robj>>>[src]

Convert an expression object (EXPRSXP) to a Expr wrapper.

use extendr_api::prelude::*;
test! {
    let expr = r!(Expr(&[r!(0), r!(1), r!(2)]));
    assert_eq!(expr.is_expr(), true);
    assert_eq!(expr.as_expr(), Some(Expr(vec![r!(0), r!(1), r!(2)])));
    assert_eq!(format!("{:?}", expr), r#"r!(Expr([r!(0), r!(1), r!(2)]))"#);
}

pub fn as_environment(&self) -> Option<Env<Robj, EnvIter>>[src]

Convert an environment object (ENVSXP) to a Env wrapper.

use extendr_api::prelude::*;
test! {
    let names_and_values = (0..100).map(|i| (format!("n{}", i), r!(i)));
    let env = Env{parent: global_env(), names_and_values};
    let expr = r!(env.clone());
    assert_eq!(expr.len(), 100);
    let env2 = expr.as_environment().unwrap();
    assert_eq!(env2.names_and_values.count(), 100);
}

pub fn as_func(&self) -> Option<Func<Robj, Robj, Robj>>[src]

Convert a function object (CLOSXP) to a Func wrapper.

use extendr_api::prelude::*;
test! {
    let func = R!(function(a,b) a + b).unwrap();
    println!("{:?}", func.as_func());
}

pub fn as_promise(&self) -> Option<Promise<Robj, Robj, Robj>>[src]

Get a wrapper for a promise.

Trait Implementations

impl<Rhs> Add<Rhs> for Robj where
    Rhs: Into<Robj>, 
[src]

type Output = Robj

The resulting type after applying the + operator.

fn add(self, rhs: Rhs) -> Self::Output[src]

Add two R objects, consuming the left hand side. panics on error.

use extendr_api::prelude::*;
test! {

// lhs and rhs get dropped here
let lhs = r!([1, 2]);
let rhs = r!([10, 20]);
assert_eq!(lhs + rhs, r!([11, 22]));

// lhs gets dropped and rhs is a temporary object.
let lhs = r!([1, 2]);
assert_eq!(lhs + 1000, r!([1001, 1002]));

// Only lhs gets dropped.
let lhs = r!([1, 2]);
let rhs = r!([10, 20]);
assert_eq!(lhs + &rhs, r!([11, 22]));
}

impl<'a> AsTypedSlice<'a, Bool> for Robj where
    Self: 'a, 
[src]

impl<'a> AsTypedSlice<'a, f64> for Robj where
    Self: 'a, 
[src]

impl<'a> AsTypedSlice<'a, i32> for Robj where
    Self: 'a, 
[src]

impl<'a> AsTypedSlice<'a, u8> for Robj where
    Self: 'a, 
[src]

impl Clone for Robj[src]

impl Debug for Robj[src]

Implement {:?} formatting.

impl Default for Robj[src]

impl<Rhs> Div<Rhs> for Robj where
    Rhs: Into<Robj>, 
[src]

type Output = Robj

The resulting type after applying the / operator.

fn div(self, rhs: Rhs) -> Self::Output[src]

Divide two R objects, consuming the left hand side. panics on error.

use extendr_api::prelude::*;
test! {

// lhs and rhs get dropped here
let lhs = r!([10.0, 20.0]);
let rhs = r!([1.0, 2.0]);
assert_eq!(lhs / rhs, r!([10.0, 10.0]));

// lhs gets dropped and rhs is a temporary object.
let lhs = r!([10.0, 30.0]);
assert_eq!(lhs / 10.0, r!([1.0, 3.0]));

// Only lhs gets dropped.
let lhs = r!([10.0, 20.0]);
let rhs = r!([1.0, 2.0]);
assert_eq!(lhs / &rhs, r!([10.0, 10.0]));
}

impl Drop for Robj[src]

Release any owned objects.

impl From<&'_ Robj> for Robj[src]

Convert an Robj reference into a borrowed Robj.

impl<'a, T> From<&'a [T]> for Robj where
    Self: 'a,
    T: 'a,
    &'a T: ToVectorValue
[src]

impl<'a, T> From<[T; 1]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 10]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 11]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 12]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 13]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 14]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 15]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 16]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 17]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 18]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 19]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 2]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 3]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 4]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 5]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 6]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 7]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 8]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a, T> From<[T; 9]> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl From<()> for Robj[src]

Convert a null to an Robj.

impl From<Arg> for Robj[src]

impl<'a> From<Character<'a>> for Robj[src]

Convert a wrapped string ref to an Robj char object.

impl<'a, P, NV> From<Env<P, NV>> for Robj where
    P: Into<Robj>,
    NV: IntoIterator + 'a,
    NV::Item: SymPair
[src]

fn from(val: Env<P, NV>) -> Self[src]

Convert a wrapper to an R environment object.

use extendr_api::prelude::*;
test! {
    let names_and_values = (0..100).map(|i| (format!("n{}", i), i));
    let env = Env{parent: global_env(), names_and_values};
    let expr = r!(env);
    assert_eq!(expr.len(), 100);
}

impl<T> From<Expr<T>> for Robj where
    T: IntoIterator,
    T::IntoIter: ExactSizeIterator,
    T::Item: Into<Robj>, 
[src]

fn from(val: Expr<T>) -> Self[src]

Make an expression object from an iterator of Robjs.

use extendr_api::prelude::*;
test! {
    let list_of_ints = r!(Expr(&[1, 2]));
    assert_eq!(list_of_ints.len(), 2);
}

impl From<Func> for Robj[src]

impl<'a> From<HashMap<&'a str, Robj, RandomState>> for Robj[src]

fn from(val: HashMap<&'a str, Robj>) -> Self[src]

Convert a hashmap into a list.

impl From<Impl> for Robj[src]

impl<T> From<Lang<T>> for Robj where
    T: IntoIterator,
    T::IntoIter: DoubleEndedIterator,
    T::Item: Into<Robj>, 
[src]

fn from(val: Lang<T>) -> Self[src]

Convert a wrapper to an R language object.

impl<T> From<List<T>> for Robj where
    T: IntoIterator,
    T::IntoIter: ExactSizeIterator,
    T::Item: Into<Robj>, 
[src]

fn from(val: List<T>) -> Self[src]

Make a list object from an iterator of Robjs.

use extendr_api::prelude::*;
test! {
    let list_of_ints = r!(List(&[1, 2]));
    assert_eq!(list_of_ints.len(), 2);
}

impl From<Metadata> for Robj[src]

impl<T> From<Nullable<T>> for Robj where
    T: Into<Robj>, 
[src]

fn from(val: Nullable<T>) -> Self[src]

Convert a rust object to NULL or another type.

use extendr_api::prelude::*;
test! {
    assert_eq!(r!(Nullable::<i32>::Null), r!(NULL));
    assert_eq!(r!(Nullable::<i32>::NotNull(1)), r!(1));
}

impl<'a, NV> From<Pairlist<NV>> for Robj where
    NV: IntoIterator + 'a,
    NV::Item: SymPair
[src]

fn from(val: Pairlist<NV>) -> Self[src]

Convert a wrapper to a LISTSXP object.

use extendr_api::prelude::*;
test! {
    let names_and_values = (0..100).map(|i| (format!("n{}", i), i));
    let expr = r!(Pairlist{names_and_values});
    assert_eq!(expr.len(), 100);
}

impl<'a> From<Primitive<'a>> for Robj[src]

fn from(name: Primitive<'_>) -> Self[src]

Make a primitive object, or NULL if not available.

use extendr_api::prelude::*;
test! {
    let builtin = r!(Primitive("+"));
    let special = r!(Primitive("if"));
}

impl<T> From<RArray<T, [usize; 1]>> for Robj where
    T: Into<Robj>, 
[src]

impl<T> From<RArray<T, [usize; 2]>> for Robj where
    T: Into<Robj>, 
[src]

impl<T> From<RArray<T, [usize; 3]>> for Robj where
    T: Into<Robj>, 
[src]

impl<T> From<Range<T>> for Robj where
    Range<T>: RobjItertools,
    <Range<T> as Iterator>::Item: ToVectorValue,
    T: ToVectorValue
[src]

impl<T> From<RangeInclusive<T>> for Robj where
    RangeInclusive<T>: RobjItertools,
    <RangeInclusive<T> as Iterator>::Item: ToVectorValue,
    T: ToVectorValue
[src]

impl<'a> From<Raw<'a>> for Robj[src]

fn from(val: Raw<'a>) -> Self[src]

Make a raw object from bytes.

impl<T> From<Result<T, Error>> for Robj where
    T: Into<Robj>, 
[src]

Convert a Result to an Robj. This is used to allow functions to use the ? operator and return Result.

Panics if there is an error.

use extendr_api::prelude::*;
fn my_func() -> Result<f64> {
    Ok(1.0)
}

test! {
    assert_eq!(r!(my_func()), r!(1.0));
}

impl From<SliceIter<Bool>> for Robj[src]

fn from(val: Logical) -> Self[src]

Convert a logical iterator into a vector.

impl From<SliceIter<f64>> for Robj[src]

fn from(val: Real) -> Self[src]

Convert a real iterator into a vector.

impl From<SliceIter<i32>> for Robj[src]

fn from(val: Int) -> Self[src]

Convert an integer iterator into a vector.

impl<'a> From<Symbol<'a>> for Robj[src]

fn from(name: Symbol<'_>) -> Self[src]

Make a symbol object.

impl<T> From<T> for Robj where
    T: ToVectorValue
[src]

impl<'a> From<Vec<Robj, Global>> for Robj[src]

fn from(val: Vec<Robj>) -> Self[src]

Convert a vector of Robj into a list.

impl<'a, T> From<Vec<T, Global>> for Robj where
    Self: 'a,
    T: Clone + 'a,
    T: ToVectorValue
[src]

impl<'a> FromRobj<'a> for Robj[src]

Pass-through Robj conversion, essentially a clone.

impl<Rhs> Mul<Rhs> for Robj where
    Rhs: Into<Robj>, 
[src]

type Output = Robj

The resulting type after applying the * operator.

fn mul(self, rhs: Rhs) -> Self::Output[src]

Multiply two R objects, consuming the left hand side. panics on error.

use extendr_api::prelude::*;
test! {

// lhs and rhs get dropped here
let lhs = r!([10.0, 20.0]);
let rhs = r!([1.0, 2.0]);
assert_eq!(lhs * rhs, r!([10.0, 40.0]));

// lhs gets dropped and rhs is a temporary object.
let lhs = r!([1.0, 2.0]);
assert_eq!(lhs * 10.0, r!([10.0, 20.0]));

// Only lhs gets dropped.
let lhs = r!([10.0, 20.0]);
let rhs = r!([1.0, 2.0]);
assert_eq!(lhs * &rhs, r!([10.0, 40.0]));
}

impl<'a> PartialEq<[f64]> for Robj[src]

Compare equality with slices of double.

impl<'a> PartialEq<[i32]> for Robj[src]

Compare equality with integer slices.

impl PartialEq<Robj> for Robj[src]

Compare equality with two Robjs.

impl PartialEq<str> for Robj[src]

Compare equality with strings.

impl<Rhs> Sub<Rhs> for Robj where
    Rhs: Into<Robj>, 
[src]

type Output = Robj

The resulting type after applying the - operator.

fn sub(self, rhs: Rhs) -> Self::Output[src]

Subtract two R objects, consuming the left hand side. panics on error.

use extendr_api::prelude::*;
test! {

// lhs and rhs get dropped here
let lhs = r!([10, 20]);
let rhs = r!([1, 2]);
assert_eq!(lhs - rhs, r!([9, 18]));

// lhs gets dropped and rhs is a temporary object.
let lhs = r!([1000, 2000]);
assert_eq!(lhs - 1, r!([999, 1999]));

// Only lhs gets dropped.
let lhs = r!([10, 20]);
let rhs = r!([1, 2]);
assert_eq!(lhs - &rhs, r!([9, 18]));
}

Auto Trait Implementations

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.