是否在Rcpp和C ++之间转换向量(使用Rcpp :: as或Rcpp :: wrap)创建新的向量并复制元素?

tos*_*san 2 c++ r vector rcpp

以我的理解,在Rcpp和C ++之间转换向量将创建新向量,如下所示。我的理解正确吗?

将Rcpp向量转换为C ++向量时,我们使用Rcpp::as<T>()(例如Rcpp::as<std::string>用于Rcpp::CharacterVector)。 std::vector<std::string>创建后,原始Rcpp元素将被复制到C ++向量中std::string。这意味着修改新创建的C ++矢量元素不会影响原始的Rcpp矢量元素。

将C ++向量转换为Rcpp向量时,我们使用Rcpp::wrap()。创建具有相应类型的Rcpp向量,并将C ++元素作为Rcpp对象复制到Rcpp向量中。这意味着修改新创建的Rcpp矢量元素不会影响原始的C ++矢量元素。

coa*_*ess 6

正确,以下功能可以执行转换:

// conversion from R to C++
Rcpp::as<T>();
// conversion from C++ to R
Rcpp::wrap();
Run Code Online (Sandbox Code Playgroud)

简而言之,将数据从Rcpp对象移至C ++向量,反之亦然,将导致复制。这里对此进行了一些解释:

在Rcpp中声明一个变量作为参考

有关模板的更多信息,请参见Rcpp扩展小插图。

Rcpp::*Vector到的费用详细信息std::vector<T>可以在这里找到:

我应该更喜欢Rcpp :: NumericVector而不是std :: vector吗?

避免复制的一种方法是在可能的情况下重新使用内存。这暗示在这里:

在Rcpp中确定NumericVector和arma :: vec