Rcpp::traits::Exporter 的 Rcpp 非侵入式扩展
Non-intrusive extension of Rcpp with Rcpp::traits::Exporter
我正在编写一个包含 classes 的 Rcpp 包,其中包含非侵入式导出到 C++ 类型的基本 Rcpp 对象(参见 Extending Rcpp by Eddelbuettel and Francois, and this helpful vignette by coatless)。
这意味着如果我有一个 class foo::bar
和一个给定 SEXP
的 foo::bar
的构造函数,我可以调用这样的函数:
//[[Rcpp::export]]
void func(foo::bar object){
// do something
}
我的问题是 sourceCpp("foobar.cpp")
完全按预期工作,但 R CMD build
抱怨 RcppExports.cpp
文件缺少此新 class.
的声明
这是一个最小的可重现示例,包含一个 foo::bar
class 持有一个 Rcpp::NumericVector
。它使用 sourceCpp()
进行编译,但不会构建包,因为 foobar
未在 RcppExports.cpp
中找到:
foobar.cpp:
#include <RcppCommon.h>
// forward declare class
namespace foo {
class bar;
}
// forward declare Rcpp::as<> Exporter
template <>
class Rcpp::traits::Exporter<foo::bar>;
#include <Rcpp.h>
// now fully declare class, since Rcpp objects
// are now loaded from Rcpp.h
namespace foo {
class bar {
public:
Rcpp::NumericVector x;
bar(Rcpp::NumericVector x) : x(x) {};
};
}
// now fully declare Rcpp exporter, since we can
// deal with Rcpp objects from Rcpp.h
namespace Rcpp {
namespace traits {
template <>
class Exporter<foo::bar> {
Rcpp::NumericVector x_;
public:
Exporter(SEXP x) : x_(x) {}
foo::bar get() {
return foo::bar(x_);
}
};
}
}
//[[Rcpp::export]]
Rcpp::NumericVector test(foo::bar& A) {
return A.x;
}
我在 运行 R CMD check
时遇到的具体错误都在 src/RcppExports.cpp
文件中:
- 'foo' 尚未申报
- 'A' 未在此范围内声明
- 'foo' 未在此范围内声明
- '模板参数1无效
- '在'A'
之前声明的qualified-id
要像 sourceCpp
一样构建包需要做什么?
感谢任何解决方案!
RcppExports.cpp file missing declarations for this new class.
查看属性小插图。自定义行为是将 header 命名为包(即包 foo
的 foo.h
)and/or foo-types.h
),它将被添加到生成的 RcppExports.cpp
.
这是有记录的,但隐藏得太有效了:-/它也在这里,所以我们可以把它当作一个骗局来关闭,但我现在没有时间去搜索它。
我正在编写一个包含 classes 的 Rcpp 包,其中包含非侵入式导出到 C++ 类型的基本 Rcpp 对象(参见 Extending Rcpp by Eddelbuettel and Francois, and this helpful vignette by coatless)。
这意味着如果我有一个 class foo::bar
和一个给定 SEXP
的 foo::bar
的构造函数,我可以调用这样的函数:
//[[Rcpp::export]]
void func(foo::bar object){
// do something
}
我的问题是 sourceCpp("foobar.cpp")
完全按预期工作,但 R CMD build
抱怨 RcppExports.cpp
文件缺少此新 class.
这是一个最小的可重现示例,包含一个 foo::bar
class 持有一个 Rcpp::NumericVector
。它使用 sourceCpp()
进行编译,但不会构建包,因为 foobar
未在 RcppExports.cpp
中找到:
foobar.cpp:
#include <RcppCommon.h>
// forward declare class
namespace foo {
class bar;
}
// forward declare Rcpp::as<> Exporter
template <>
class Rcpp::traits::Exporter<foo::bar>;
#include <Rcpp.h>
// now fully declare class, since Rcpp objects
// are now loaded from Rcpp.h
namespace foo {
class bar {
public:
Rcpp::NumericVector x;
bar(Rcpp::NumericVector x) : x(x) {};
};
}
// now fully declare Rcpp exporter, since we can
// deal with Rcpp objects from Rcpp.h
namespace Rcpp {
namespace traits {
template <>
class Exporter<foo::bar> {
Rcpp::NumericVector x_;
public:
Exporter(SEXP x) : x_(x) {}
foo::bar get() {
return foo::bar(x_);
}
};
}
}
//[[Rcpp::export]]
Rcpp::NumericVector test(foo::bar& A) {
return A.x;
}
我在 运行 R CMD check
时遇到的具体错误都在 src/RcppExports.cpp
文件中:
- 'foo' 尚未申报
- 'A' 未在此范围内声明
- 'foo' 未在此范围内声明
- '模板参数1无效
- '在'A' 之前声明的qualified-id
要像 sourceCpp
一样构建包需要做什么?
感谢任何解决方案!
RcppExports.cpp file missing declarations for this new class.
查看属性小插图。自定义行为是将 header 命名为包(即包 foo
的 foo.h
)and/or foo-types.h
),它将被添加到生成的 RcppExports.cpp
.
这是有记录的,但隐藏得太有效了:-/它也在这里,所以我们可以把它当作一个骗局来关闭,但我现在没有时间去搜索它。