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
SEXP size management.
4 messages · Charles Danko, Oleg Sklyar
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
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 -- assign it to to a C pointer that was allocated and used previously in the function (and can thus be resized with realloc). 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
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