Adding the dimensions attribute takes away the altrep-ness. Removing dimensions does not make it altrep. E.g.,
> a <- 1:10 > am <- a ; dim(am) <- c(2L,5L) > amn <- am ; dim(amn) <- NULL > .Call("is_altrep", a) [1] TRUE > .Call("is_altrep", am) [1] FALSE > .Call("is_altrep", amn) [1] FALSE where is_altrep() is defined by the following C code: #include <R.h> #include <Rinternals.h> SEXP is_altrep(SEXP x) { return Rf_ScalarLogical(ALTREP(x)); } -Bill On Tue, Jun 29, 2021 at 8:03 AM Sebastian Martin Krantz < sebastian.kra...@graduateinstitute.ch> wrote: > Hello together, I'm working on some custom (grouped, weighted) sum, min and > max functions and I want them to support the special case of plain integer > sequences using ALTREP. I thereby encountered some behavior I cannot > explain to myself. The head of my fsum C function looks like this (g is > optional grouping vector, w is optional weights vector): > > SEXP fsumC(SEXP x, SEXP Rng, SEXP g, SEXP w, SEXP Rnarm) { > int l = length(x), tx = TYPEOF(x), ng = asInteger(Rng), > narm = asLogical(Rnarm), nprotect = 1, nwl = isNull(w); > if(ALTREP(x) && ng == 0 && nwl) { > switch(tx) { > case INTSXP: return ALTINTEGER_SUM(x, (Rboolean)narm); > case LGLSXP: return ALTLOGICAL_SUM(x, (Rboolean)narm); > case REALSXP: return ALTLOGICAL_SUM(x, (Rboolean)narm); > default: error("ALTREP object must be integer or real typed"); > } > } > // ... > } > > when I let x <- 1:1e8, fsum(x) works fine and returns the correct value. If > I now make this a matrix dim(x) <- c(1e2, 1e6) and subsequently turn this > into a vector again, dim(x) <- NULL, fsum(x) gives NULL and a warning > message 'converting NULL pointer to R NULL'. For functions fmin and fmax > (similarly defined using ALTINTEGER_MIN/MAX), I get this error right away > e.g. fmin(1:1e8) gives NULL and warning 'converting NULL pointer to R > NULL'. So what is going on here? What do these functions return? And how do > I make this a robust implementation? > > Best regards, > > Sebastian Krantz > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel