2015-12-10 17 views
6

Próbuję zdefiniować funkcję z domyślnym parametrem NULL w Rcpp. Oto przykład:Domyślny parametr NULL 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; 
} 

Ale kiedy uruchomić kod:

test(1) 

pojawia się następujący błąd:

Error: not compatible with requested type

Jak mogę rozwiązać ten problem?

+2

Nie używaj 'cout', użyj' Rcpp :: Rcout'. – Roland

+0

@Roland dlaczego? jakie są różnice? – Nick

+0

AFAIK, 'cout' będzie działać tylko wtedy, gdy uruchomisz R z terminala. Mogą być inne problemy, ale nie wiem. Postępuję zgodnie z radą moich szczęśliwców (takich jak Dirk) w tym zakresie. – Roland

Odpowiedz

13

Masz szczęście. Potrzebowaliśmy tego w mvabund i Rblpapi i mamy go od ostatnich (dwóch) wydań Rcpp.

Więc spróbuj tego:

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

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

Miła kompletny przykładem jest here in Rblpapi. Możesz także ustawić wartość domyślną (zgodnie ze zwykłymi regułami w C++ wszystkich opcji po prawej stronie również z ustawieniami domyślnymi).

Edycja: Przez wzgląd na kompletność, tutaj pełny przykład:

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

który wytwarza ten wynik:

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

Zobacz także [żądanie funkcji] (https://github.com/RcppCore/Rcpp/issues/394). – Roland

Powiązane problemy