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

Use .Call() to send an s4 object to a C struct

我想将一个简单的 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 or the R extensions manual.

中找到答案

遗憾的是,"I wish there was a pony" 方法并不总是有效。

但是通过从 Rcpp 创建 as<>()wrap() 转换器,您可以自己构建这样一个工具。查看现有的 S4 转换器示例 herehere 寻找灵感。

简而言之,您的 struct 还不作为 R 类型或 Rcpp 类型存在,因此您必须提供映射。一旦你这样做了,事情就会变得很顺利,因为你添加的转换器将被调用 "on demand".

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