我是一名R和C程序员,试图使用Rcpp为用C编写的程序创建一个R(和C ++)包装器。我对C ++并不熟悉。
有人可以帮我理解有关如何将R对象导入为C ++向量的文档吗? (我特意尝试导入一个包含int,double和numeric列表混合的R列表。)
Rcpp-introduction.pdf声明:
从R对象到C ++对象的反向转换是通过变体来实现的 签名为{/ p>的
Rcpp::as
模板template <typename T> T as(SEXP x);
它提供较少的性别,目前处理R对象转换为原始类型(例如,
bool
,int
,std::string
,...),原始类型的STL向量(例如,std::vector<bool>
,std::vector<double>
,...)和提供带有SEXP的构造函数的任意类型。
我对这意味着什么感到困惑,即为“模板”,“typename T”和“T”填写了什么。我已经看到了原型的许多例子,例如
int dx = Rcpp::as<int>(x);
但是我不明白这个语法如何映射到上面的模板文档,并且(更重要的是)不理解如何将它概括为STL向量。
答案 0 :(得分:1)
也许你让它太复杂了。 R向量只是变成了C ++向量“因为这就是Rcpp为你做的事情。”
这是使用Rcpp::NumericVector
:
R> library(Rcpp)
R> cppFunction('NumericVector ex1(NumericVector x) { return x + 2;}')
R> ex1(1:4) # adds two
[1] 3 4 5 6
R>
这使用了我们为+
类型定义NumericVector
的事实。您也可以传入std::vector<double>
进出,但需要添加一些通常不止一个语句的操作,所以我没有在这里......
简而言之,请继续阅读文档,并在rcpp-devel或此处询问是否需要帮助。
编辑:为了完整性,与STL向量相同
R> cppFunction('std::vector<double> ex2(std::vector<double> x) { \
for (size_t i=0; i<x.size(); i++) x[i] = x[i] + 2; return x;}')
R> ex2(1:4)
[1] 3 4 5 6
R>