首页 文章

rcpp函数调用另一个rcpp函数

提问于
浏览
11

我猜这是一个简单的问题,但我是Cpp的新手,我被卡住了 .

我在R中创建了一个函数,使用Rcpp和:

// [[Rcpp::export]]

我可以调用R中的函数,它可以按预期工作 . 我们称之为 F1 .

接下来,我想创建另一个函数 F2 ,使用 Rcpp 调用第一个函数 . 我使用标准函数调用语言(即 F1(arguments)) ,当我使用 sourceCpp() 时,它通过R编译得很好 .

但是当我尝试在R中调用 F2 时,我得到:

.Primitive中出错(“ . Call”)(

F2缺失

第一个 .cpp 文件包含

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F1(NumericVector a) {
  int n = a.size();
  double result=0;  // create output vector
  double ss = 0;

  for(int i = 0; i < n; ++i) {
    ss += pow(a[i],2);
  }

  result = ss;
  return result;
}

以下是另一个.cpp文件 .

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F2(NumericVector a) {
  double result=0;

  result = F1(a);

  return result;
}

2 回答

  • 4

    只需将两个函数放在同一个 .cpp 文件中,或者开始处理包 .

    如果您坚持单独 .cpp 文件,那么 F2 不知道F1 . 您可以回拨 F1 作为R函数,但这不会那么高效,您将不得不处理将输出转换为double等等...

    #include <Rcpp.h>
    using namespace Rcpp;
    
    // [[Rcpp::export]]
    double F2(NumericVector a) {
      double result=0;
    
      // grab the R function F1
      Function F1( "F1" ) ; 
      result = as<double>( F1(a) );
    
      return result;
    }
    

    但是真的创建一个包或将所有函数放在同一个 .cpp 文件中 .

  • 9

    几点:

    • Rcpp属性不是将C函数导出到R的唯一方法 .

    • Rcpp属性重命名函数,使用 verbose=TRUE 参数并查看结果 . 这些函数名称是随机的,但......

    • Rcpp属性具有导出到C的能力,请参见插图中的 Rcpp::interfaces() .

    所以,如果你想坚持似乎是一种方式的属性 . 否则调用要调用 fworker() 的函数,调用 f1() (并且 f1() 在R中可用)并调用 f2() fworker() . 但你应该能够做得更好 .

    否则,您当然可以回退到使用显式创建的R包装器手动导出函数 .

相关问题