Расширение R в C: как связать структуру с указателем SEXP? - PullRequest
2 голосов
/ 23 апреля 2020

Я сейчас пишу расширение C для R . Я хотел бы создать struct, связанный с существующим указателем SEXP. Например:

struct MyData {
    SEXP exp;
    int i;
}

SEXP create(SEXP p1)
{
    struct MyData p* = malloc(sizeof(MyData));
    p->exp =  p1;
    p->i = 1234;
    SEXP ext = PROTECT(R_MakeExternalPtr(p, R_NilValue,R_NilValue));
    R_RegisterCFinalizerEx(ext,myFinalizer, TRUE);
    UNPROTECT(1);
    return ext;
}

void myFinalizer(SEXP x)
{
    void * p = R_ExternalPtrAddr(handle);
    free(p);
}

Как правильно обрабатывать указатель p->exp? Как сказать менеджеру мусора, что я использую данные SEXP? Как мне защитить / снять защиту этих данных SEXP?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 23 апреля 2020

Я думаю, что я ответил на мою проблему вместо того, чтобы обернуть

struct MyData {
    SEXP exp;
    int i;
}

Я создаю вектор:

SEXP ext = PROTECT(allocVector(VECSXP, 2));nprotect++;
SET_VECTOR_ELT(ext, 0, exp);
SET_VECTOR_ELT(ext, 1, sexpI);

и ext это мой объект и Я позволил менеджеру мусора R управлять им. Но структура не является непрозрачной, и пользователь может изменить ее.

...