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::ffi;
unsafe {
// seq_len(10)
let result = RCall::new("seq_len")
.arg(ffi::SEXP::scalar_integer(10))
.eval_base()?;
// paste(x, collapse = ", ")
let result = RCall::new("paste")
.arg(some_sexp)
.named_arg("collapse", ffi::Rf_mkString(c", ".as_ptr()))
.eval_base()?;
}Fields§
§fun: SEXPFunction symbol or SEXP.
args: Vec<(Option<CString>, SEXP)>Arguments as (optional_name, value) pairs.
Implementations§
Source§impl RCall
impl RCall
Sourcepub unsafe fn from_sexp(fun: SEXP) -> Self
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.
Sourcepub unsafe fn build(&self) -> SEXP
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).
Sourcepub unsafe fn eval(&self, env: SEXP) -> Result<SEXP, String>
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.
envmust 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
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> 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
Source§impl<T> SizeEq<MaybeUninit<T>> for T
impl<T> SizeEq<MaybeUninit<T>> for T
type CastFrom = CastSizedExact
Source§impl<T> SizedTypeProperties for T
impl<T> SizedTypeProperties for T
Source§#[doc(hidden)]const SIZE: usize = _
#[doc(hidden)]const SIZE: usize = _
sized_type_properties)Source§#[doc(hidden)]const ALIGN: usize = _
#[doc(hidden)]const ALIGN: usize = _
sized_type_properties)Source§#[doc(hidden)]const ALIGNMENT: Alignment = _
#[doc(hidden)]const ALIGNMENT: Alignment = _
ptr_alignment_type)Source§#[doc(hidden)]const IS_ZST: bool = _
#[doc(hidden)]const IS_ZST: bool = _
sized_type_properties)Source§#[doc(hidden)]const LAYOUT: Layout = _
#[doc(hidden)]const LAYOUT: Layout = _
sized_type_properties)Source§#[doc(hidden)]const MAX_SLICE_LEN: usize = _
#[doc(hidden)]const MAX_SLICE_LEN: usize = _
sized_type_properties)[Self]. Read moreimpl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> InvariantsEq<ManuallyDrop<T>> for Twhere
T: ?Sized,
impl<T> InvariantsEq<T> for Twhere
T: ?Sized,
impl<T> InvariantsEq<Unalign<T>> for T
impl<T> InvariantsEq<Wrapping<T>> for T
impl<Src, Dst, A, SV, DV, R> MutationCompatible<Src, A, SV, DV, (BecauseRead, R)> for Dst
impl<Src, Dst, A, SV, DV> MutationCompatible<Src, A, SV, DV, BecauseInvariantsEq> for Dstwhere
A: Aliasing,
SV: Validity,
DV: Validity,
Src: TransmuteFrom<Dst, DV, SV> + ?Sized,
Dst: TransmuteFrom<Src, SV, DV> + InvariantsEq<Src> + ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> TransmuteFrom<Cell<T>, Valid, Valid> for Twhere
T: ?Sized,
impl<T> TransmuteFrom<ManuallyDrop<T>, Valid, Valid> for Twhere
T: ?Sized,
impl<T> TransmuteFrom<ReadOnly<T>, Valid, Valid> for Twhere
T: ?Sized,
impl<Src, Dst> TransmuteFrom<Src, Initialized, Initialized> for Dst
impl<Src, Dst, V> TransmuteFrom<Src, V, Uninit> for Dst
impl<Src, Dst> TransmuteFrom<Src, Valid, Initialized> for Dst
impl<T> TransmuteFrom<Unalign<T>, Valid, Valid> for T
impl<T> TransmuteFrom<UnsafeCell<T>, Valid, Valid> for Twhere
T: ?Sized,
impl<T> TransmuteFrom<Wrapping<T>, Valid, Valid> for T
impl<Src, Dst, A, SV, DV, C, R> TransmuteFromPtr<Src, A, SV, DV, C, R> for Dstwhere
A: Aliasing,
SV: Validity,
DV: Validity,
C: CastExact<Src, Dst>,
Dst: TransmuteFrom<Src, SV, DV> + TryTransmuteFromPtr<Src, A, SV, DV, C, R> + ?Sized,
Src: ?Sized,
impl<Src, Dst, SV, DV, A, C, R> TryTransmuteFromPtr<Src, A, SV, DV, C, (BecauseMutationCompatible, R)> for Dstwhere
A: Aliasing,
SV: Validity,
DV: Validity,
Src: TransmuteFrom<Dst, DV, SV> + ?Sized,
Dst: MutationCompatible<Src, A, SV, DV, R> + ?Sized,
C: CastExact<Src, Dst>,
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