将Rcpp对象传递给另一个对象时,new_CppObject_xp错误地报告错误

时间:2018-10-06 22:51:23

标签: r rcpp

我有两个Rcpp包装的类,ABA的构造函数从其参数中提取一些信息,并将其打印出来以证明其有效。

BA的对象作为构造函数参数—并报告错误,好像在A的构造函数中提取失败。但是,A确实会打印出提取的数据,所以它不会失败。

如何使B接受A作为参数而不会出错?

最小的可复制示例:

library(Rcpp)

Rcpp::sourceCpp(code='
#include <Rcpp.h>

struct A {
  Rcpp::NumericVector y;

  A(Rcpp::List x)
    : y(Rcpp::as<Rcpp::NumericVector>(x["foo"]))
  {
    Rcpp::Rcout << y;
  }
};

struct B {
  B(A x) { }
};

RCPP_MODULE(A) {
  Rcpp::class_<A>("A")
  .constructor<Rcpp::List>();
}

RCPP_MODULE(B) {
  Rcpp::class_<B>("B")
  .constructor<A>();
}
')

Aobj <- new(A, list(foo=1:3))
Bobj <- new(B, Aobj)

输出:

> source('testcase.R', echo=TRUE)

> library(Rcpp)

> Rcpp::sourceCpp(code='
+ #include <Rcpp.h>
+ 
+ struct A {
+   Rcpp::NumericVector y;
+ 
+   A(Rcpp::List x)
+     : y(Rcpp::as<Rcpp::NumericVector> .... [TRUNCATED] 

> Aobj <- new(A, list(foo=1:3))
1 2 3
> Bobj <- new(B, Aobj)
Error in new_CppObject_xp(fields$.module, fields$.pointer, ...) : 
  Index out of bounds: [index='foo'].
> 

2 个答案:

答案 0 :(得分:4)

我将尝试解释this question为何起作用。使用var value = "valueofa"; body[value]; 可以将C ++结构RCPP_MODULE(A)作为R中的引用类公开。这是自动完成的。但是,当您调用A时,没有信息如何从此引用类转换为所需的C ++结构。通过使用Bobj <- new(B, Aobj),您将创建RCPP_EXPOSED_CLASS(A)Rcpp::wrap的特化,以两种方式在C ++和R对象之间进行转换。由于我们只缺少R到C ++的转换,即Rcpp::as,因此以下内容就足够了:

Rcpp::as

答案 1 :(得分:3)

当事情不起作用时,最好(重新)阅读一些文档。具体来说,Rcpp Extending (PDF),第3.2节。

我在C ++代码的开头添加了以下内容:

#include <RcppCommon.h>
struct A;
RCPP_EXPOSED_CLASS(A);

...它现在可以正常工作。我承认我还不完全了解这里会发生什么,但是这种解决方案可以解决MWE和我的原始代码问题。