2015-10-28 16 views
5

Questa è la mia prima domanda di stackoverflow, quindi per favore sii gentile, gente!Problemi nella creazione del pacchetto R con gli strumenti di sviluppo quando usa RcppArmadillo

Mi è piaciuto molto il mio recente potere di creare pacchetti R usando devtools. Tuttavia, non appena provo a creare un pacchetto che utilizza RcppArmadillo, il mio flusso di lavoro di eseguire devtools :: document(), devtools :: check() e devtools :: build() non funziona più.

Ad esempio, ho una versione di prova (si spera piuttosto minima + completa) del pacchetto che sto cercando di sviluppare qui: https://github.com/suztolwinskiward/fooR/. fooR contiene solo una funzione, che è un'implementazione C++ della funzione rdist.earth dal pacchetto fields.

corso devtools :: documento ("foor") sputa fuori un sacco di messaggi (alcuni alludono alla "riferimenti non definiti" per le variabili che non vivono in mia fonte co che non sono interpretabili a me, e poi non riesce:

collect2: ld returned 1 exit status 
    no DLL was created 
    ERROR: compilation failed for package 'fooR' 
    * removing 'C:/Users/I53794/AppData/Local/Temp/RtmpWgC8nD/devtools_install_1ea473123086/fooR' 
    Error: Command failed (1) 

Un altra parte, quando ho fonte la funzione C++ che dipende RcppArmadillo, sembra che vada tutto bene:

> Rcpp::sourceCpp('./src/rdist_earth_cpp.cpp') 
> data('miami') 
> data('new_orleans','katrina_path') 
> rdist_earth_cpp(katrina_path,new_orleans) 
      [,1] 
[1,] 1042.36073 
[2,] 998.96793 
[3,] 957.69315 
[4,] 917.91486 
[5,] 868.07791 
[6,] 805.73485 
[7,] 763.01476 
[8,] 726.10133 
[9,] 692.14482 
[10,] 670.15133 
[11,] 662.23353 
[12,] 625.55592 
[13,] 601.08682 
[14,] 579.73940 
[15,] 560.32660 
[16,] 539.14192 
[17,] 510.15438 
[18,] 481.40037 
[19,] 442.52322 
[20,] 391.96619 
[21,] 331.66378 
[22,] 271.79088 
[23,] 201.24749 
[24,] 128.12647 
[25,] 56.99198 
[26,] 45.80297 
[27,] 32.96609 
[28,] 81.71237 
[29,] 189.31050 
[30,] 296.92104 
[31,] 406.12593 
[32,] 516.08458 
[33,] 654.81113 
[34,] 808.21670 

Questo mi porta a pensare che ci sia qualcosa di sbagliato nel modo in cui sto provando usare RcppArmadillo nel mio pacchetto, ma non sono stato in grado di fig uro fuori cosa. Qualche consiglio molto apprezzato!

P.S. Sono sorpreso che non ci sia nessun tag RcppArmadillo qui ...

risposta

3

Oltre alle risposte di jtilly e il commento da Dirk:

RcppArmadillo.package.skeleton() genera il file namespace corretto, ma dopo l'esecuzione roxygen2 tramite document() lo spazio dei nomi contiene solo una riga

# Generated by roxygen2: do not edit by hand 

e la DynLib/le direttive di esportazione vengono sovrascritte. Per consentire roxygen2 generare automaticamente lo spazio dei nomi corretta, aggiungere un nuovo file di R per R-sottodirectory della directory del pacchetto che contiene il seguente:

#' @useDynLib YourPackageName 
#' @importFrom Rcpp evalCpp 
#' @exportPattern "^[[:alpha:]]+" 
NULL 

Il nome di questo file non importa, ma YourPackageName.r è solito per questo (tipo di) "file principale".

Durante l'esecuzione di "documento()", il seguente file namespace viene generato:

# Generated by roxygen2: do not edit by hand 

exportPattern("^[[:alpha:]]+") 
importFrom(Rcpp,evalCpp) 
useDynLib(YourPackageName) 

Questo è lo stesso spazio dei nomi che viene generato tramite RcppArmadillo.package.skeleton() da RcppArmadillo 0.6.700.6.0.

2

Il tuo file NAMESPACE è vuoto. Dovrebbe contenere qualcosa di simile:

useDynLib(fooR) 
exportPattern("^[[:alpha:]]+") 
+1

... e sarebbe creato per te se usassi strumenti come 'RcppArmadillo.package.skeleton()' che abbiamo creato ** precisamente ** per aiutare i novizi nella creazione del pacchetto. –

+0

Grazie a tutti e due. Imparerò sicuramente RcppArmadillo.packge.skeleton() - grazie per averlo sviluppato Dirk et al. Di solito devtools :: document() costruisce lo spazio dei nomi per me, quindi non so perché quella strada non sembra funzionare non appena includo RcppArmadillo. –

0

'devtools :: documento()' compila il codice, onestamente, non so perché. Ciò significa che se la compilazione fallisce, la documentazione non è completa. Nel tuo caso questo significa che non hai scritto il tuo NAMESPACE.

Inizia come suggerisce Dirk e aggiunge elementi, ma dovrà essere compilato prima che i documenti vengano eseguiti.

+0

Ho iniziato come suggerito da Dirk, ma quando uso devtools :: document(), ricevo un avvertimento 'NAMESPACE non generato da roxygen2. Saltato. E quindi una dichiarazione che la DLL non è stata caricata. Quindi non sono sicuro di come riconciliare NAMESPACE da RcppArmadillo.skeleton.package con lo sviluppo continuo dei pacchetti usando devtools (che offre molte altre funzionalità che mi piacciono e con cui ho avuto successo fino a quando ho bisogno dell'algebra lineare veloce!) –

0

Ciò che alla fine ha funzionato è stato inizializzare un nuovo pacchetto con RcppArmadillo.skeleton.package, spostare tutti i miei file precedenti, documentare manualmente, quindi controllare e compilare con i pulsanti della GUI in RStudio. Questo mi sembra abbastanza divertente e mi è davvero piaciuto usare roxygen2 molto meglio per la documentazione, ma come novizio relativamente nello sviluppo dei pacchetti con dipendenza da RcppAmadillo, per ora sono contento di aver trovato un modo per costruire con successo!

+0

Che ci crediate o meno ma anch'io iniziare con quella funzione per nuovi progetti. E niente ti impedisce di aggiungere commenti di Roxy ai tuoi file cpp_. –

+0

Thx Dirk. Il tuo libro è appena arrivato nella mia casella di posta quindi non vedo l'ora di imparare molto di più! –

Problemi correlati