SEXP size management.
Rblah in your example is a SEXP structure. Realloc is an interface to C realloc and is not intended to resize SEXP structures -- it is used to resize user-controlled memory (which is generally not created by allocVector/INTEGER). You would expect a call like: int * val; ... Realloc(val, 20, int); Best, Oleg
Charles Danko wrote:
Hi,
Trying to decrease the size of a SEXP variable without reassigning
values individually in a loop.
So far, I've tried using Realloc, as the follow source demonstrates:
SEXP dothis() {
SEXP Rblah;
PROTECT(Rblah = NEW_INTEGER(6));
int* blah = INTEGER(Rblah);
blah[0] = 1;
blah[1] = 2;
blah[2] = 3;
Realloc(Rblah, 3, INTEGER);
UNPROTECT(1);
return(Rblah);
}
According to the documentation, I think that this should work, however
it returns an error on compile: "test.c:17: error: expected expression
before ')' token" (line 17 refers to the Realloc line).
Another solution that will suit my needs is managing the variable in C
and assigning the pointer to an R type in the end. The following code
gets at this, but int* and SEXP, INTEGER are incompatible:
SEXP dothat() {
int* blah = malloc(3);// = INTEGER(Rblah);
blah[0] = 1;
blah[1] = 2;
blah[2] = 3;
SEXP Rblah;
PROTECT(Rblah = blah);
UNPROTECT(1);
return(Rblah);
}
Any suggestions for someone still new to SEXP memory management?
Thanks,
Charles
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Dr Oleg Sklyar * EBI-EMBL, Cambridge CB10 1SD, UK * +44-1223-494466