我猜这是一个简单的问题,但我是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 回答
只需将两个函数放在同一个
.cpp
文件中,或者开始处理包 .如果您坚持单独
.cpp
文件,那么F2
不知道F1 . 您可以回拨F1
作为R函数,但这不会那么高效,您将不得不处理将输出转换为double等等...但是真的创建一个包或将所有函数放在同一个
.cpp
文件中 .几点:
Rcpp属性不是将C函数导出到R的唯一方法 .
Rcpp属性重命名函数,使用
verbose=TRUE
参数并查看结果 . 这些函数名称是随机的,但......Rcpp属性具有导出到C的能力,请参见插图中的
Rcpp::interfaces()
.所以,如果你想坚持似乎是一种方式的属性 . 否则调用要调用
fworker()
的函数,调用f1()
(并且f1()
在R中可用)并调用f2()
fworker()
. 但你应该能够做得更好 .否则,您当然可以回退到使用显式创建的R包装器手动导出函数 .