使用.Call()将s4对象发送到C结构

时间:2015-06-02 02:19:54

标签: c r rcpp s4

我想将一个简单的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 pageR extensions manual找到答案。

1 个答案:

答案 0 :(得分:3)

可悲的是,“我希望有一个小马”方法并不总是有效。

但是通过从Rcpp创建as<>()wrap()转换器,您可以构建自己的设施。查看现有的S4转换器示例 herehere获得灵感。

简而言之,您的struct尚不存在为R类型或Rcpp类型,因此您必须提供映射。一旦你这样做,事情应该变得很好,因为你添加的转换器将被称为“按需”。

那就是说,写这样的转换器可能不是你第一天用Rcpp做的事情......