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