2017-06-15 21 views
0

我正在用Rcpp試圖從Rcpp代碼中創建sparseMatrix的實例,讓自己的腳變得溼潤。如何在Rcpp代碼中創建R包的S4類的實例

據我所知,爲了創造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類的實例?

UPDATE:以下coatless'answer,類需要在命名空間被導入,如果Matrix是不被加載:

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

的情況下,照顧它使用的是Roxygen2管理的命名空間。

+0

咦?這個表達式應該表示什麼:'S4 s(「dgCMatrix」)'......需要更多的代碼。 –

+0

您不要在那裏調用構造函數'Matrix'。要麼從Rcpp調用這個R函數,要麼在C++中創建自己的構造函數。或者使用Armadillo的稀疏矩陣類。 – Roland

+0

在[Rcpp Gallerty](http://gallery.rcpp.org)上有_e.g._的例子。 –

回答

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 

並導入dgCMatrix定義在NAMESPACE

importClassesFrom(Matrix, dgCMatrix) 
+0

非常感謝你的回答,我在兩分鐘前就明白了:)。我最終使用importClassesFrom(Matrix,dgTMatrix)指令;我瞭解importFrom進口_functions_,而importClasses從進口S4類。無論如何,我正在用roxygen2管理我的NAMESPACE,因此,精確的修改是將'//'@importClassesFrom Matrix dgTMatrix'添加到C++函數頭中,立即在Rcpp :: export屬性之上。另外,只要您確保在NAMESPACE中導入ClassesFrom,我不認爲*** R部分是非常必要的。 – gorgonzola

+0

呃。感謝您收到導入指令snafu。我已經更新了答案。 – coatless