Я хотел бы использовать список в C, который я получил от R. Я понимаю, что вопрос очень похож на этот: Передача кадра данных из-в R и C с использованием .call () . Однако я не могу его сохранить в указателе «* target», откуда я буду его использовать.
Р:
.Call("processlist", list(c(1,2), c(1,3,2), c(1,5,4,4)))
и в 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]); }
Примечание: C ++, к сожалению, не является опцией.
Изменить: желаемый вывод состоял бы в том, что я могу вызвать * target следующим образом.
target[0][0] --> Returns: 1 target[1][2] --> Returns: 2 target[2][3] --> Returns: 4
Вызов «vec» таким образом вызывает у меня ошибку на данный момент.
Мне кажется, что вы просто хотите получить доступ к значениям в списке со стороны C. Если это правильно, посмотрите на код ниже.
В 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
Важно отметить, что 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