【问题标题】:rcpp function calling another rcpp functionrcpp 函数调用另一个 rcpp 函数
【发布时间】:2013-11-13 18:34:16
【问题描述】:

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

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

// [[Rcpp::export]]

我可以在 R 中调用该函数,它按预期工作。我们就叫它F1吧。

接下来,我想使用调用第一个函数的Rcpp 创建另一个函数F2。我使用标准函数调用语言(即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;
}

【问题讨论】:

  • 这是模糊的。请显示您尝试使用的代码。
  • 谢谢。我明白你现在想做什么。
  • 感谢分享代码。您在此处所做的操作不适用于普通 C++,或者第二个 C++ 文件没有 F1 声明。通常,在标题中会有共同的声明。罗曼在他的回答中显示的内容有效,但必须被视为一种黑客行为。了解多文件 C++ 项目。或者将内容保存在一个文件中。
  • 您实际上可以为第一个脚本创建头文件,例如first.h,然后在第二个cpp 文件中写入#include "a.h" 以导入第一个中的函数。通常,“a.h”声明函数的签名,“a.cpp”实现它。

标签: r rcpp


【解决方案1】:

几点:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2019-01-17
      相关资源
      最近更新 更多