2015-12-10 25 views
6

Sto tentando di definire una funzione con un parametro NULL predefinito in Rcpp. Di seguito è riportato un esempio:Parametro NULL predefinito 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; 
} 

Ma quando ho eseguito il codice:

test(1) 

ottengo il seguente errore:

Error: not compatible with requested type

Come posso risolvere questo problema?

+2

Non utilizzare 'cout', utilizzare' Rcpp :: Rcout'. – Roland

+0

@Roland perché? quali sono le differenze? – Nick

+0

AFAIK, 'cout' funzionerà solo se si esegue R da un terminale. Potrebbero esserci altri problemi, ma non lo so. Seguo il consiglio dei miei superiori (come Dirk) in questi riguardi. – Roland

risposta

13

Sei fortunato. Avevamo bisogno di questo in mvabund e Rblpapi, e lo abbiamo dalle ultime (due) versioni di Rcpp.

Quindi provare questo:

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

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

Un bel esempio completo è here in Rblpapi. Puoi anche impostare un valore predefinito come hai fatto tu (soggetto alle solite regole in C++ di tutte le opzioni a destra di questo anche con valori predefiniti).

Edit: Per completezza, ecco un esempio completo:

#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)) 
*/ 

che genera questo output:

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

Vedere anche [richiesta funzione] (https://github.com/RcppCore/Rcpp/issues/394). – Roland

Problemi correlati