Ответ 1
Мне кажется, что вы просто хотите получить доступ к значениям в списке со стороны C. Если это правильно, посмотрите на код ниже.
В dc
:
/* Including some headers to show the results*/
#include <Rinternals.h>
#include <Rdefines.h>
#include <R.h>
#include <stdlib.h>
#include <stdio.h>
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<l;i++) {
target[i] = INTEGER(VECTOR_ELT(lst,i));
}
printf("target[0][0]: %d\n",target[0][0]);
printf("target[1][2]: %d\n",target[1][2]);
printf("target[2][3]: %d\n",target[2][3]);
free(target);
return R_NilValue;
}
Важно отметить, что target
должна быть int**
, поскольку это указатель на массив указателей.
В dR
(после компиляции dc
):
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)
Обратите внимание, что нам нужно принуждать каждый элемент списка к целому. Вышеизложенное дает:
target[0][0]: 1
target[1][2]: 2
target[2][3]: 4