我猜这是一个简单的问题,但我是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;
}
答案 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包装器手动导出函数。