【问题标题】:RcppModules: Manually build/expose C+ classes to RRcpp 模块:手动构建/公开 C++ 类到 R
【发布时间】:2015-10-12 21:23:28
【问题描述】:

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

//---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 外部的 RcppModules 来包装大量 C++ 类? 最后一个问题是,现有的 C++ 代码显然分为包含类声明的头文件和包含类方法实现的源文件。在这种情况下可以应用 RcppModules 吗? - 我看到的所有示例都在一个 cpp 文件中。

谢谢

【问题讨论】:

  • 为什么需要手动操作?
  • 因为我有大量现有的 C++ 类库。我看不到如何向 R 公开并在 R 中编译 ~100 个文件...
  • 嗯,我想我不太清楚你在问什么。
  • 一般问题是如何使用 RcppModules 来公开包装器 ~100 个 C++ 类,这些类的声明/实现放在 .h/.cpp 文件中
  • 自动化东西不是问题。我的问题包括:1)可以在 c++ 头文件中使用RCPP_MODULE; 2) 可以不用SourceCpp来完成吗? 3) 怎么能看到由 Rcpp 代码为 R 类生成的......等等。我看不到使用 SourceCpp 从 R 编译和填充单个 CPP 文件如何扩展到包含头/源文件中的许多类的真实 C++ 库。假设我在头文件中声明的 Example 类与在源文件中的实现完全相同 - 在这种情况下我将如何使用 Rcpp?

标签: c++ r rcpp


【解决方案1】:

感谢@nrussell 让您在这里进行一些澄清。您最后的评论有几个更具体的问题,我将简要回答:

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

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

3) 对此没有固定答案。

环顾四周并学习,例如Rich FitzJohn 的 RcppR6专门为许多本地类的用例编写,其中 Rcpp 模块在加载时变得太慢。

我的几个包使用 Rcpp 模块,但这些都是相对较小的包。

如需扩展讨论,请订阅并在 rcpp-devel 列表上发帖。

【讨论】:

  • Dirk - 感谢您的 cmets。只是为了确保-in 1)您的意思是在源(cpp)文件中? - 在头文件中RCPP_MODULE 时从未见过一个示例。对于 3)我应该将其视为“接近否”吗? - 我看不到生成的类?当然,我会尝试对此进行更多调查并转到邮件列表。我还查看了 RCPP_MODULES+packages 的文档——它真的很简短……不太清楚如何开始处理大型现有代码
  • 啊,是的,RCPP_MODULE 的 cpp 文件。
  • 我终于解决了使用Rcpp::XPtr智能指针和其他类型编写“胶水”函数,然后手动开发R6类。这一切对我来说都很好。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多