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

How to create instances of S4 classes from R packages in Rcpp code

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

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

S4 foo() {
    S4 s("dgCMatrix");
    return s;
}

但在我的例子中这失败了

Error in getClass("dgCMatrix") : “dgCMatrix” is not a defined class

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

// [[Rcpp::depends(Matrix)]]

以及包说明中 Matrix 的 Imports 和 LinkingTo 指令,但我仍然遇到相同的错误。如何从 Rcpp 中的 R classes 创建实例?

更新:如果不加载 Matrix,则需要在命名空间中导入以下 coatless' 、classes:

//' @importClassesFrom Matrix dgCMatrix
// [[Rcpp::export]]
S4 foo() {
    S4 s("dgCMatrix");
    return s;
}

在您使用 Roxygen2 管理命名空间的情况下处理它。

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

library("Matrix")
sourceCpp("path/to/S4_declaration.cpp")

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

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

下工作
#include <Rcpp.h>

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


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

当你将它移动到 R 包中时,确保你在 DESCRIPTION

中导入 Matrix
Imports:
    Matrix

并在 NAMESPACE 中导入 dgCMatrix 定义。

importClassesFrom(Matrix, dgCMatrix)