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