我想将一个简单的s4对象传递到C中,并将其转换为一个简单的结构。我把R代码想象成
setClass("MyClass", slots = list(x = "numeric", y = "integer"))
r_instance = new("MyClass", x = rnorm(5), y = as.integer(1:10))
dyn.load("parse.so")
.Call("parse", r_instance)
带
parse.c
#include <R.h>
#include <Rinternals.h>
#include <Rmath.h>
typedef struct {
double x;
int y;
} MyStruct;
SEXP parse(SEXP r_instance){
MyStruct c_instance = MAKE_S4_INTO_STRUCT(r_instance);
printf("%g %d\n", c_instance->x[0], c_instance->y[0]);
return R_NilValue;
}
是否有一个
MAKE_S4_INTO_STRUCT
函数可以使此工作?我在Hadley's C interface page或R extensions manual中找不到答案。 最佳答案
不幸的是,“我希望有一匹小马”的方法并不总是有效的。
但是,通过从Rcpp创建as<>()
和wrap()
转换器,您可以构建这样一个设施。参见现有的S4转换器示例
here或
here激发灵感。
简而言之,您的struct
作为R类型或RCPP类型还不存在,因此您必须提供映射。一旦你这样做,事情应该桃色,因为你添加的转换器将被称为“按需”。
也就是说,写这样的转换器可能不是你应该做的第一天与Rcpp。。。