将C ++函数用作导出的Rcpp函数调用的另一个C ++函数的参数

时间:2019-04-26 03:32:13

标签: rcpp rcpparmadillo

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

2 个答案:

答案 0 :(得分:2)

错误消息说明了所有内容:对于C ++ f1,该函数需要一个arma::mat作为参数并返回一个arma::mat。这与Rcpp::Function截然不同,f2是R函数的薄包装。我看到三种可能性:

  1. 编写一个备用std::function函数,该函数需要一个带有适当参数的函数指针或Rcpp::Function(需要C ++ 11)。

  2. f3的调用中使用类型f2的自变量添加到Rcpp::Environment

  3. 使用Rcpp:Functionreact-csv获得适当的R函数。

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

答案 1 :(得分:2)

这是使用拉尔夫(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