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

最佳答案

不幸的是,“我希望有一匹小马”的方法并不总是有效的。
但是,通过从Rcpp创建as<>()wrap()转换器,您可以构建这样一个设施。参见现有的S4转换器示例
here
here激发灵感。
简而言之,您的struct作为R类型或RCPP类型还不存在,因此您必须提供映射。一旦你这样做,事情应该桃色,因为你添加的转换器将被称为“按需”。
也就是说,写这样的转换器可能不是你应该做的第一天与Rcpp。。。

09-06 22:11
查看更多