2013-05-22 5 views
6

Ho un pacchetto R per il quale ho spostato un algoritmo MCMC contenente algebra di matrice su C++ utilizzando il pacchetto RcppEigen che ha notevolmente migliorato la velocità.Come posso migliorare il file Makevars per un pacchetto Rcpp (RcppEigen)?

Tuttavia, R CMD check ha pronunciato la seguente NOTE su Linux (Thanks to R-Forge):

* checking installed package size ... NOTE 
    installed size is 6.6Mb 
    sub-directories of 1Mb or more: 
    libs 6.1Mb 

Questo avviso non è probabilmente guidato dalle dimensioni incredibili del mio codice C++ (which is only around 150 lines), così come appare solo su Linux, ma probabilmente dalla mia incapacità di configurare correttamente il file Makevars. (Non ho mai usato make o un makefile prima).
Anche quando ha inviato il pacchetto a CRAN, Brian Ripley ha scritto qualcosa su questo NOTE che mi ha fatto pensare che si tratti di un problema Makevars: "Deriva dai simboli di debug."

Il mio Makevars è lo standard RcppMakevars (indicato di seguito) prodotto da Rcpp.package.skeleton.

Le mie domande:

  • Come posso configurare la mia Makevars in un modo che riduce la dimensione della libreria compilata su Linux (vale a dire, sbarazzarsi del NOTE)?
  • Quali sono le buone risorse su come entrare nella magia di Makevars per Rcpp?
    (non ho trovato nulla nel Gallery e la R extension manual on this è stato anche per me incomprensibile)

mia Makevars:

## Use the R_HOME indirection to support installations of multiple R version 
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` 
PKG_CPPFLAGS = -I. -I../inst/include 

mia Makevars.win:

## This assume that we can call Rscript to ask Rcpp about its locations 
## Use the R_HOME indirection to support installations of multiple R version 
PKG_LIBS = $(shell $(R_HOME)/bin/Rscript.exe -e "Rcpp:::LdFlags()") 
PKG_CPPFLAGS = -I. -I../inst/include 

risposta

7

Lei cita quello abbiamo scritto Non c'è nulla di specifico qui: si si vuole solo conoscere la sintassi e le opzioni di base del Makefile.

Fiddling with src/Makevars, a meno che non si capisca cosa si sta facendo, non è raccomandato. Probabilmente si romperà qualcosa, in particolare si costruisce su un'altra architettura. Simon Urbanek è piuttosto irremovibile su questo consiglio.

Brian Ripley è ovviamente mezzo corretto: Se hai il debug abilitato, le librerie sono più grandi. Ma CXXFLAGS non sono mai impostati, in particolare non è impostato il flag -g per attivare il debug. Quindi non siamo noi: se il debug è abilitato di default, qualcos'altro è stato attivato. Potrebbe essere R di default. Vedi il tuo .R/Makevars.

L'altro driver per le dimensioni è modelli C++. Confronta con altri pacchetti usando (Rcpp) Eigen, sono probabilmente anche grandi. Questo "è solo un costo per fare affari": i modelli ti danno il potere (codifica) che ti piace.

cura per errori di battitura

+1

Grazie per la risposta, tanto per chiarire: che cosa il vostro stanno dicendo è fondamentalmente (a) non c'è davvero nessun problema, la dimensione proviene dalla struttura di 'Eigen', (b) non sono raccomandati flag 'CXXFLAGS' da impostare per' RcppEigen', e (c) se si vogliono cambiare i flag andare e imparare la sintassi _basic Makefile e options_. Ti sto capendo correttamente? – Henrik

+0

Sì a a) ec); diciamo ciò di cui hai bisogno in b) e ti diamo; guarda i documenti, gli esempi e il pacchetto skeleton di RcppEigen, ma in pratica ti serve solo LinkingTo: RcppEigen. Tu usi RcppEigen e non la copia separata di Eigen, giusto? –

+0

Sì, utilizzo 'RcppEigen' e probabilmente ho usato' RcppEigen.package.skeleton' (dato che ho 'RcppEigen' prima di' Rcpp' su Depends e LinkingTo in 'DESCRIPTION'). La mia domanda è forse se ha senso impostare ad es. la famosa opzione '-O3' (e se sì, come)? – Henrik

Problemi correlati