如何在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
我需要向 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