[Rd] Creating a VECSXP when n is unknown(using Linked list)
Saptarshi Guha
saptarshi.guha at gmail.com
Wed Apr 1 07:55:05 CEST 2009
Hello,
I need to create a VECSXP(A) each element of which is a 2-element
VECSXP. Since I dont know
how many elements there will be i create a linked list of 2-element
VECSXP (see code at end)
Once I know the number of elements, i then go ahead allocVector A and
then SET_VECTOR_ELEMENT the
elements of A by iterating over the linked list.
Suppose the function is f(), then it works a couple of times but
crashes ( in different ways)
after that.
e.g
for(x in 1:10){
f(x)
}
Then this crashes after a few iterations. If I were to perform just
one call, e.g u=f(x[1]),
i get a valid results.
Where am I going wrong? I must admit my C experience is very rough.
Thank you in advance
Saptarshi
==code==
struct ll_element {
SEXP k,v;
struct ll_element * next;
};
struct ll_element *elem,*head;
head=NULL;
unsigned long countofelems=0;
while(1){
nextKV(jo,&val,&data,&len,&err);
if(err && err!=2 ) {
error("Problem reading:%d",err);
return(R_NilValue);
}
if(err==2) {
//Indicates no more values, we have all the elements we need
//exit and make VECSXP
break;
}
SEXP vxp;
int Rerr;
elem = (struct ll_element *)R_alloc(1,sizeof(struct ll_element));
PROTECT(elem->k = NEW_NUMERIC(1));
REAL(elem->k)[0]=(double)val;
vxp = allocVector(RAWSXP,len);
memcpy(RAW(vxp), data, sizeof(jbyte)*len);
free(data);
PROTECT(elem->v = R_tryEval(LCONS(install("unserialize"),CONS(vxp,
R_NilValue)), R_GlobalEnv, &Rerr));
if(Rerr!=0){
UNPROTECT(2);
error("Could not unserialize");
return(R_NilValue);
}
UNPROTECT(2);
countofelems+=1;
elem->next=head;
head=elem;
}
struct ll_element *ce;
SEXP rv;
int k=0;
ce=head;
PROTECT(rv= allocVector(VECSXP, countofelems));
while(ce){
SEXP y ;
PROTECT(y=allocVector(VECSXP,2));
SET_VECTOR_ELT(y,0,ce->k);
SET_VECTOR_ELT(y,1,ce->v);
SET_VECTOR_ELT(rv,k,y);
k+=1;
ce=ce->next;
UNPROTECT(1);
}
UNPROTECT(1);
return(rv);
More information about the R-devel
mailing list