使用 C++ 函数作为由导出的 Rcpp 函数调用的另一个 C++ 函数的参数
Use a C++ function as an argument for another C++ function called by an exported Rcpp function
我看到可以使用 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_1
作为参数的第三个函数中调用 func_2
。那可能吗?例如,我想做的是:
// [[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 时,出现以下错误:
could not convert ‘f1’ from ‘arma::mat ()(arma::mat&)’ {aka ‘arma::Mat ()(arma::Mat&)’} to ‘Rcpp::Function’ {aka ‘Rcpp::Function_Impl’}
错误消息说明了一切:对于 C++ f1
是一个需要 arma::mat
作为参数并且 returns 需要 arma::mat
的函数。这与 Rcpp::Function
完全不同,后者是 R 函数的薄包装。我看到三种可能性:
编写一个替代 f2
函数,它需要一个函数指针或 std::function
(需要 C++11)和适当的参数。
向 f3
添加一个 Rcpp::Function
类型的参数,用于调用 f2
.
使用 Rcpp::Environment
和 Rcpp:Function
获得合适的 R 函数。
没有关于用例的更多信息,很难提供更多建议。
这是一个使用 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);
}
右方:
> f3(matrix(1))
[,1]
[1,] 2
我看到可以使用 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_1
作为参数的第三个函数中调用 func_2
。那可能吗?例如,我想做的是:
// [[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 时,出现以下错误:
could not convert ‘f1’ from ‘arma::mat ()(arma::mat&)’ {aka ‘arma::Mat ()(arma::Mat&)’} to ‘Rcpp::Function’ {aka ‘Rcpp::Function_Impl’}
错误消息说明了一切:对于 C++ f1
是一个需要 arma::mat
作为参数并且 returns 需要 arma::mat
的函数。这与 Rcpp::Function
完全不同,后者是 R 函数的薄包装。我看到三种可能性:
编写一个替代
f2
函数,它需要一个函数指针或std::function
(需要 C++11)和适当的参数。向
f3
添加一个Rcpp::Function
类型的参数,用于调用f2
.使用
Rcpp::Environment
和Rcpp:Function
获得合适的 R 函数。
没有关于用例的更多信息,很难提供更多建议。
这是一个使用 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);
}
右方:
> f3(matrix(1))
[,1]
[1,] 2