Rcpp导出模块未公开
Rcpp exported module not exposed
我有一个叫做multicool的R包,它处理多集的置换。目前,在内部,存在一个c++类,对initMC的调用创建了一个类Multicool的新对象,然后可以做我需要它做的所有事情。然而,没有简单的方法来释放分配给这个对象的内存。对于简单的使用来说,这并不重要,但我有一个应用程序可能会调用这个函数几十万次。
我认为,解决方案是使用Rcpp模块将类公开给R。然而,我试着按照说明,我得到了错误:
错误:对象'mcModule'未找到
最初-我只想公开对象及其构造函数。这是我的类定义
#include <Rcpp.h>
using namespace Rcpp;
using namespace std;
class Multicool{
struct list_el {
int v;
struct list_el * n;
};
typedef struct list_el item;
item *h;
item *t;
item *i;
int *m_pnInitialState;
int *m_pnCurrState;
int m_nLength;
bool m_bFirst;
public:
// constructor
Multicool(IntegerVector x){
int nx = (int)x.size();
}
};
然后用
导出类和构造函数RCPP_MODULE(mcModule){
using namespace Rcpp;
class_<Multicool>("Multicool")
.constructor<IntegerVector>()
;
}
我已经添加了
一行import(Rcpp)
到我的命名空间文件
我添加了
RcppModules: mcModule
到我的DESCRIPTION文件
和我已经添加了一个调用loadRcppModules在.onLoad函数
.onLoad <- function(libname, pkgname) {
loadRcppModules()
}
所有这些编译和包的构建都没有问题。但是当我要创建一个新的Multicool对象时我得到了前面提到的错误
> library(multicool)
> Multicool = mcModule$Multicool
Error: object 'mcModule' not found
任何帮助或建议将不胜感激
您通常需要首先调用new
。查看我的RcppRedis包:
RCPP_MODULE(Redis) {
Rcpp::class_<Redis>("Redis")
.constructor("default constructor")
[...stuff omitted for brevity...]
;
}
其中R代码(例如在demo/
目录中)执行
suppressMessages(library(RcppRedis))
redis <- new(Redis)
之后,您可以访问功能redis$foo()
等是模块的一部分。
所以试着添加
mcModule <- new(mcModule)
访问mcModule$Multicool
。
编辑:看起来你错过了loadModule("mcModule", TRUE)
的呼叫。
编辑2:为了更明确,我将您的文件添加到包中的(工作)testRcppModule
中,并对您所做的一个更改(对DESCRIPTION
)和一个R文件进行更改以加载模块:
edd@max:/tmp/rcpp/module$ diff -ru ~/git/rcpp/inst/unitTests/testRcppModule/ testRcppModule/
diff -ru /home/edd/git/rcpp/inst/unitTests/testRcppModule/DESCRIPTION testRcppModule/DESCRIPTION
--- /home/edd/git/rcpp/inst/unitTests/testRcppModule/DESCRIPTION 2015-08-26 15:53:03.891830292 -0500
+++ testRcppModule/DESCRIPTION 2015-10-22 21:34:23.716959638 -0500
@@ -10,6 +10,6 @@
LazyLoad: yes
Depends: methods, Rcpp (>= 0.8.5)
LinkingTo: Rcpp
-RcppModules: RcppModuleWorld, stdVector, NumEx
+RcppModules: RcppModuleWorld, stdVector, NumEx, mcModule
Packaged: 2010-09-09 18:42:28 UTC; jmc
diff -ru /home/edd/git/rcpp/inst/unitTests/testRcppModule/R/zzz.R testRcppModule/R/zzz.R
--- /home/edd/git/rcpp/inst/unitTests/testRcppModule/R/zzz.R 2015-08-26 15:53:03.891830292 -0500
+++ testRcppModule/R/zzz.R 2015-10-22 21:41:41.468532838 -0500
@@ -8,4 +8,5 @@
loadModule("RcppModuleNumEx", TRUE)
loadModule("RcppModuleWorld", TRUE)
loadModule("stdVector", TRUE)
+loadModule("mcModule", TRUE)
Only in testRcppModule/src: multicool.cpp
edd@max:/tmp/rcpp/module$
有了这个,一切都很好:
$ r --package testRcppModule --eval 'm <- new(mcModule); print(m)'
C++ object <0x757d18> of class 'mcModule' <0x1adeab0>
$
相关文章:
- 尝试导入pybind-opencv模块时出现libgtk错误
- 如何使用Rcpp将R函数转换为C++函数
- rcpp函数中的清理时间很长
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 内联如何影响模块接口中的成员函数
- C++返回 Numpy 数组的 Python 扩展模块
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 从 Rcpp Catch 测试中获取有关"inst/extdata"的数据
- 如何从线程中的不同模块调用函数?
- 如何使用 soong 命名空间来有条件地编译模块
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- CMake - 模块 + 库混淆
- 混合 Rcpp 模块和 Rcpp::export
- r-使用Rcpp模块公开带有引用参数的c++类方法时出错
- r-使用Rcpp模块公开C++类
- 加载Rcpp模块
- Rcpp导出模块未公开
- 使用Rcpp创建模块时出错