2015-12-10 10 views
6

Ich versuche, eine Funktion mit einem Standard NULL Parameter in Rcpp zu definieren. Es folgt ein Beispiel:Default-NULL-Parameter Rcpp

// [[Rcpp::export]] 
int test(int a, IntegerVector kfolds = R_NilValue) 
{ 
    if (Rf_isNull(kfolds)) 
    { 
    cout << "NULL" << endl; 
    } 
    else 
    { 
    cout << "NOT NULL" << endl; 
    } 

    return a; 
} 

Aber wenn ich den Code ausführen:

test(1) 

ich die folgende Fehlermeldung erhalten:

Error: not compatible with requested type

Wie kann ich dieses Problem lösen?

+2

Verwenden Sie nicht 'cout', verwenden Sie' Rcpp :: Rcout'. – Roland

+0

@Roland warum? Was sind die Unterschiede? – Nick

+0

AFAIK, 'cout' funktioniert nur, wenn Sie R von einem Terminal ausführen. Es könnte andere Probleme geben, aber ich weiß es nicht. Ich folge den Ratschlägen meiner Besserwisser (wie Dirk) in dieser Hinsicht. – Roland

Antwort

13

Sie haben Glück. Wir brauchten das in mvabund und Rblpapi, und haben es seit den letzten (zwei) Rcpp Releases.

diese So versuchen:

// [[Rcpp::export]] 
int test(int a, Rcpp::Nullable<Rcpp::IntegerVector> kfolds = R_NilValue) { 

    if (kfolds.isNotNull()) { 
    // ... your code here but note inverted test ... 

Ein schönes komplettes Beispiel ist here in Rblpapi. Sie können auch einen voreingestellten Wert wie Sie haben (vorbehaltlich der üblichen Regeln in C++ aller Optionen rechts davon, die auch Standardwerte haben).

Edit: Der Vollständigkeit halber, hier ist ein vollständiges Beispiel:

#include <Rcpp.h> 

// [[Rcpp::export]] 
int testfun(Rcpp::Nullable<Rcpp::IntegerVector> kfolds = R_NilValue) { 

    if (kfolds.isNotNull()) { 
    Rcpp::IntegerVector x(kfolds); 
    Rcpp::Rcout << "Not NULL\n"; 
    Rcpp::Rcout << x << std::endl; 
    } else { 
    Rcpp::Rcout << "Is NULL\n"; 
    } 
    return(42); 
} 

/*** R 
testfun(NULL) 
testfun(c(1L, 3L, 5L)) 
*/ 

die diese Ausgabe erzeugt:

R> sourceCpp ("/ tmp/nick.cpp")

R> testfun(NULL) 
Is NULL 
[1] 42 

R> testfun(c(1L, 3L, 5L)) 
Not NULL 
1 3 5 
[1] 42 
R> 
+0

Siehe auch die [feature request] (https://github.com/RcppCore/Rcpp/issues/394). – Roland