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