首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Rcpp代码中的R包创建S4类的实例

如何从Rcpp代码中的R包创建S4类的实例
EN

Stack Overflow用户
提问于 2017-06-15 06:31:34
回答 1查看 499关注 0票数 1

我正在尝试从Rcpp代码中创建一个sparseMatrix的实例。

我理解,为了创建S4对象,我们使用所需类的名称作为字符串调用S4构造函数,例如:

代码语言:javascript
复制
S4 foo() {
    S4 s("dgCMatrix");
    return s;
}

但在我的例子中

代码语言:javascript
复制
Error in getClass("dgCMatrix") : “dgCMatrix” is not a defined class

我想这是因为矩阵包还没有加载吧?我试过添加

代码语言:javascript
复制
// [[Rcpp::depends(Matrix)]]

以及包描述中对矩阵的导入和LinkingTo指令,但我仍然得到相同的错误。如何从Rcpp内部的R类创建实例?

更新:在coatlessanswer之后,如果要加载矩阵,则需要在命名空间中导入类:

代码语言:javascript
复制
//' @importClassesFrom Matrix dgCMatrix
// [[Rcpp::export]]
S4 foo() {
    S4 s("dgCMatrix");
    return s;
}

如果您使用Roxygen2来管理名称空间,就会处理它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-15 16:19:57

您正在运行的问题是尚未加载Matrix包。因此,当Rcpp搜索dgCMatrix ctor时,它会变为空,从而触发您看到的错误。为了解决这个问题,您可以在每个会话开始时只加载一次Matrix库。例如:

代码语言:javascript
复制
library("Matrix")
sourceCpp("path/to/S4_declaration.cpp")

或者,您可以在正在执行的sourceCpp编译中添加一个负载调用。这有点极端,因为您只需要加载一次库。

尽管如此,以下内容应该始终在sourceCpp()下工作

代码语言:javascript
复制
#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::S4 make_dgCMatrix() {
  Rcpp::S4 s("dgCMatrix");
  return s;
}


/*** R
library("Matrix")
make_dgCMatrix()
*/

将其移到R包中时,请确保将Matrix包导入到DESCRIPTION

代码语言:javascript
复制
Imports:
    Matrix

并在dgCMatrix中导入NAMESPACE定义。

代码语言:javascript
复制
importClassesFrom(Matrix, dgCMatrix)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44560198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档