首页 > 解决方案 > C 中的 R 扩展:如何将结构链接到 SEXP 指针?

问题描述

我目前正在为 R 编写 C 扩展。我想创建一个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 数据?

谢谢您的帮助。

标签: rcgarbage-collection

解决方案


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

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


推荐阅读