2013-08-26 11 views
6

Ho giocato con l'installazione di un pacchetto R che mira a utilizzare Rcpp in RStudio, ma sto cercando di far funzionare correttamente gli elementi con gli attributi Rcpp.Creazione di pacchetti con Rcpp, Attributi non gestiti correttamente

La mia comprensione di come funziona è piuttosto tenue, ma la mia comprensione è la seguente:

  1. Nella sorgente C file ++, è possibile aggiungere Rcpp attributi, per esempio il tag // [[Rcpp::export]] segna una funzione di C++ per l'esportazione , rendendolo disponibile per R.
  2. Quando si crea il pacchetto, Rcpp quindi genera il codice C++ appropriato nel file RcppExports.cpp e le funzioni wrapper nel file di origine R RcppExports.R.

Questo non sembra funzionare correttamente (come mi aspetto) quando costruisco il mio pacchetto. Roxygen non sta giocando bene con questo quando si genera il file NAMESPACE (quindi ho disabilitato quello). Il tag // [[Rcpp::export]] sembra indicare solo la funzione per l'esportazione in R, piuttosto che contrassegnare una funzione per l'esportazione nello spazio dei nomi del pacchetto.

Ancora più importante, il tag Rcpp Attribute // [[Rcpp::depends()]] non viene gestito correttamente. Se copio il codice here in un nuovo file di origine e ricostruisco il pacchetto, gcc genera errori nel file RcppExports.cpp dicendo che l'identificatore BigMatrix non è dichiarato che indica che l'attributo // [[Rcpp::depends(bigmemory)]] non viene gestito correttamente.

Poiché più cose non funzionano come mi aspetterei, cosa mi manca nella mia comprensione dei tag Rcpp Attribute?

+0

Si potrebbe semplicemente scrivere la propria interfaccia di funzione a mano, piuttosto che fare affidamento su Attributi Rcpp e sul suo helper 'compileAttributes()'. Dopotutto, qui c'è un caso speciale (== bisogno di un'intestazione speciale). –

risposta

4

Questo è un problema con il file RcppExports.cpp che viene generato. Al momento, non c'è modo di insegnare a includere i file di intestazione da qualche altra parte, quindi semplicemente non include bigmemory/MatrixAccessor.hpp.

Una soluzione è quella di fare questo:

#include <Rcpp.h> 
#include <bigmemory/MatrixAccessor.hpp> 

Rcpp::NumericVector BigColSums(Rcpp::XPtr<BigMatrix> pBigMat) { 

    // Create the matrix accessor so we can get at the elements of the matrix. 
    MatrixAccessor<double> ma(*pBigMat); 

    // Create the vector we'll store the column sums in. 
    Rcpp::NumericVector colSums(pBigMat->ncol()); 
    for (size_t i=0; i < pBigMat->ncol(); ++i) 
     colSums[i] = std::accumulate(ma[i], ma[i]+pBigMat->nrow(), 0.0); 
    return colSums; 
} 

// [[Rcpp::export]] 
Rcpp::NumericVector BigColSums(SEXP pBigMat){ 
    return BigColSums(Rcpp::XPtr<BigMatrix>(pBigMat)) ; 
} 

Così che si catturare il tipo nel file .cpp e RcppExports.cpp ha solo da sapere su SEXP.

4

// [[Rcpp::export]] non esporta le funzioni nel pacchetto NAMESPACE, dice semplicemente "dovremmo rendere questa funzione disponibile per R" - dipende comunque da voi come volete gestire questa funzione nel vostro spazio dei nomi.

Roxygen funziona per analizzare i tag di roxygen dai commenti del file di origine; dovrai includere un tag //' @export nei tuoi file di origine .cpp, come parzialmente descritto in 3.4 of the attributes vignette.

Per il secondo problema, è ancora necessario per assicurarsi bigmemory è nelle vostre Depends: e LinkingTo: sezioni del file di DESCRIPTION. Suppongo che si potrebbe preferire per // [[Rcpp::depends]] modificare automaticamente il pacchetto DESCRIPTION file, ma è abbastanza facile da fare da soli.

C'è stata anche una discussione simile here nelle schede di aiuto RStudio.

+0

Grazie, questo ha risolto il mio problema con il file 'NAMESPACE' e ho spiegato alcune delle mie lacune nella conoscenza di Roxygen! L'aggiunta di '@useDynLib bigmemory' non risolve il problema. Ho anche ottenuto 'bigmemory' elencato sia come dipendenza che come link nel file' DESCRIPTION'. –

Problemi correlati