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

使用.Call()将s4对象发送到C结构,c,r,rcpp,s4,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> #

我想将一个简单的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;
}
#包括
#包括
#包括
类型定义结构{
双x;
int-y;
}我的结构;
SEXP解析(sexpr_实例){
MyStruct c_instance=将_S4_转换为_STRUCT(r_instance);
printf(“%g%d\n”,c_实例->x[0],c_实例->y[0]);
返回R_值;
}
是否有一个
MAKE\u S4\u INTO\u STRUCT
函数可以使这项工作正常?我还没有在或中找到答案。

遗憾的是,“我希望有一匹小马”的方法并不总是奏效

但是通过从Rcpp创建
as()
wrap()
转换器,您可以自己构建这样一个设施。参见现有的S4转换器示例 或 寻求灵感

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

这就是说,在使用Rcpp的第一天,编写这样的转换器可能不是你应该做的…

遗憾的是,“我希望有一匹小马”的方法并不总是有效的

但是通过从Rcpp创建
as()
wrap()
转换器,您可以自己构建这样一个设施。参见现有的S4转换器示例 或 寻求灵感

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


这就是说,编写这样的转换器可能不是您在使用Rcpp的第一天应该做的…

这些示例为我指明了正确的方向,我想我已经了解了s4和Rcpp需要了解的内容。事实证明,我问的是错误的问题,我想我需要的是访问C++中的S4槽,比如“代码”S4 OBJ(ARG);双x*=实(对象插槽(“x”))。现在,我正在努力。酷。您也可以使用
Rcpp::as(…)
而不是
REAL(…)
。这些示例为我指明了正确的方向,我想我已经了解了关于s4和Rcpp需要了解的内容。事实证明,我问的是错误的问题,我想我需要的是访问C++中的S4槽,比如“代码”S4 OBJ(ARG);双x*=实(对象插槽(“x”))。现在,我正在努力。酷。您还可以使用
Rcpp::as(…)
而不是
REAL(…)