Traiter la liste de R à C et y accéder

Je voudrais utiliser une liste en C, que j’ai obtenue de R. Je réalise que la question est très similaire à celle-ci: Passer un cadre de données de-à R et C en utilisant .call () . Cependant, je ne parviens pas à le stocker dans un pointeur “* cible”, d’où je l’utiliserais davantage.

R:

.Call("processlist", list(c(1,2), c(1,3,2), c(1,5,4,4))) 

et en C:

 #include  #include  extern "C" { SEXP processlist(SEXP lst); } SEXP processlist(SEXP lst){ SEXP vec = PROTECT(allocVector(VECSXP, 2)); SET_VECTOR_ELT(vec, 0, VECTOR_ELT(c, 0); SET_VECTOR_ELT(vec, 1, VECTOR_ELT(c, 1); SET_VECTOR_ELT(vec, 2, VECTOR_ELT(c, 2); const lngth = 3; int *target[lnght]; // Here i want to fill "target", but how? int *preTarget = INTEGER(vec); // Bad attempts target[0] = INTEGER(preTarget[0]); target[0] = INTEGER(vec[0]); } 

Remarque: C ++ n’est malheureusement pas une option.

Edit: Le résultat souhaité serait que je puisse appeler * target de la manière suivante.

 target[0][0] --> Returns: 1 target[1][2] --> Returns: 2 target[2][3] --> Returns: 4 

Appeler “vec” de cette façon me jette une erreur pour le moment.

Il me semble que vous souhaitez simplement accéder aux valeurs de la liste à partir du côté C. Si cela est correct, regardez le code ci-dessous.

En dc :

 /* Including some headers to show the results*/ #include  #include  #include  #include  #include  SEXP processlist(SEXP lst){ int i,l = length(lst); /* You need an array of arrays, so target will be an int** */ int **target = malloc(sizeof(int *)*l); for (i=0;i 

La chose importante à noter est que la target doit être un int** , car il s'agit d'un pointeur sur un tableau de pointeurs.

En dR (après que dc ait été compilé):

 dyn.load("d.so") mylist<-list(c(1,2), c(1,3,2), c(1,5,4,4)) #This is very important: by default 1 in R is double. #You need to coerce every element of the list to integer. mylist<-lapply(mylist,as.integer) .Call("processlist", mylist) 

Notez que nous devons contraindre chaque élément de la liste à un entier. Ce qui précède produit:

 target[0][0]: 1 target[1][2]: 2 target[2][3]: 4