1

我看到可以使用 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'}

4

2 回答 2

3

这是使用 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
于 2019-04-26T17:34:20.563 回答
2

错误消息说明了一切:对于 C++f1来说,它是一个函数,它需要一个arma::mat as 参数并返回一个arma::mat. 这与 完全不同Rcpp::Function,后者是 R 函数的薄包装器。我看到了三种可能性:

  1. f2编写一个需要函数指针或std::function(需要 C++11)具有适当参数的替代函数。

  2. 添加一个在调用中使用Rcpp::Function的类型参数。f3f2

  3. Rcpp::Environment使用和获得适当的 R 函数Rcpp:Function

如果没有关于用例的更多信息,很难提供更多建议。

于 2019-04-26T08:27:38.493 回答