[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