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.