pub struct DataFrame {
sexp: SEXP,
}Expand description
An owned, validated R data.frame. The data-frame type.
Wraps a built VECSXP carrying the data.frame class + row.names. A single coherent
type for building (Rust → R), reading (R → Rust), and post-assembly editing — replacing
the historical row-buffer / built-SEXP / read-wrapper trio with one coherent type.
§Building
Prefer the IntoDataFrame trait on your data:
let df: DataFrame = rows.into_dataframe()?;or the closure-fill DataFrame::builder for heterogeneous parallel column fill
(feature = "rayon").
§Reading
Wrap an incoming SEXP with DataFrame::from_sexp (or accept DataFrame directly as a
#[miniextendr] argument), then pull typed columns with DataFrame::column, or
deserialize whole rows with FromDataFrame.
Fields§
§sexp: SEXPImplementations§
Source§impl DataFrame
impl DataFrame
Sourcepub fn group_by(&self, col: &str) -> Result<GroupedDataFrame, DataFrameError>
pub fn group_by(&self, col: &str) -> Result<GroupedDataFrame, DataFrameError>
Partition this frame’s rows by the values of the named column.
Computes group indices in a single pass on the main thread. Supported
key columns: factor (fast path — levels are the keys, level order kept,
empty levels included), character, integer, and logical. Double columns
error — cut() or factor() the column in R first.
NA keys form one group, ordered last (unlike R split(), which drops
NA-keyed rows). See the module docs for the full key semantics.
Source§impl DataFrame
impl DataFrame
Sourcepub unsafe fn from_built_sexp(sexp: SEXP) -> Self
pub unsafe fn from_built_sexp(sexp: SEXP) -> Self
Wrap an already-built data.frame SEXP without re-validation.
Used by the column assemblers, which produce a well-formed data.frame by
construction.
§Safety
sexp must be a VECSXP with the data.frame class and consistent row.names.
Sourcepub fn from_sexp(sexp: SEXP) -> Result<Self, DataFrameError>
pub fn from_sexp(sexp: SEXP) -> Result<Self, DataFrameError>
Wrap an existing R data.frame SEXP, validating it.
Validates that the object:
- Is a VECSXP (list)
- Inherits from
"data.frame" - Has a
namesattribute - Has extractable
row.namesfor nrow
§Errors
Returns DataFrameError if validation fails.
Sourcepub fn column<T>(&self, name: &str) -> Option<T>where
T: TryFromSexp<Error = SexpError>,
pub fn column<T>(&self, name: &str) -> Option<T>where
T: TryFromSexp<Error = SexpError>,
Get a column by name, converting each element to type T.
Returns None if the column name is not found or conversion fails.
Sourcepub fn column_index<T>(&self, idx: usize) -> Option<T>where
T: TryFromSexp<Error = SexpError>,
pub fn column_index<T>(&self, idx: usize) -> Option<T>where
T: TryFromSexp<Error = SexpError>,
Get a column by 0-based index, converting to type T.
Sourcepub fn column_raw(&self, name: &str) -> Option<SEXP>
pub fn column_raw(&self, name: &str) -> Option<SEXP>
Get the raw SEXP for a column by name.
Sourcepub fn contains_column(&self, name: &str) -> bool
pub fn contains_column(&self, name: &str) -> bool
Check whether a column name exists.
Sourcepub fn validate(
&self,
spec: &TypedListSpec,
) -> Result<TypedList, TypedListError>
pub fn validate( &self, spec: &TypedListSpec, ) -> Result<TypedList, TypedListError>
Validate the data frame’s column types against a TypedListSpec.
Sourcefn named_list(&self) -> NamedList
fn named_list(&self) -> NamedList
Build the NamedList index for O(1) column-by-name access.
Sourcepub fn rename(self, from: &str, to: &str) -> Self
pub fn rename(self, from: &str, to: &str) -> Self
Rename a column. No-op if from doesn’t match any column name.
Sourcepub fn strip_prefix(self, prefix: &str) -> Self
pub fn strip_prefix(self, prefix: &str) -> Self
Strip a prefix from all column names that start with it.
Sourcepub fn drop(self, col: &str) -> Self
pub fn drop(self, col: &str) -> Self
Remove a column by name. No-op if the column doesn’t exist.
Sourcepub fn select(self, cols: &[&str]) -> Self
pub fn select(self, cols: &[&str]) -> Self
Keep only the named columns, in the order given. Unknown names are skipped.
Sourcepub fn select_rows(&self, idx: &[usize]) -> Self
pub fn select_rows(&self, idx: &[usize]) -> Self
Keep only the rows at the given 0-based indices, in order.
Subsets every column (each a vector or list-column) to the specified rows
and rebuilds compact integer row.names. Used by the enum reader to
densify a flattened sub-frame before recursing into the inner type’s reader.
§PROTECT discipline
Allocates one new column vector per column — OwnedProtects the output list
across the loop so previously-built column SEXPs survive subsequent allocations.
Sourcepub fn prepend_column(self, name: &str, column: SEXP) -> Self
pub fn prepend_column(self, name: &str, column: SEXP) -> Self
Insert a column at index 0 (leftmost), removing any same-named column first.
Sourcepub fn with_column(self, name: &str, column: SEXP) -> Self
pub fn with_column(self, name: &str, column: SEXP) -> Self
Upsert a column: replace the column named name if it exists, else append.
Sourcepub fn builder(nrow: usize) -> RDataFrameBuilder
pub fn builder(nrow: usize) -> RDataFrameBuilder
Start a closure-per-column builder yielding a DataFrame.
The heterogeneous-column analogue of with_r_matrix: each column buffer is R memory
filled by a per-column closure. Available regardless of the rayon feature (#1055);
the columns are filled in parallel when rayon is enabled and serially
otherwise — the resulting data.frame is identical either way.
let df = DataFrame::builder(1000)
.column::<f64>("x", |chunk, off| for (i, v) in chunk.iter_mut().enumerate() { *v = (off + i) as f64 })
.column_str("label", |i| Some(format!("row{i}")))
.build();Trait Implementations§
impl Copy for DataFrame
Source§impl IntoR for DataFrame
impl IntoR for DataFrame
Source§type Error = Infallible
type Error = Infallible
Source§fn try_into_sexp(self) -> Result<SEXP, Self::Error>
fn try_into_sexp(self) -> Result<SEXP, Self::Error>
impl TrivialClone for DataFrame
Auto Trait Implementations§
impl Freeze for DataFrame
impl RefUnwindSafe for DataFrame
impl Send for DataFrame
impl Sync for DataFrame
impl Unpin for DataFrame
impl UnsafeUnpin for DataFrame
impl UnwindSafe for DataFrame
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> Printable for T
Source§impl<T> SizeHint for Twhere
T: ?Sized,
impl<T> SizeHint for Twhere
T: ?Sized,
Source§default fn lower_bound(&self) -> usize
default fn lower_bound(&self) -> usize
core_io_internals)[u8; 12] could return any value between 0 and
12 inclusively as a correct implementation. Read moreSource§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 moreLayout§
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: 8 bytes