diff --git a/DESCRIPTION b/DESCRIPTION index 1c8d61c25..522172062 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -97,5 +97,5 @@ Collate: 'translation.R' 'vctrs.R' 'zzz.R' -Config/rextendr/version: 0.3.1 +Config/rextendr/version: 0.3.1.9000 VignetteBuilder: knitr diff --git a/R/extendr-wrappers.R b/R/extendr-wrappers.R index bf7c0336f..20557dbda 100644 --- a/R/extendr-wrappers.R +++ b/R/extendr-wrappers.R @@ -33,8 +33,6 @@ coalesce_exprs <- function(exprs) .Call(wrap__coalesce_exprs, exprs) sum_exprs <- function(exprs) .Call(wrap__sum_exprs, exprs) -mem_address <- function(robj) .Call(wrap__mem_address, robj) - concat_list <- function(exprs) .Call(wrap__concat_list, exprs) r_date_range <- function(start, stop, every, closed, name, tu, tz) .Call(wrap__r_date_range, start, stop, every, closed, name, tu, tz) @@ -51,6 +49,10 @@ arrow_stream_to_rust <- function(rbr) invisible(.Call(wrap__arrow_stream_to_rust dtype_str_repr <- function(dtype) .Call(wrap__dtype_str_repr, dtype) +mem_address <- function(robj) .Call(wrap__mem_address, robj) + +clone_robj <- function(robj) .Call(wrap__clone_robj, robj) + test_robj_to_usize <- function(robj) .Call(wrap__test_robj_to_usize, robj) test_robj_to_i64 <- function(robj) .Call(wrap__test_robj_to_i64, robj) diff --git a/man/nanoarrow.Rd b/man/nanoarrow.Rd index 7af2018a2..3ecaf02a4 100644 --- a/man/nanoarrow.Rd +++ b/man/nanoarrow.Rd @@ -16,13 +16,13 @@ \alias{as_record_batch_reader.DataFrame} \title{polars to nanoarrow and arrow} \usage{ -as_nanoarrow_array_stream.DataFrame(x, ..., schema = NULL) +\method{as_nanoarrow_array_stream}{DataFrame}(x, ..., schema = NULL) -infer_nanoarrow_schema.DataFrame(x, ...) +\method{infer_nanoarrow_schema}{DataFrame}(x, ...) -as_arrow_table.DataFrame(x, ...) +\method{as_arrow_table}{DataFrame}(x, ...) -as_record_batch_reader.DataFrame(x, ..., schema = NULL) +\method{as_record_batch_reader}{DataFrame}(x, ..., schema = NULL) } \arguments{ \item{x}{a polars DataFrame} diff --git a/src/rust/src/rlib.rs b/src/rust/src/rlib.rs index 40e81102c..ebd9a1b1a 100644 --- a/src/rust/src/rlib.rs +++ b/src/rust/src/rlib.rs @@ -56,13 +56,6 @@ pub fn hor_concat_df(dfs: &VecDataFrame) -> List { r_result_list(df.map_err(|err| format!("{:?}", err))) } -#[extendr] -pub fn mem_address(robj: Robj) -> String { - let ptr_raw = unsafe { robj.external_ptr_addr::() }; - let ptr_val = ptr_raw as usize; - format!("{:#012x}", ptr_val) -} - #[extendr] fn min_exprs(exprs: &ProtoExprArray) -> Expr { let exprs = exprs.to_vec("select"); @@ -225,38 +218,20 @@ pub fn dtype_str_repr(dtype: Robj) -> RResult { Ok(dtype.to_string()) } -// pub fn series_from_arrow(name: &str, array: Robj) -> Result { -// use polars::prelude::IntoSeries; -// let arr = crate::arrow_interop::to_rust::arrow_array_to_rust(array)?; - -// match arr.data_type() { -// pl::ArrowDataType::LargeList(_) => { -// let array = arr.as_any().downcast_ref::().unwrap(); - -// let mut previous = 0; -// let mut fast_explode = true; -// for &o in array.offsets().as_slice()[1..].iter() { -// if o == previous { -// fast_explode = false; -// break; -// } -// previous = o; -// } -// let mut out = unsafe { pl::ListChunked::from_chunks(name, vec![arr]) }; -// if fast_explode { -// out.set_fast_explode() -// } -// Ok(Series(out.into_series())) -// } -// _ => { -// let res_series: pl::PolarsResult = -// std::convert::TryFrom::try_from((name, arr)); -// let series = res_series.map_err(|err| err.to_string())?; -// Ok(Series(series)) -// } -// } -// } +// -- Meta Robj functions +#[extendr] +pub fn mem_address(robj: Robj) -> String { + let ptr_raw = unsafe { robj.external_ptr_addr::() }; + let ptr_val = ptr_raw as usize; + format!("{:#012x}", ptr_val) +} + +#[extendr] //could be used to check copying/cloning behavior of R objects +pub fn clone_robj(robj: Robj) -> Robj { + robj.clone() +} +// -- Special functions just for unit testing #[extendr] fn test_robj_to_usize(robj: Robj) -> RResult { robj_to!(usize, robj).map(rdbg) @@ -285,7 +260,7 @@ extendr_module! { fn max_exprs; fn coalesce_exprs; fn sum_exprs; - fn mem_address; + fn concat_list; fn r_date_range; fn r_date_range_lazy; @@ -298,6 +273,9 @@ extendr_module! { fn arrow_stream_to_rust; fn dtype_str_repr; + fn mem_address; + fn clone_robj; + fn test_robj_to_usize; fn test_robj_to_i64; fn test_robj_to_u32; diff --git a/tests/testthat/test-extendr-meta.R b/tests/testthat/test-extendr-meta.R new file mode 100644 index 000000000..92922542a --- /dev/null +++ b/tests/testthat/test-extendr-meta.R @@ -0,0 +1,18 @@ +test_that("clone_robj + mem_adress", { + + # clone mutable + env = new.env(parent = emptyenv()) + env2 = clone_robj(env) + env$foo = 42 + expect_identical(env,env2) + expect_identical(pl$mem_address(env), pl$mem_address(env2)) + + # clone immutable, not the same + l = list() + l2 = clone_robj(l) + l$foo = 42 + expect_identical(l,list(foo = 42)) + expect_identical(l2,list()) + expect_false(pl$mem_address(l) == pl$mem_address(l2)) + +})