我有两个Rcpp包装的类,A
和B
。 A
的构造函数从其参数中提取一些信息,并将其打印出来以证明其有效。
B
将A
的对象作为构造函数参数—并报告错误,好像在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'].
>
答案 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和我的原始代码问题。