C 中的 R 扩展:如何 link 结构到 SEXP 指针?

R extension in C: how to link a struct to a SEXP pointer?

我目前正在写 C extension for R。我想创建一个链接到现有 SEXP 指针的 struct。例如:

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 数据?我应该如何 protect/unprotect 这个 SEXP 数据?

感谢您的帮助。

我想我已经回答了我的问题而不是包装

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垃圾管理器来管理它。但是结构不是不透明的,用户可以修改它。