[Rd] SEXP size management.

Oleg Sklyar osklyar at ebi.ac.uk
Wed Mar 5 17:40:50 CET 2008



Charles Danko wrote:
> Hi, Oleg,
> 
> Thanks very much for your answer!  I was indeed confused; thinking
> that Realloc was intended to be an analog to realloc (except for SEXP
> variables).
> 
> Is there a way to do either of the following:
> -- resize the SEXP directly (for my purpose, I ONLY need to decrease
> the size), or
Not that I know.

> -- assign it to to a C pointer that was allocated and used previously
> in the function (and can thus be resized with realloc).
Well you can get a pointer to the underlying data, basically with 
INTEGER, REAL etc macros, but resizing that vector is not a good idea as 
you do not know about underlying processes in R connected with memory 
management etc.

I think that whether you want to increase or decrease the size, you will 
end up with recreating a SEXP var. Well, you can keep your data outside 
of SEXP's, like in STL vectors etc and then move it to SEXP at the end.

> 
> Thanks again,
> Charles
> 
> On Wed, Mar 5, 2008 at 11:14 AM, Oleg Sklyar <osklyar at ebi.ac.uk> wrote:
>> 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
>>

-- 
Dr Oleg Sklyar * EBI-EMBL, Cambridge CB10 1SD, UK * +44-1223-494466



More information about the R-devel mailing list