我正在尝试从Rcpp代码中创建一个sparseMatrix的实例。
我理解,为了创建S4对象,我们使用所需类的名称作为字符串调用S4构造函数,例如:
S4 foo() {
S4 s("dgCMatrix");
return s;
}但在我的例子中
Error in getClass("dgCMatrix") : “dgCMatrix” is not a defined class我想这是因为矩阵包还没有加载吧?我试过添加
// [[Rcpp::depends(Matrix)]]以及包描述中对矩阵的导入和LinkingTo指令,但我仍然得到相同的错误。如何从Rcpp内部的R类创建实例?
更新:在coatless‘answer之后,如果要加载矩阵,则需要在命名空间中导入类:
//' @importClassesFrom Matrix dgCMatrix
// [[Rcpp::export]]
S4 foo() {
S4 s("dgCMatrix");
return s;
}如果您使用Roxygen2来管理名称空间,就会处理它。
发布于 2017-06-15 16:19:57
您正在运行的问题是尚未加载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并在dgCMatrix中导入NAMESPACE定义。
importClassesFrom(Matrix, dgCMatrix)https://stackoverflow.com/questions/44560198
复制相似问题