【问题标题】:How to create instances of S4 classes from R packages in Rcpp code如何在 Rcpp 代码中从 R 包创建 S4 类的实例
【发布时间】:2017-06-15 06:31:34
【问题描述】:

Rcpp 试图从 Rcpp 代码中创建一个 sparseMatrix 的实例,这让我大吃一惊。

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

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

但在我的情况下,这失败了

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

我认为这是因为尚未加载 Matrix 包?我已经尝试添加

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

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

更新:在coatless'answer之后,如果不加载Matrix,则需要在命名空间中导入类:

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

如果您使用 Roxygen2 来管理命名空间,请注意它。

【问题讨论】:

  • 嗯?这个表达式应该代表什么:S4 s("dgCMatrix") ...需要更多代码。
  • 你没有在那里调用构造函数Matrix。从 Rcpp 调用此 R 函数或在 C++ 中创建自己的构造函数。或者使用 Armadillo 的稀疏矩阵类。
  • Rcpp Gallerty 上有 个示例例如
  • @42- 它应该是一个 c++ 构造函数。
  • @Roland 我不明白。什么构造函数?你是说R的吗?您的意思是从 C++ 中将 R 构造函数调用为 Function 对象?我直接从此处提供的示例中提取那行代码:gallery.rcpp.org/articles/as-and-wrap-for-sparse-matrices

标签: r rcpp


【解决方案1】:

您遇到的问题是 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 包时,请确保将 Matrix 包导入到 DESCRIPTION

Imports:
    Matrix

并在NAMESPACE 中导入dgCMatrix 定义。

importClassesFrom(Matrix, dgCMatrix)

【讨论】:

  • 非常感谢您的回答,我在两分钟前就知道了 :)。我最终使用了 importClassesFrom(Matrix, dgTMatrix) 指令;我了解 importFrom 导入函数,而 importClassesFrom 导入 S4 类。无论如何,我正在使用 roxygen2 管理我的 NAMESPACE,因此精确的修改是将'//' @importClassesFrom Matrix dgTMatrix' 添加到 C++ 函数头中,就在 Rcpp::export 属性上方。另外,我认为 ***R 部分不是必需的,只要确保在 NAMESPACE 中 importClassesFrom 即可。
  • 哎呀。感谢您了解导入指令的问题。我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多