Rcpp导出模块未公开

Rcpp exported module not exposed

本文关键字:模块 Rcpp      更新时间:2023-10-16

我有一个叫做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>
$