问题 rcpp函数调用另一个rcpp函数


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

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

// [[Rcpp::export]]

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

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

但是当我试着打电话的时候 F2 在R中,我得到:

.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;
}

7991
2017-11-02 19:08


起源

这很模糊。请显示您尝试使用的代码。 - Romain Francois
谢谢。我明白你现在要做什么。 - Romain Francois
感谢您分享代码。你在这里做什么在普通的C ++中不起作用或者第二个C ++文件没有F1的声明。通常,在标头中会有一个共同的声明。 Romain在他的回答中表现出什么,但必须被认为是黑客。了解多文件C ++项目。或者将事物保存在一个文件中。 - Dirk Eddelbuettel
实际上,您可以为第一个脚本创建头文件 first.h 和写 #include "a.h" 在第二个cpp文件中导入第一个函数。通常,“a.h”声明函数的签名,“a.cpp”实现它。 - Kota Mori


答案:


只需将两个功能放在一起 .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 文件。


8
2017-11-02 20:43





几点:

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

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

  • Rcpp Attributes具有导出到C ++的能力,请参阅 Rcpp::interfaces() 在小插图中。

所以,如果你想坚持似乎是一种方式的属性。否则,请调用您要呼叫的功能 fworker()f1() 叫它(和 f1() 在R)中可用并且有 f2() 呼叫 fworker()。但你应该能够做得更好。

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


4
2017-11-02 19:18