18

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

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

// [[Rcpp::export]]

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

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

但是当我尝试调用F2R 时,我得到:

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

2 回答 2

14

只需将两个函数放在同一个.cpp文件中,或者开始处理一个包。

如果你坚持单独的.cpp文件,那么F2不知道 F1。您可以作为 R 函数回调F1,但这不会那么高效,您将不得不处理将输出转换为双精度等问题......

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

于 2013-11-02T20:43:08.090 回答
4

几点:

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

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

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

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

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

于 2013-11-02T19:18:33.273 回答