我正在编写一个使用 rcpp 的 r 包。
我在 C++ 中有以下类:
using namespace std;
typedef float ffm_float;
typedef double ffm_double;
typedef int ffm_int;
typedef long long ffm_long;
class ffm_model {
public:
ffm_int n; // number of features
ffm_int m; // number of fields
ffm_int k; // number of latent factors
ffm_float *w = nullptr;
bool normalization;
~ffm_model();
};
我编写了以下 RCPP 模块,以便将该类公开给 r:
RCPP_MODULE(ffmModelMod){
using namespace Rcpp;
class_<ffm_model>( "ffm_model")
.field("n", &ffm_model::n)
.field("m", &ffm_model::m)
.field("k", &ffm_model::k)
.field("*w", &ffm_model::*w)
.field("normalization", &ffm_model::normalization)
.method("~ffm_model",&ffm_model::~ffm_model)
;
}
当我尝试在 R 中安装包时,我遇到了问题,因为ffm_float *w不能直接转换为 SEXP。根据我在这里提出的上一个问题,建议我尝试使用 XPtr 来包装指针。但是,我很难找到有用的文档,我什至不知道从哪里开始。
为了解决这个问题,我写了下面的前向声明,但我不知道我是否朝着正确的方向前进。
namespace Rcpp {
namespace traits{
// Support for wrap
template <typename T> SEXP wrap(const ffm_model<T>&);
// Support for as<T>
template <typename T> class Exporter< ffm_model<T> >;
}
}
有人可以指出我正确的方向吗?我已经阅读了 RCPP 扩展小插图。