Hello R-help, I am wondering if anyone can help me with this: I want to access data in a list which has been passed into a C function, but I cannot work out how to access the values. How do I move from the given SEXP pointer to the next object in the list? I have tried to use CDR, but to no avail. The following code gives an 'address (nil), cause unknown' error: R Code: dyn.load("thelib.so") list1<-list(c(1:3),c(11:13),c(21:23)) listLen<-length(list1) .C("myfunc",list1,listLen) C Code (kept in file thelib.c, compiled on Ubuntu x64 machine using R2.13.0): void showList(SEXP *obj, int *size) { SEXP *locObj=obj; int i; for(i=0;i<*size;i++){ Rprintf("Entry is %d: value is %f",i,REAL(*locObj)[1]); *locObj=CDR(*locObj); } return; } Any help is greatfully appreciated! Best wishes, Dr. Cormac Long. [[alternative HTML version deleted]]
Duncan Murdoch
2011-Apr-27 14:59 UTC
[R] Attempting to access an R list from within C code
On 27/04/2011 9:43 AM, Cormac Long wrote:> Hello R-help, > > I am wondering if anyone can help me with this: > > I want to access data in a list which has been passed > into a C function, but I cannot work out how to access > the values. How do I move from the given SEXP pointer > to the next object in the list? I have tried to use CDR, > but to no avail. The following code gives an > 'address (nil), cause unknown' > error:Generally questions like this are better in the R-devel list, but I'll answer this one: What R calls a list() isn't really a list in the Lisp sense, it's a vector. You access elements in C code by index, e.g. val = VECTOR_ELT(obj, i); You set values using code like SET_VECTOR_ELT(obj, i, newvalue); Duncan Murdoch> R Code: > dyn.load("thelib.so") > list1<-list(c(1:3),c(11:13),c(21:23)) > listLen<-length(list1) > .C("myfunc",list1,listLen) > > > C Code (kept in file thelib.c, compiled on Ubuntu x64 > machine using R2.13.0): > > void showList(SEXP *obj, int *size) > { > SEXP *locObj=obj; > int i; > for(i=0;i<*size;i++){ > Rprintf("Entry is %d: value is %f",i,REAL(*locObj)[1]); > *locObj=CDR(*locObj); > } > return; > } > > Any help is greatfully appreciated! > Best wishes, > Dr. Cormac Long. > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.