r - 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 数据?
谢谢您的帮助。
解决方案
我想我回答了我的问题而不是包装
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 垃圾管理器来管理它。但结构不是不透明的,用户可以修改它。
推荐阅读
- java - java.io.IOException in MapReduce
- angular - 在 UI 上显示内容的延迟
- sql - 连接两个表并在 oracle sql 中进行透视
- javascript - 使用多个或在续集中
- ant-design-pro - 如何在antd cascader子选项标签中添加图标
- excel - Excel 64 位中的 ODBC 连接失败错误
- html - 如何在右侧移动导航栏项目
- php - 如何从给定的 json 中仅获取 HotelDetails?
- ajax - 使用 ajax 结果创建一个 django url
- excel - 更新 '000s 工作簿链接的一部分时出现问题