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

时间:2017-06-15 06:31:35

标签: r rcpp

我试着用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来管理命名空间,请注意它。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是尚未加载Matrix个包。因此,当 Rcpp 搜索 dgCMatrix ctor时,它会显示为空,从而触发您看到的错误。要解决这个问题,您只需在每个会话开始时加载Matrix库一次。 e.g。

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

并在dgCMatrix中导入NAMESPACE定义。

importClassesFrom(Matrix, dgCMatrix)