Создает ли преобразование векторов между Rcpp и C ++ (используя Rcpp :: as или Rcpp :: wrap) новый вектор и копирует элементы? - PullRequest
2 голосов
/ 27 октября 2019

В моем понимании, преобразование векторов между 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 ++.

1 Ответ

6 голосов
/ 27 октября 2019

Правильно, следующие функции выполняют преобразования:

// conversion from R to C++
Rcpp::as<T>();
// conversion from C++ to R
Rcpp::wrap();

Короче говоря, перемещение данных из объекта Rcpp в вектор C ++ и наоборот приводит к созданию копии. Это было немного объяснено здесь:

Объявите переменную как ссылку в Rcpp

Для получения дополнительной информации о шаблонах см. Расширение Rcpp виньетка.

Подробную информацию о стоимости от Rcpp::*Vector до std::vector<T> можно найти здесь:

Должен ли я предпочесть Rcpp :: NumericVector, а не std :: vector?

Одним из способов избежать копирования является повторное использование памяти, если это возможно. Здесь намекают:

Выбор между NumericVector и arma :: vec в Rcpp

...