目标是将相当大的现有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文件中。
由于
答案 0 :(得分:3)