gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:34:20 33 4
gpt4 key购买 nike

我有两个 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'].
>

最佳答案

我会尝试解释为什么 your solution作品。与 RCPP_MODULE(A)您正在公开 C++ 结构 A作为 R 中的引用类。这是自动完成的。但是,当您调用 Bobj <- new(B, Aobj) ,没有信息如何从这个引用类转换为所需的 C++ 结构。通过使用 RCPP_EXPOSED_CLASS(A)您正在创建 Rcpp::wrap 的特化和 Rcpp::as以两种方式在 C++ 和 R 对象之间进行转换。由于我们只缺少 R 到 C++ 的转换,即 Rcpp::as ,以下也足够了:

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

#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>();
}

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

关于r - new_CppObject_xp 在将 Rcpp 对象传递给另一个对象时错误地报告错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52684006/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com