pub struct Function {
pub(crate) robj: Robj,
}
Expand description
Wrapper for creating functions (CLOSSXP).
use extendr_api::prelude::*;
test! {
// Closures are functions.
let expr = R!("function(a = 1, b) {c <- a + b}")?;
let func = expr.as_function().unwrap();
let expected_formals = Pairlist::from_pairs(vec![("a", r!(1.0)), ("b", missing_arg().into())]);
let expected_body = lang!(
"{", lang!("<-", sym!(c), lang!("+", sym!(a), sym!(b))));
assert_eq!(func.formals().unwrap(), expected_formals);
assert_eq!(func.body().unwrap(), expected_body);
assert_eq!(func.environment().unwrap(), global_env());
// Primitives can also be functions.
let expr = R!("`~`")?;
let func = expr.as_function().unwrap();
assert_eq!(func.formals(), None);
assert_eq!(func.body(), None);
assert_eq!(func.environment(), None);
}
Fields§
§robj: Robj
Implementations§
Source§impl Function
impl Function
Sourcepub fn call(&self, args: Pairlist) -> Result<Robj>
pub fn call(&self, args: Pairlist) -> Result<Robj>
Do the equivalent of x(a, b, c)
use extendr_api::prelude::*;
test! {
let function = R!("function(a, b) a + b").unwrap().as_function().unwrap();
assert_eq!(function.call(pairlist!(a=1, b=2)).unwrap(), r!(3));
}
Sourcepub fn formals(&self) -> Option<Pairlist>
pub fn formals(&self) -> Option<Pairlist>
Get the formal arguments of the function or None if it is a primitive.
Sourcepub fn environment(&self) -> Option<Environment>
pub fn environment(&self) -> Option<Environment>
Get the environment of the function or None if it is a primitive.
Trait Implementations§
Source§impl Conversions for Function
impl Conversions for Function
as_*()
Source§fn as_language(&self) -> Option<Language>
fn as_language(&self) -> Option<Language>
Convert a language object to a Language wrapper. Read more
Source§fn as_pairlist(&self) -> Option<Pairlist>
fn as_pairlist(&self) -> Option<Pairlist>
Convert a pair list object (LISTSXP) to a Pairlist wrapper. Read more
Source§fn as_expressions(&self) -> Option<Expressions>
fn as_expressions(&self) -> Option<Expressions>
Convert an expression object (EXPRSXP) to a Expr wrapper. Read more
Source§fn as_environment(&self) -> Option<Environment>
fn as_environment(&self) -> Option<Environment>
Convert an environment object (ENVSXP) to a Env wrapper. Read more
Source§fn as_function(&self) -> Option<Function>
fn as_function(&self) -> Option<Function>
Convert a function object (CLOSXP) to a Function wrapper. Read more
Source§fn as_promise(&self) -> Option<Promise>
fn as_promise(&self) -> Option<Promise>
Get a wrapper for a promise.
Source§impl Operators for Function
impl Operators for Function
dollar() etc.
Source§impl Rinternals for Function
impl Rinternals for Function
find_var() etc.
Source§fn is_logical(&self) -> bool
fn is_logical(&self) -> bool
Return true if this is a boolean (logical) vector
Source§fn is_complex(&self) -> bool
fn is_complex(&self) -> bool
Return true if this is a complex vector.
Source§fn is_expressions(&self) -> bool
fn is_expressions(&self) -> bool
Return true if this is an expression.
Source§fn is_environment(&self) -> bool
fn is_environment(&self) -> bool
Return true if this is an environment.
Source§fn is_promise(&self) -> bool
fn is_promise(&self) -> bool
Return true if this is an environment.
Source§fn is_external_pointer(&self) -> bool
fn is_external_pointer(&self) -> bool
Return true if this is an expression.
Source§fn get_current_srcref(val: i32) -> Robj
fn get_current_srcref(val: i32) -> Robj
Get the source ref.
Source§fn get_src_filename(&self) -> Robj
fn get_src_filename(&self) -> Robj
Get the source filename.
Source§fn as_character_vector(&self) -> Robj
fn as_character_vector(&self) -> Robj
Convert to a string vector.
Source§fn coerce_vector(&self, sexptype: SEXPTYPE) -> Robj
fn coerce_vector(&self, sexptype: SEXPTYPE) -> Robj
Convert to vectors of many kinds.
Source§fn pair_to_vector_list(&self) -> Robj
fn pair_to_vector_list(&self) -> Robj
Convert a pairlist (LISTSXP) to a vector list (VECSXP).
Source§fn vector_to_pair_list(&self) -> Robj
fn vector_to_pair_list(&self) -> Robj
Convert a vector list (VECSXP) to a pair list (LISTSXP)
Source§fn as_character_factor(&self) -> Robj
fn as_character_factor(&self) -> Robj
Convert a factor to a string vector.
Source§fn duplicate(&self) -> Robj
fn duplicate(&self) -> Robj
Do a deep copy of this object.
Note that clone() only adds a reference.
Source§fn find_function<K: TryInto<Symbol, Error = Error>>(
&self,
key: K,
) -> Result<Robj>
fn find_function<K: TryInto<Symbol, Error = Error>>( &self, key: K, ) -> Result<Robj>
Find a function in an environment ignoring other variables. Read more
Source§fn find_var<K: TryInto<Symbol, Error = Error>>(&self, key: K) -> Result<Robj>
fn find_var<K: TryInto<Symbol, Error = Error>>(&self, key: K) -> Result<Robj>
Find a variable in an environment. Read more
Source§fn xlengthgets(&self, new_len: usize) -> Result<Robj>
fn xlengthgets(&self, new_len: usize) -> Result<Robj>
Copy a vector and resize it.
See. https://github.com/hadley/r-internals/blob/master/vectors.md
Source§fn alloc_vector(sexptype: SEXPTYPE, len: usize) -> Robj
fn alloc_vector(sexptype: SEXPTYPE, len: usize) -> Robj
Allocated an owned object of a certain type.
Source§fn is_function(&self) -> bool
fn is_function(&self) -> bool
Return true if this is a function or a primitive (CLOSXP, BUILTINSXP or SPECIALSXP)
Source§fn is_integer(&self) -> bool
fn is_integer(&self) -> bool
Return true if this is an integer vector (INTSXP) but not a factor.
Source§fn is_language(&self) -> bool
fn is_language(&self) -> bool
Return true if this is a language object (LANGSXP).
Source§fn is_pairlist(&self) -> bool
fn is_pairlist(&self) -> bool
Return true if this is NILSXP or LISTSXP.
Source§fn is_number(&self) -> bool
fn is_number(&self) -> bool
Return true if this is INTSXP, LGLSXP or REALSXP but not a factor.
Source§fn is_primitive(&self) -> bool
fn is_primitive(&self) -> bool
Return true if this is a primitive function BUILTINSXP, SPECIALSXP.
Source§fn is_user_binop(&self) -> bool
fn is_user_binop(&self) -> bool
Return true if this is a user defined binop.
Source§fn is_vector_atomic(&self) -> bool
fn is_vector_atomic(&self) -> bool
Return true if this is an atomic vector.
Source§fn is_vector_list(&self) -> bool
fn is_vector_list(&self) -> bool
Return true if this is a vector list.
Source§fn is_vectorizable(&self) -> bool
fn is_vectorizable(&self) -> bool
Return true if this is can be made into a vector.
fn is_missing_arg(&self) -> bool
fn is_unbound_value(&self) -> bool
fn is_package_env(&self) -> bool
fn package_env_name(&self) -> Robj
fn is_namespace_env(&self) -> bool
fn namespace_env_spec(&self) -> Robj
Source§fn is_altinteger(&self) -> bool
fn is_altinteger(&self) -> bool
Returns
true
if this is an integer ALTREP object.Source§fn is_altreal(&self) -> bool
fn is_altreal(&self) -> bool
Returns
true
if this is an real ALTREP object.Source§fn is_altlogical(&self) -> bool
fn is_altlogical(&self) -> bool
Returns
true
if this is an logical ALTREP object.Source§fn is_altstring(&self) -> bool
fn is_altstring(&self) -> bool
Returns
true
if this is an integer ALTREP object.Source§fn is_altlist(&self) -> bool
fn is_altlist(&self) -> bool
Returns
true
if this is an integer ALTREP object.Source§impl Slices for Function
impl Slices for Function
as_typed_slice_raw() etc.
Source§unsafe fn as_typed_slice_raw<T>(&self) -> &[T]
unsafe fn as_typed_slice_raw<T>(&self) -> &[T]
Get an immutable slice to this object’s data. Read more
Source§unsafe fn as_typed_slice_raw_mut<T>(&mut self) -> &mut [T]
unsafe fn as_typed_slice_raw_mut<T>(&mut self) -> &mut [T]
Get a mutable slice to this object’s data. Read more
impl StructuralPartialEq for Function
Auto Trait Implementations§
impl Freeze for Function
impl RefUnwindSafe for Function
impl !Send for Function
impl !Sync for Function
impl Unpin for Function
impl UnwindSafe for Function
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
🔬This is a nightly-only experimental API. (
clone_to_uninit
)Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more