2013-11-02 52 views
11

我猜这是一个简单的问题,但我是新来的Cpp,并卡住了。rcpp函数调用另一个rcpp函数

我创建了一个R A功能,采用RCPP和:

// [[Rcpp::export]] 

我可以调用R中的功能和它的作品如预期。我们称之为F1

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

但是,当我尝试调用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; 
} 
+0

这是含糊不清的。请显示您尝试使用的代码。 –

+0

谢谢。我明白你现在要做的是什么。 –

+1

感谢您分享代码。你在这里做的事情不会在普通的C++中工作,要么第二个C++文件没有F1的声明。通常,人们可以在标题中使用通用声明。罗曼在他的回答中表现出的作品,但必须被认为是黑客。了解多文件C++项目。或者把东西放在一个文件中。 –

回答

8

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

3

几点:

  • RCPP属性是出口C++函数R.

  • RCPP属性重命名功能,使用verbose=TRUE参数并看到的唯一途径结果。这些函数名称是随机的,但是...

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

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

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