Rcpp函数如何调用另一个Rcpp函数?

19

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

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

// [[Rcpp::export]]

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

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

但是,当我尝试在R中调用F2时,会出现以下错误:

Error in .Primitive(".Call") (

F2 is missing

第一个.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;
}

这个描述不够清晰,请展示你尝试使用的代码。 - Romain Francois
谢谢。我现在明白你想做什么了。 - Romain Francois
1
感谢分享代码。你在这里做的事情在普通的C++中也不会起作用,因为第二个C++文件没有F1的声明。通常,人们会在头文件中有公共声明。Romain在他的回答中展示的方法是可行的,但必须考虑到它是一种hack。学习多文件C++项目。或者将所有内容放在一个文件中。 - Dirk Eddelbuettel
你可以为第一个脚本创建头文件,比如说 first.h,并在第二个 cpp 文件中写入 #include "a.h" 以导入第一个文件中的函数。通常,“a.h”声明函数的签名,“a.cpp”实现它。 - Kota Mori
2个回答

15

只需将两个函数放在同一个.cpp文件中,或开始制作程序包。

如果您坚持使用单独的.cpp文件,则F2不知道F1的存在。您可以将F1作为R函数调用回来,但这不会很高效,而且您还需要处理将输出转换为双精度等问题...

#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 文件中。


5

有几点需要注意:

  • Rcpp Attributes不是将C++函数导出到R的唯一方法。

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

  • Rcpp Attributes具有导出到C++的能力,请参见vignette中的Rcpp::interfaces()

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接