0

我是一名 R 和 C 程序员,试图使用 Rcpp 为用 C 编写的程序创建 R(和 C++)包装器。我对 C++ 并不十分熟悉。

有人可以帮我理解有关如何将 R 对象导入为 C++ 向量的文档吗?(我特别想导入一个包含 int、double 和 numeric 列表混合的 R 列表。)

Rcpp-introduction.pdf 状态:

从 R 对象到 C++ 对象的反向转换由Rcpp::as模板的变体实现,其签名为:

template <typename T> T as(SEXP x);

它提供较少的性,目前处理将 R 对象转换为原始类型(例如,、、、bool... ) intstd::string原始类型的 STL 向量(例如 std::vector<bool>,、、std::vector<double>...)和提供接受 SEXP 的构造函数的任意类型.

我对这意味着什么感到困惑,即“模板”、“类型名 T”和“T”的填写内容。我已经看到了很多关于原语的例子,例如

int dx = Rcpp::as<int>(x);

但我不明白这种语法如何映射到上面的模板文档,并且(更重要的是)不明白如何将它推广到 STL 向量。

4

1 回答 1

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> 
于 2013-05-24T21:23:07.990 回答