2016-04-13 14 views
4

Ich habe die folgende Datei cumsum_bounded.cppC++ Funktion nicht verfügbar

#include <Rcpp.h> 
using namespace Rcpp; 

//' Cumulative sum. 
//' @param x numeric vector 
//' @param low lower bound 
//' @param high upper bound 
//' @param res bounded numeric vector 
//' @export 
//' @return bounded numeric vector 
// [[Rcpp::export]] 
NumericVector cumsum_bounded(NumericVector x, double low, double high) { 
    NumericVector res(x.size()); 
    double acc = 0; 
    for (int i=0; i < x.size(); ++i) { 
     acc += x[i]; 
     if (acc < low) acc = low; 
     else if (acc > high) acc = high; 
     res[i] = acc; 
    } 
    return res; 
} 

ich dann & Reload bauen und meine neue Funktion testen.

cumsum_bounded(c(1, -2, 3), low = 2, high = 10) 
[1] 1 0 3 

Dann baue ich die Dokumentation. devtools::document()

Wenn ich alles kompiliert.

Aber wenn ich cumsum_bounded(c(1, 2, 3), low= 2, high = 10) laufen bekomme ich den Fehler:

Error in .Call("joshr_cumsum_bounded", PACKAGE = "joshr", x, low, high) : 
    "joshr_cumsum_bounded" not available for .Call() for package "joshr" 

Namespace

# Generated by roxygen2: do not edit by hand 

export(cumsum_bounded) 

Update:

Wenn ich ein neues Projekt erstellen, wie oben und verwenden Sie nicht die Build & Reload funktionieren aber eher devtools :: loadall(), es wird funktionieren. Aber sobald ich diese Taste drücke, geht es seitwärts.

+0

Welche Dateien wurden aktualisiert, als Sie 'document()' ausgeführt haben? – nrussell

+0

Sie können ein Tag 'Devtools' hinzufügen - wie' Rcpp' selbst funktioniert wie dokumentiert. Und wir sagen nichts (gut oder schlecht) über 'Devtools'. Ich würde einfach ausführen 'Rcpp :: compileAttributes()' das [das sehr feine Handbuch] (https://cloud.r-project.org/web/packages/Rcpp/vignettes/Rcpp-attributes.pdf) sagt. –

+0

@DirkEddelbuettel Die Schaltfläche 'Build & Reload' führt' Rcpp :: compileAttributes() 'aus. – jwenzeslaus

Antwort

10

Sie müssen wahrscheinlich die Linie

useDynLib(<pkg>) ## substitute your package name for <pkg> 

in Ihrem Namespace-Datei. Wenn Sie roxygen2 verwenden, können Sie eine Zeile z. #' @useDynLib <pkg> irgendwo in Ihrer Dokumentation, ersetzen Sie Ihren Paketnamen für <pkg> als geeignet.

EDIT: Und als Antwort auf Ihre andere Fehlermeldung, müssen Sie wahrscheinlich etwas aus Rcpp, z. Fügen Sie die Zeile @importFrom Rcpp evalCpp hinzu.

+0

'Fehler in Cumsum_Bounded (c (1, 2, 3), niedrig = 1, hoch = 3): Funktion 'enterRNGScope' nicht im Paket 'Rcpp'' – jwenzeslaus

+0

Vielen Dank für die Lösung. – jwenzeslaus

+2

Dies sind beide elementaren Fehler, die Sie vermieden hätten, entweder durch a) Lesen der Dokumentation (ich weiß, ich weiß, ...) oder b) ein Template-Paket erstellt haben. –