Использование шаблонов классов `c ++` в `R` - PullRequest
0 голосов
/ 13 января 2019

Я впервые смотрю на , как писать функции переноса, которые позволяют мне взаимодействовать с шаблоном класса, который я создал в c ++ , и у меня есть несколько вопросов.

Как использовать атрибут Rcpp::depends для объявления зависимостей от созданных мной статических библиотек? Я предполагаю, что мне нужно где-то указать путь, но все приведенные здесь примеры относятся к общеизвестным библиотекам.

Какие у меня есть варианты для R типов, которые я могу использовать, когда пытаюсь использовать этот материал в сеансе R? У меня есть c++ классы, которые не только содержат некоторые данные, но у них также есть методы, которые обрабатывают эти данные и изменяют состояние. Этот пример, кажется, только меняет вектор на другой. У кого-нибудь есть примеры или предложения, как это можно сделать?

namespace Rcpp {

    namespace traits{

        // Defined wrap case
        template <typename T> SEXP wrap(const boost::numeric::ublas::vector<T> & obj){
            const int RTYPE = Rcpp::traits::r_sexptype_traits<T>::rtype ;

            return Rcpp::Vector< RTYPE >(obj.begin(), obj.end());
        };


    }
}

1 Ответ

0 голосов
/ 13 января 2019

Это очень широкий вопрос, поэтому я могу дать лишь несколько указаний, которые могут вам помочь:

  • Атрибут Rcpp::depends предназначен не для зависимостей от внешних библиотек, а для других пакетов R. Эти пакеты R могут предоставлять библиотеки (например, RcppArmadillo или RcppEigen) или необходимую инфраструктуру для связи с системной библиотекой (например, RcppGSL). Последнее достигается с помощью плагинов, см. RcppGSL::inlineCxxPlugin(). Плагины также можно использовать без дополнительной упаковки, см. здесь .

  • Если вы хотите поддерживать состояние в объекте C ++, вы должны рассмотреть его жизненный цикл. Если это одноэлементный объект, мне нравится использовать анонимное пространство имен. В противном случае вы можете использовать Rcpp::XPtr для переноса объекта C ++ в R. Это также может быть достигнуто с помощью макроса RCPP_EXPOSED_CLASS, c.f. виньетка "Расширяющая Rcpp".

  • Также стоит посмотреть модули Rcpp. Смотрите пример соответствующей виньетки и пакета RcppRedis.

...