RcppModules:手动构建/公开C +类到R

时间:2015-10-12 21:23:28

标签: c++ r rcpp

目标是将相当大的现有C ++类集合包装成可从R调用。第一种方法是手动定义R引用类并调用" SEXP-wrapped"入口点 - 这工作正常,没有问题。我目前正在评估的另一种方法是RcppModules。我可以使用Rcpp::SourceCPP中的玩具示例在R 中成功使用它。但手动执行此操作会有麻烦。例如:

//---example.cpp

#include "Rcpp.h"

using namespace Rcpp;

class Example
{
  public:
    Example(){};

    SEXP add(SEXP x_, SEXP y_) const
    {
      double x = as<double>(x_);
      double y = as<double>(y_);

      double res = x + y;
      return wrap(res);
    }
};

RCPP_MODULE(Example_Module) {
  class_<Example>( "Example" )
  .constructor()
  .method( "add", &Example::add )
  ;
}

然后构建/编译:

g++ "-I...\\R\\win-library\\3.2\\Rcpp\\include" "-I...\\R\\R-3.2.2\\include" -O0 -g3 -Wall -c -fmessage-length=0 -o example.o "..\\example.cpp" 
g++ -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic -lR -shared "-L...\\R\\R-3.2.2\\bin\\x64" -o example.dll example.o -lR 

生成example.dll,没有警告/错误......

然后,按照Rcpp::SourceCPP(带verbose = TRUE)的命令,加载dll并填充环境:

`.example` <- dyn.load('example.dll')

library(Rcpp)
populate( Rcpp::Module("Example_Module",`.example`), environment() )

populate的最后一次调用导致R(在RStudio内)崩溃。

据我了解,除了二进制文件之外,Rcpp还必须创建包含生成的R类的R代码,然后将其加载到环境中。有没有办法看到这段代码? 是否有可能(适合)使用R外部的RcppModule来包装大量的C ++类? 最后一个问题是现有的C ++代码显然是在包含类声明的头文件和包含类方法实现的源文件中分开的。在这种情况下可以应用RcppModules吗? - 我见过的所有例子都在一个cpp文件中。

由于

1 个答案:

答案 0 :(得分:3)

感谢@nrussell为您提供了一些澄清。您的上一条评论还有一些我将简要回答的具体问题:

1)是的,RCPP_MODULE总是在头文件中使用。请参阅CRAN上的各种示例包,并使用r-pkg.org进行搜索。

2)是的。使用包。在这里看到几十个答案,建议一个包。不要用手做。不要手动编写Makefile。使用包。

3)没有罐头的答案。

环顾四周,研究一下Rich FitzJohn的RcppR6 明确地为许多本地类的用例编写,其中Rcpp模块在加载时变得太慢。

我的一些软件包使用Rcpp模块,但这些软件包相对较小。

对于扩展讨论,请订阅并发布rcpp-devel列表。