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 和一个给定 SEXPfoo::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 文件中:

要像 sourceCpp 一样构建包需要做什么?

感谢任何解决方案!

RcppExports.cpp file missing declarations for this new class.

查看属性小插图。自定义行为是将 header 命名为包(即包 foofoo.h)and/or foo-types.h),它将被添加到生成的 RcppExports.cpp.

这是有记录的,但隐藏得太有效了:-/它也在这里,所以我们可以把它当作一个骗局来关闭,但我现在没有时间去搜索它。