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

问题描述 投票: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_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'}

rcpp rcpparmadillo
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

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:Function和qazxswpoi获得适当的R函数。

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

© www.soinside.com 2019 - 2024. All rights reserved.