Здесь есть несколько вопросов, связанных между собой. В частности, Rcpp атрибуты не обрабатывает экспорт шаблонных функций, так что вы не можете написать:
// [[Rcpp::export]]
template <typename T>
void MyFunc(T object) { ... }
Это происходит потому, что набрав в R является динамическим (сделано и хранятся во время выполнения), что C++ типирование статично (все должно быть известный во время компиляции). Вам необходимо вручную создать мост между динамическим и статическим мирами.
Общим подходом является создание функции шаблона и функции «отправки», например.
template <typename T>
void MyFuncImpl(T object) { .... }
// [[Rcpp::export]]
void MyFunc(SEXP object)
{
switch (TYPEOF(object))
{
case INTSXP: return MyFuncImpl<IntegerVector>(object);
case REALSXP: return MyFuncImpl<NumericVector>(object);
...
}
}
В вашем случае, вы, возможно, потребуется, чтобы отделить отправку в зависимости от того объект, передаваемый в это матрица, например, if (Rf_isMatrix(object)) { ... } else { .... }
.
Вы можете найти эти статьи, посвященные Rcpp gallery полезно:
Как и в сторону - если вы хотите, чтобы шаблон непосредственно на базовый тип объекта R, вы также можете написать:
template <int RTYPE>
void MyFuncImpl(Vector<RTYPE> object) { .... }
, который может быть или не быть более полезным, в зависимости от ваших потребностей.
Извините, что проблема возникает неоднозначно. Это, наверное, так просто, что он бросает людей на цикл, и мне в основном интересно, как получить шаблонную матрицу. Был добавлен некоторый код. – Coat
Учитывая обновление, я думаю, теперь на вопрос можно ответить правильно. –
Согласен, @KevinUshey. Похоже на обычный шаблон-на-снаружи, но динамический-диспетчер-на-внутри из-за того, что C является C, а R выполняется в R. –