rcpp函数调用另一个rcpp函数

时间:2013-11-02 19:08:14

标签: r rcpp

我猜这是一个简单的问题,但我是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 个答案:

答案 0 :(得分:10)

只需将两个函数放在同一个.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文件中。

答案 1 :(得分:4)

几点:

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

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

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

所以如果你想坚持似乎是单向的属性。否则,请拨打要呼叫fworker()的功能,f1()将其呼叫(并且f1()在R中可用)并f2()呼叫fworker()。但是你应该能够做得更好。

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