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>
Nie używaj 'cout', użyj' Rcpp :: Rcout'. – Roland
@Roland dlaczego? jakie są różnice? – Nick
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