2015-10-28 11 views
5

Dies ist meine erste stackoverflow Frage, also bitte sei nett, Leute!Problem beim Erstellen von R-Paket mit Devtools, wenn es RcppArmadillo verwendet

Ich habe meine kürzlich gefundene Macht, R-Pakete mit Devtools zu bauen, sehr genossen. Sobald ich jedoch versuche, ein Paket zu erstellen, das RcppArmadillo verwendet, funktioniert mein Workflow zum Ausführen von devtools :: document(), devtools :: check() und devtools :: build() nicht mehr.

Zum Beispiel habe ich eine (hoffentlich ziemlich minimale + komplette) Testversion des Pakets, das ich hier entwickeln möchte: https://github.com/suztolwinskiward/fooR/. fooR enthält nur eine Funktion, die eine C++ - Implementierung der Funktion rdist.earth aus dem fields-Paket ist.

Lauf devtools :: Dokument („FOOR“) spuckt viele Nachrichten (mehrere Anspielung auf „undefinierte Referenzen“ zu Variablen, die in meinem Source-co Leben nicht, dass mir nicht interpretierbar sind, und dann scheitert:

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) 

Einer der anderen Seite, wenn ich die C++ Funktion, die auf RcppArmadillo hängt beziehen, so scheint es ganz gut zu laufen:

mich
> 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 

Dies führt etwas falsch mit der Art, wie ich bin versucht zu denken, es gibt RcppArmadillo in meinem Paket zu verwenden, aber ich konnte nicht fig Was? Jeder Rat sehr geschätzt!

P.S. Ich bin überrascht, dass es hier kein RcppArmadillo-Tag gibt ....

Antwort

3

Zusätzlich zu den Antworten von jtilly und dem Kommentar von Dirk:

RcppArmadillo.package.skeleton() generiert die richtige Namespace-Datei, aber roxygen2 über document() die Namespace nur enthält eine Zeile

# Generated by roxygen2: do not edit by hand 

und die DynLib nach dem Laufen/Export-Anweisungen werden überschrieben. Lassen roxygen2 automatisch den richtigen Namensraum erzeugen, eine neue R-Datei in das R-Unterverzeichnis des Paketverzeichnis hinzufügen enthält die folgenden:

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

Der Name dieser Datei keine Rolle spielt, aber YourPackageName.r ist üblich für diese (Art von) "Hauptdatei".

Wenn „Dokument()“ ausgeführt wird, wird die folgende Namespace-Datei erzeugt:

# Generated by roxygen2: do not edit by hand 

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

Dies ist der gleiche Namensraum ist, der über RcppArmadillo.package.skeleton() von RcppArmadillo 0.6.700.6.0 erzeugt wird.

2

Ihre NAMESPACE Datei ist leer.

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

... und es wäre für Sie erstellt, wenn Sie Werkzeuge wie 'RcppArmadillo.package.skeleton()' verwendet haben, die wir ** genau ** erstellt haben, um Neulingen bei der Paketerstellung zu helfen. –

+0

Dank Ihnen beiden. Ich werde definitiv RcppArmadillo.packge.skeleton() lernen - danke für die Entwicklung Dirk et al. Normalerweise erstellt devtools :: document() den Namespace für mich, also weiß ich nicht, warum diese Möglichkeit nicht funktioniert, sobald ich RcppArmadillo einschließe. –

0

'devtools :: Dokument()' kompiliert Code, ehrlich gesagt, ich bin nicht sicher, warum: Es sollte so etwas wie dieses enthalten. Das bedeutet, wenn die Kompilierung fehlschlägt, ist die Dokumentation nicht abgeschlossen. In deinem Fall bedeutet das, dass du deinen NAMESPACE nicht geschrieben hast.

Starten Sie als Dirk schlägt vor, und fügen Sie Zeug in, aber es muss kompilieren, bevor die Dokumente fertig sind.

+0

Ich habe wie Dirk vorgeschlagen gestartet, aber wenn ich Devtools :: document() verwende, bekomme ich eine Warnung 'NAMESPACE nicht von roxygen2 generiert. Übersprungen. Und dann eine Anweisung, dass die DLL nicht geladen wurde. Also nicht sicher, wie man NAMESPACE von RcppArmadillo.skeleton.package mit der fortlaufenden Paketentwicklung unter Verwendung von devtools (die viele andere Funktionen bietet und mit denen ich Erfolg hatte, bis die schnelle lineare Algebra benötigt wird) in Einklang bringt. –

0

Was schließlich funktionierte, war ein neues Paket mit RcppArmadillo.skeleton.package zu initialisieren, alle meine vorherigen Dateien darin zu verschieben, manuell zu dokumentieren und dann mit den GUI-Buttons in RStudio zu prüfen und zu bauen. Das fühlt sich ziemlich kludgy an und ich mochte roxygen2 sehr viel besser für die Dokumentation - aber als relativer Neuling in der Paketentwicklung mit der Abhängigkeit von RcppAmadillo bin ich nur glücklich, jetzt einen Weg gefunden zu haben, erfolgreich zu bauen!

+0

Ob Sie es glauben oder nicht, aber ich auch Beginnen Sie mit dieser Funktion für neue Projekte. Und nichts hindert Sie daran, Roxygen-Kommentare zu Ihren cpp-Dateien hinzuzufügen. –

+0

Thx Dirk. Ihr Buch ist gerade in meinem Briefkasten angekommen und freut sich darauf, noch mehr zu lernen! –