[R] Attempting to access an R list from within C code

Duncan Murdoch murdoch.duncan at gmail.com
Wed Apr 27 16:59:10 CEST 2011


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.



More information about the R-help mailing list