如何在Rcpp中使用struct vector作为输入参数

How to use struct vector as an input parameter in Rcpp

我需要向 Rcpp 函数提供一个结构向量。 cpp文件如下

#include <Rcpp.h>


using namespace Rcpp;

struct teststc{
  int y;
};


// [[Rcpp::export]]
void teststruct(std::vector<teststc>  ys){
  Rcpp::Rcout <<"test"<<std::endl;
}

当我编译这个cpp文件时,returns这个错误

error: no matching constructor for initialization of 'teststc'

我实际上看到一些函数使用类似的输入参数。所以,我不知道为什么我的不起作用。非常感谢任何帮助!

问题是您试图将一个函数导出到 R,该函数将 std::vector<teststc> 类型的对象作为参数。 R 中不存在这样的对象,因此无法将其传递给 C++ 代码。

如果您希望能够将一个对象从 R 传递给 C++ 并将其转换为您自己的结构,那么您必须编写将 R 对象转换为您的结构的 C++ 代码。 Rcpp 使这变得容易得多,但它并不神奇,并且不能在没有被告知您希望如何发生的情况下自动将 R 对象转换为任意结构。因此,您需要编写 C++ 代码来执行此操作。

例如,以下代码将从 R 中获取一个整数向量,将其转换为 std::vector<teststc>,然后打印出该向量的元素:

#include <Rcpp.h>
#include <vector>

using namespace Rcpp;

struct teststc {
  int y;
  teststc(int x) { this->y  = x;}
};

std::vector<teststc> make_testvec(IntegerVector iv) {
  std::vector<teststc> out;
  for(int i = 0; i < iv.size(); ++i) {
    out.push_back(teststc((int) iv[i]));
  }
  return(out);
}

// [[Rcpp::export]]
void teststruct(IntegerVector ys) {
  std::vector<teststc> stc = make_testvec(ys);
  for(unsigned i = 0; i < stc.size(); ++i) {
   Rcout << stc[i].y << ' '; 
  }
  Rcpp::Rcout << std::endl;
}

所以回到 R 我可以做:

teststruct(1:5)
#> 1 2 3 4 5