我看到可以使用Rcpp将R函数作为参数传递给C ++。例如,你可以这样做:
// [[Rcpp::export]]
arma::mat example_cpp_func(Rcpp::Function my_r_func, arma::mat a){
return Rcpp::as<arma::mat>(my_r_func(a));
}
这很好,但我正在寻找一些略有不同的东西。
让我们以下功能:
arma::mat f1(arma::mat& a){
return a;
}
arma::mat func_2(Rcpp::Function g, arma::mat a){
return Rcpp::as<arma::mat>(g(a));
}
我想使用func_2
作为参数在第三个函数中调用func_1
。那可能吗?例如,我正在寻求:
// [[Rcpp::export]]
arma::mat func_3(arma::mat a){
return func_2(func_1, a);
## ^^^^ Pass a C++ function as a parameter
}
这是可能的R,但当我尝试使用Rcpp / RcppArmadillo时,我收到以下错误:
无法将'f1'从'arma :: mat()(arma :: mat&)'{aka'arma :: Mat()(arma :: Mat&)'}转换为'Rcpp :: Function'{aka'Rcpp: :Function_Impl'}
这是使用Ralf在#1中编写的方法的完整示例。你可以在这里使用纯C / C ++函数指针,尽管你可以用C ++ 11做更复杂的事情。
#include<RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
typedef arma::mat (*functype)(arma::mat&);
arma::mat f1(arma::mat& a){
return a+1;
}
arma::mat f2(functype g, arma::mat a){
return g(a);
}
//[[Rcpp::export]]
arma::mat f3(arma::mat a){
return f2(f1, a);
}
R方:
> f3(matrix(1))
[,1]
[1,] 2
错误消息说明所有:对于C ++ f1
是一个函数,它期望arma::mat
作为参数并返回一个arma::mat
。这与Rcpp::Function
完全不同,f2
是一个围绕R函数的薄包装器。我看到三种可能性:
std::function
函数,它需要一个带有适当参数的函数指针或Rcpp::Function
(需要C ++ 11)。f3
类型的参数添加到f2
中,该参数用于调用Rcpp::Environment
。Rcpp:Function
和qazxswpoi获得适当的R函数。如果没有关于用例的进一步信息,很难提供更多建议。