【发布时间】: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?