unordered_map в аргументе функции - PullRequest
2 голосов
/ 05 июня 2019

Вопрос

Почему при использовании std::unordered_map в качестве аргумента функции не удается скомпилировать (и как мне это решить)?

Пример

Эта первая функция имеет std::unordered_map в качестве параметра функции, но не может скомпилировать

library(Rcpp)

cppFunction(
  code = 'void test( std::unordered_map< std::string, std::string > um ) {

  }'
  , plugins = "cpp11"
  )

Принимая во внимание, что это нормально, когда объявлено в теле функции

cppFunction(
  code = 'void test(  ) {
    std::unordered_map< std::string, std::string > um;
  }'
  , plugins = "cpp11"
)

Extra

Я успешно использовал его в качестве аргумента функции здесь, во встроенной функции в моей spatialwidget библиотеке


Понимание ответа

Спасибо Ральфу Стубнеру за объяснение. Таким образом, при создании функции Rcpp, вызываемой из R, должно быть эквивалентное представление объектов R.

Этот код не работает, потому что в R

нет эквивалента unordered_map
// [[Rcpp::export]]
void test( std::unordered_map< std::string, std::string > um ) {

}

Это проходит, потому что он не вызывается / не экспортируется в R

void test( std::unordered_map< std::string, std::string > um ) {

}

1 Ответ

4 голосов
/ 05 июня 2019

Вы можете использовать такие вещи, как std::vector и std::list в качестве параметра функции и возвращать значения в функциях, которые могут вызываться из R , поскольку существуют соответствующие специализации для Rcpp::as и Rcpp::wrap, которые преобразуются между эти структуры данных C ++ и SEXP s, о которых R знает (в обоих направлениях). Теперь у R нет собственного типа данных, похожего на карту (хотя можно в некоторой степени использовать именованные списки), поэтому (вероятно) у Rcpp нет встроенного перевода для std::unordered_map. Нет такого ограничения для функций, которые можно вызывать только из C ++, поэтому ваш «дополнительный» пример работает.

В принципе, вы можете сами определять такие функции преобразования, ср. http://gallery.rcpp.org/articles/custom-templated-wrap-and-as-for-seamingless-interfaces/ и ссылки в нем. Однако сначала вам нужно будет решить, какой тип структуры данных вы хотите использовать на стороне R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...