`Rcpp::wrap` 和 `Rcpp::as` 用于使用 Rcpp 命名空间类的外部类

问题描述

如何为包含 Rcpp::wrap 类的类编写 Rcpp::asRcpp 方法

例如,以下 .cpp 文件使用 sourceCpp() 编译:

#include <Rcpp.h>

namespace Rcpp {
  class myVector {
  public:
    NumericVector data;
    myVector(NumericVector v) : data(v) {};
  };

  template <> myVector as(SEXP v) { 
    return myVector(v);
  }

  template <> SEXP wrap(const myVector& v) { 
    return v.data;
  }
}

//[[Rcpp::export]]
Rcpp::myVector test(Rcpp::myVector& x){
  return x;
}

在这个例子中,我们创建了一个向量,它只包含一个 Rcpp 类 (NumericVector) 和一个 Rcpp::asRcpp::wrap 方法,以便它可以用作参数在任何导出的函数中。

但是创建Rcpp包的时候代码没有通过,如下:

  1. Rstudio -> 新建项目 -> 新建目录 -> 使用 Rcpp 的 R 包
  2. 将上述脚本复制到新文件中,test.cpp
  3. 构建 -> 安装并重启

test.cpp 没有投诉,但 src/RcppExports.cpp 有投诉。这是相关的功能

// test
Rcpp::myVector test(Rcpp::myVector& x);
RcppExport SEXP _test_test(SEXP xSEXP) {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< Rcpp::myVector& >::type x(xSEXP);
    rcpp_result_gen = Rcpp::wrap(test(x));
    return rcpp_result_gen;
END_RCPP
}

错误是:

Line 19: `myVector` does not name a type;
Line 24: `myVector` was not declared in this scope
... template argument 1 invalid,qualified-id in declaration,'x' not declared,'test' not declared... side-effects of above two errors.

我知道如何为不包含 Rcpp 类 (templated case,general case) 的类编写 Rcpp::asRcpp::wrap

  1. #include <RcppCommon.h>
  2. 类的前向声明,可能依赖于 C++ 库(不是 Rcpp.h
  3. #include <Rcpp.h>

不幸的是,Rcpp::myVec 需要 Rcpp.h,因此不能在包含 Rcpp.h 之前声明。

包含 Rcpp 类的外部类是否可以使用 Rcpp::wrapRcpp::as?如果是这样,我可以查看任何先例以了解详细信息吗?尽管进行了相当多的搜索,但我还是没有找到任何东西,或者我可能忽略了一些非常简单的东西。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)