rcpp函数调用另一个rcpp函数

Sco*_*ott 14 r rcpp

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

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

// [[Rcpp::export]]
Run Code Online (Sandbox Code Playgroud)

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

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

但是当我试着打电话给F2R时,我得到:

.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;
}
Run Code Online (Sandbox Code Playgroud)

以下是另一个.cpp文件.

#include <Rcpp.h>
using namespace Rcpp;

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

  result = F1(a);

  return result;
}
Run Code Online (Sandbox Code Playgroud)

Rom*_*ois 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;
}
Run Code Online (Sandbox Code Playgroud)

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


Dir*_*tel 5

几点:

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

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

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

因此,如果您想坚持使用属性,这似乎是一种方法。否则调用您想要调用的函数fworker(),调用f1()它(并且f1()在 R 中可用)并f2()调用fworker()。但你应该能够做得更好。

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