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

如何从Rcpp代码中的R包创建S4类的实例,r,rcpp,R,Rcpp,Rcpp试图从Rcpp代码中创建sparseMatrix实例,这让我大吃一惊 我了解,为了创建S4对象,我们使用所需类的名称作为字符串调用S4构造函数,例如: S4 foo() { S4 s("dgCMatrix"); return s; } 但在我的情况下,这是失败的 Error in getClass("dgCMatrix") : “dgCMatrix” is not a defined class 我想这是因为矩阵包没有加载?我试着添加 // [[Rcpp::depen

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

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

S4 foo() {
    S4 s("dgCMatrix");
    return s;
}
但在我的情况下,这是失败的

Error in getClass("dgCMatrix") : “dgCMatrix” is not a defined class
我想这是因为矩阵包没有加载?我试着添加

// [[Rcpp::depends(Matrix)]]
以及在包的描述中为矩阵导入和链接到指令,但我仍然得到相同的错误。如何从Rcpp中的R类创建实例

更新:如果不加载矩阵,则需要在命名空间中导入以下类:

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

在您使用Roxygen2管理名称空间时,请注意此问题。

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

library("Matrix")
sourceCpp("path/to/S4_declaration.cpp")
或者,您可以在正在执行的
sourceCpp
编译中添加加载调用。这有点极端,因为您只需要加载库一次

但是,以下内容应始终在
sourceCpp()下工作

并在
命名空间中导入
dgCMatrix
定义

importClassesFrom(Matrix, dgCMatrix)

嗯?这个表达式应该代表什么:
s4s(“dgCMatrix”)
。。。需要更多的代码。你不需要在那里调用构造函数
Matrix
。要么从RCPP调用这个R函数,要么在C++中创建自己的构造函数。或者使用一个稀疏矩阵类从犰狳。有例子,在那里,例如,在@ 42 -它应该是一个C++构造函数。@罗兰我不明白。什么构造器?你是说R的那个?您是说从C++中调用R构造函数作为函数对象吗?我直接从这里提供的示例中提取这一行代码:非常感谢您的回答,我在两分钟前就明白了:)。我最终使用了importClasssfrom(Matrix,dgTMatrix)指令;我从imports函数了解importf,而从imports4类了解importClasses。在任何情况下,我都在用ROXYGEN2管理我的命名空间,因此,精确的修改是将“//@ @ CubCube从矩阵DGTMeMatrix”添加到C++函数头中,高于RCP::ExtPurt属性。另外,我认为***R部分不是真的必要,只要您确保在NAMESPACE.whoops中导入TClasseFrom。谢谢你收听进口指令snafu。我已经更新了答案。
Imports:
    Matrix
importClassesFrom(Matrix, dgCMatrix)