Подтвердить что ты не робот

Список процессов от R до C и доступ к нему

Я хотел бы использовать список в C, который я получил от R. Я понимаю, что вопрос очень похож на этот: Передача кадра данных из-в R и C с использованием.call(). Однако я не могу его сохранить в указателе "* target", откуда я буду его использовать.

Р:

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

и в C:

#include <Rinternals.h>
#include <Rdefines.h>

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" таким образом вызывает у меня ошибку на данный момент.

4b9b3361

Ответ 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