Rcpp 导出模块未暴露

2024-03-07

我有一个名为 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

到我的描述文件

我在 .onLoad 函数中添加了对 loadRcppModules 的调用

.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.

Edit:看来您错过了loadModule("mcModule", TRUE) call.

Edit 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>
$ 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rcpp 导出模块未暴露 的相关文章

随机推荐

  • 如何用新列覆盖 Spark 数据框中的整个现有列?

    我想用一个新列覆盖 Spark 列 该新列是二进制标志 我尝试直接覆盖 id2 列 但为什么它不像 Pandas 中的就地操作那样工作 如何在不使用 withcolumn 创建新列和 drop 删除旧列的情况下做到这一点 我知道 Spark
  • ASP.NET Core 5.0 RouteDataRequestCultureProvider 删除 url 中的默认区域性

    我尝试向我的 asp net core 项目添加多语言功能 但 RequestLocalization 中的 net 3 1 和 5 0 之间存在一些变化 我无法得到我想要的 我为每种语言添加了资源文件 并在我的剃刀页面中使用了资源 它可以
  • Windeployqt 不会为调试应用程序部署 qwindowsd.dll

    我正在尝试使用windeployqt exe Qt 5 13 2 为 CMake 3 16 生成的调试应用程序部署 dll 除了部署的平台插件 dll 之外 所有 dll 均已正确部署qwindows dll代替qwindowsd dll当
  • 系统verilog中的打包向量与未打包向量

    看看我在 System Verilog 中维护的一些代码 我看到一些信号的定义如下 node range hi range lo x 以及其他定义如下 node y range hi range lo 我明白那个x被定义为打包的 而y被定义
  • 对特定行禁用 StyleCop

    我们在 C 项目中使用 StyleCop 但在某些情况下 我们希望避免这些规则 我知道你可以添加
  • 阻止自动化工具访问网站

    我们网站上的数据很容易被窃取 我们如何检测是否有人正在查看网站或工具 一种方法是计算用户在页面上停留的时间 我不知道如何实施 任何人都可以帮助检测并防止自动化工具从我的网站上抓取数据吗 我在登录部分使用了安全图像 但即使如此 人们也可以登录
  • 包 org.springframework.data.repository 不存在 spring boot jpa

    我对 spring boot jpa 有一个小问题 我已将依赖项添加到 POM xml 我可以从 spring 工具套件正常运行它 作为 spring boot 应用程序运行 但是当我从命令行 mvn spring boot run 运行时
  • C++11 中没有“sto{short, unsigned Short}”函数吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 完全奇怪的 Firefox CSS bug

    我从事前端开发很长时间了 以前从未遇到过这样的错误 将以下 HTML 保存到文件并在 Firefox 中查看 我的是 3 6 3 h2 Some normal text strong some bold text strong weird
  • XSLT - 作为一系列节点的参数

    我的目标是将多个文件的名称传递到 XSLT 中并使用document myFile 我试图使用 saxon 引擎在命令行上传递参数 但它不断抛出错误 我知道我可以写出一个清单文件 对其进行处理 然后在完成后将其删除 但这似乎需要大量额外工作
  • 如何检查名称是否已经存在? Azure 资源管理器模板

    是否有可能check 在 ARM 模板中 如果我的虚拟机名称已存在 我正在为 Azure 市场开发解决方案模板 也许可以在其中设置一个参数用户界面定义 uniqe 目标是重现这个绿色钩子 一些注释 VM 名称只需在资源组内唯一 而无需在订阅
  • 如何将编译结果(使用javac)存储到文本文件中?

    我想编译一个Hello World程序 我用javac Hello World java 但是在cmd终端窗口中 它显示 semicolon is missing compilation error 如何将此编译错误存储到文本文件中 或者甚
  • R ggplot:如何将点与躲避条对齐?

    我想知道如何将 geom point 点与 geom bar 躲避条位置对齐 根据年份参数对条形进行躲避 但无论年份参数如何 点都绘制在躲避条形的中间 可重现的代码 set seed 42 dat lt data frame Respons
  • 在 dispose 方法中获取提供者方法不起作用

    我正在尝试访问 dispose 函数中的提供者方法 override void dispose if canRemoveData Provider of
  • JPA 查询中使用 @Transient 访问字段

    我有一个具有瞬态属性的实体 Entity Table name asset public class Asset Transient private String locationIdentifier N A SuppressWarning
  • TypeError:JSON.stringify 无法序列化循环结构。 stringify@[本机代码]

    在我的 React Native Expo 项目中 我遇到一个错误 显示 TypeError JSON stringify 无法序列化循环结构 stringify native code 任何人都可以帮助我解决这个问题吗 我尝试使用一个名为
  • 创建一个模拟 AlarmManager 进行测试

    我希望能够测试一些添加的代码pending intents to the 报警管理器 http developer android com reference android app AlarmManager html但虽然我可以创建自己的
  • 阻止代码并等待事件处理程序触发?

    我正在编写一个使用第三方库来处理一些数据的应用程序 在一个非常简单的示例中 我有一个作为任务运行的方法 如下所示 private void ProcessListOfItems List
  • Excel xml 电子表格 - 是否可以嵌入图像?

    我正在尝试将数据从网络应用程序导出到 Excel 但有人要求在电子表格顶部包含公司的徽标 我创建 Excel 的常规方法是在 Excel 中创建电子表格并将其另存为 Xml 电子表格 Excel 2003 这允许我在代码中构建 xml 但是
  • Rcpp 导出模块未暴露

    我有一个名为 multicool 的 R 包 它可以处理多重集的排列 目前 在内部存在一个 C 类 并且对 initMC 的调用会创建一个 Multicool 类的新对象 然后该对象可以执行我需要它执行的所有操作 但是 没有简单的方法来释放