реализация функции применения в Rcpp

Я пытался реализовать функцию применения в Rcpp, пока код выглядит так

//[[Rcpp::export]]
NumericVector apply(NumericMatrix x,int dim,Function f){
NumericVector output;
if(dim==1){
for(int i=0;i<x.nrow();i++){
output[i]=f(x(i,_));
}
}
else if(dim==2){
for(int i=0;i<x.ncol();i++){
output[i]=f(x(_,i));
}
}
return(output);
}

но я получаю сообщение об ошибке «невозможно преобразовать SEXP в удвоение в присваивании» в строках 6 и 11. Есть ли способ преобразовать значение, возвращаемое произвольной функцией, в удвоение? также есть функция сахара для функции применения.

3

Решение

Там нет функции сахара для apply, Самый простой способ сделать то, что вы хотите, это позвонить as<double>т.е.

output[i]=as<double>(f(x(i,_)));

Вы также можете вставить это в тип, который будет вызывать as для вас что-то вроде:

template <typename T>
class F {
public:
F( SEXP f_) : f(f_){}

inline T operator()(NumericVector x){
return as<T>(f(x)) ;
}

private:
Function f ;
} ;

чтобы вы могли сделать:

// [[Rcpp::export]]
NumericVector apply_cpp(NumericMatrix x,int dim,F<double> f){
if(dim==1){
NumericVector output(x.nrow());
for(int i=0;i<x.nrow();i++){
output[i]=f(x(i,_));
}
return output ;
}
else {
NumericVector output(x.ncol());

for(int i=0;i<x.ncol();i++){
output[i]=f(x(_,i));
}
return output ;
}
}

F Шаблон сверху предполагает, что функция принимает NumericVector и возвращает что-то, что может быть преобразовано в double, Вы также можете вставлять информацию о типе как входов, так и выходов. Примерно так (выражено в C ++ 11):

template <typename T, typename... Args>
class F {
public:
F( SEXP f_) : f(f_){}

inline T operator()(Args... args){
return as<T>(f(args...)) ;
}

private:
Function f ;
} ;

Тогда подпись станет:

// [[Rcpp::export]]
NumericVector apply_cpp(NumericMatrix x,int dim,F<double,NumericVector> f){
4

Другие решения

Ответы, по порядку, «да» и «да», и вы можете прочитать «Введение в Rcpp», которое содержит следующее lapply() пример:

R> src <- '
+   Rcpp::List input(data);
+   Rcpp::Function f(fun);
+   Rcpp::List output(input.size());
+   std::transform(input.begin(), input.end(), output.begin(), f);
+   output.names() = input.names();
+   return output;
+   '
R> cpp_lapply <- cxxfunction(signature(data = "list", fun = "function"),
+    src, plugin = "Rcpp")

Это было написано для inline, а не Rcpp Attributes, потому что именно так мы откатились в течение дня. В других примерах и модульных тестах у нас есть больше похожих на приложения функций …

Вы не указали какие аргументы ваша функция f() принимает и возвращает, что делает решение вашего вопроса немного сложнее.

2

По вопросам рекламы [email protected]