Skip to main content

RCall

Struct RCall 

Source
pub struct RCall {
    fun: SEXP,
    args: Vec<(Option<CString>, SEXP)>,
}
Expand description

Builder for constructing and evaluating R function calls.

RCall constructs a LANGSXP (R language object) from a function name or SEXP and a sequence of arguments (optionally named). It handles GC protection during construction and evaluation.

§Example

use miniextendr_api::expression::RCall;
use miniextendr_api::sys;

unsafe {
    // seq_len(10)
    let result = RCall::new("seq_len")
        .arg(SEXP::scalar_integer(10))
        .eval_base()?;

    // paste(x, collapse = ", ")
    let result = RCall::new("paste")
        .arg(some_sexp)
        .named_arg("collapse", sys::Rf_mkString(c", ".as_ptr()))
        .eval_base()?;
}

Fields§

§fun: SEXP

Function symbol or SEXP.

§args: Vec<(Option<CString>, SEXP)>

Arguments as (optional_name, value) pairs.

Implementations§

Source§

impl RCall

Source

pub unsafe fn new(fun_name: &str) -> Self

Start building a call to a named R function.

The function is looked up via Rf_install, which returns an interned symbol.

§Safety

Must be called from the R main thread.

§Panics

Panics if fun_name contains a null byte.

Source

pub unsafe fn from_cstr(fun_name: &CStr) -> Self

Start building a call to a function given as a C string literal.

More efficient than new when a &CStr is available.

§Safety

Must be called from the R main thread.

Source

pub unsafe fn from_sexp(fun: SEXP) -> Self

Start building a call with a function SEXP (closure, builtin, etc.).

§Safety

fun must be a valid SEXP representing a callable R object.

Source

pub fn arg(self, value: SEXP) -> Self

Add a positional argument.

Source

pub fn named_arg(self, name: &str, value: SEXP) -> Self

Add a named argument.

§Panics

Panics if name contains a null byte.

Source

pub unsafe fn build(&self) -> SEXP

Build the LANGSXP without evaluating it.

The returned SEXP is unprotected. The caller must protect it if further allocations will occur before use.

§Safety

Must be called from the R main thread. All argument SEXPs must still be valid (protected or otherwise reachable by R’s GC).

Source

pub unsafe fn eval(&self, env: SEXP) -> Result<SEXP, String>

Evaluate the call in the given environment.

Uses R_tryEvalSilent so that R errors are captured as Err(String) rather than causing a longjmp through Rust frames.

§Safety
  • Must be called from the R main thread.
  • env must be a valid ENVSXP.
  • All argument SEXPs must still be valid.
§Returns
  • Ok(SEXP) with the result (unprotected — caller should protect if needed)
  • Err(String) with the R error message on failure
Source

pub unsafe fn eval_base(&self) -> Result<SEXP, String>

Evaluate in R_BaseEnv.

§Safety

Same as eval.

Source

pub unsafe fn namespaced(pkg: &str, fun_name: &str) -> Result<Self, String>

Start building a namespaced call: pkg::fun(args…).

Looks up pkg::fun_name in the base environment and uses the resolved function closure as the call target. This respects R’s namespace lookup rules (exported + non-exported via :: / :::).

This is the runtime counterpart of the lowered pkg::fn(args…) form in r!(pkg::fn(args…)).

§Safety

Must be called from the R main thread.

§Panics

Panics if pkg or fun_name contain a null byte.

§Errors

Returns Err(String) if the namespace lookup fails (package not loaded or function not found).

Auto Trait Implementations§

§

impl Freeze for RCall

§

impl RefUnwindSafe for RCall

§

impl Send for RCall

§

impl Sync for RCall

§

impl Unpin for RCall

§

impl UnsafeUnpin for RCall

§

impl UnwindSafe for RCall

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> SizeHint for T
where T: ?Sized,

Source§

default fn lower_bound(&self) -> usize

🔬This is a nightly-only experimental API. (core_io_internals)
Returns a lower bound on the number of elements this container-like item contains. For example, an array [u8; 12] could return any value between 0 and 12 inclusively as a correct implementation. Read more
Source§

default fn upper_bound(&self) -> Option<usize>

🔬This is a nightly-only experimental API. (core_io_internals)
Returns an upper bound on the number of elements this container-like item contains if it can be determined, otherwise None. Read more
Source§

final fn size_hint(&self) -> (usize, Option<usize>)

🔬This is a nightly-only experimental API. (core_io_internals)
Returns an estimate for the number of elements this container like type contains. Read more
Source§

impl<T> SizedTypeProperties for T

Source§

#[doc(hidden)]
const SIZE: usize = _

🔬This is a nightly-only experimental API. (sized_type_properties)
Source§

#[doc(hidden)]
const ALIGN: usize = _

🔬This is a nightly-only experimental API. (sized_type_properties)
Source§

#[doc(hidden)]
const ALIGNMENT: Alignment = _

🔬This is a nightly-only experimental API. (ptr_alignment_type)
Source§

#[doc(hidden)]
const IS_ZST: bool = _

🔬This is a nightly-only experimental API. (sized_type_properties)
true if this type requires no storage. false if its size is greater than zero. Read more
Source§

#[doc(hidden)]
const LAYOUT: Layout = _

🔬This is a nightly-only experimental API. (sized_type_properties)
Source§

#[doc(hidden)]
const MAX_SLICE_LEN: usize = _

🔬This is a nightly-only experimental API. (sized_type_properties)
The largest safe length for a [Self]. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 32 bytes