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 <[EMAIL PROTECTED]> 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@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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel