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

Posted

技术标签:

【中文标题】将 C++ 函数用作由导出的 Rcpp 函数调用的另一个 C++ 函数的参数【英文标题】:Use a C++ function as an argument for another C++ function called by an exported Rcpp function 【发布时间】:2019-04-26 03:32:12 【问题描述】:

我看到可以使用 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 时,我收到以下错误:

无法将 'f1' 从 'arma::mat ()(arma::mat&)' aka 'arma::Mat ()(arma::Mat&)' 转换为 ' Rcpp::Function' aka 'Rcpp::Function_Impl'

【问题讨论】:

【参考方案1】:

这是使用 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

【讨论】:

函数指针的良好参考备忘单:https://f**kingfunctionpointers.com/。不确定是否允许发誓,但 URL 中有 f 字:O【参考方案2】:

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

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

    Rcpp::Function 类型的参数添加到f3,用于调用f2

    使用Rcpp::EnvironmentRcpp:Function 获取适当的R 函数。

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

【讨论】:

以上是关于将 C++ 函数用作由导出的 Rcpp 函数调用的另一个 C++ 函数的参数的主要内容,如果未能解决你的问题,请参考以下文章

我的带有 Rcpp::List 输入的 C++ 函数非常慢

使用 Rcpp 在 C++ 函数的 R 中使用 for 循环的内存问题

rcpp中没有匹配的调用函数

在构建 R 包时从另一个 Rcpp 函数调用 Rcpp 函数

C++ Primer 5th笔记(chap 19 特殊工具与技术)将成员函数用作可调用对象

在包 BAR 中使用 R 包 FOO 中的 C++ 代码的最佳方法