2015-12-10 9 views
6

NULLのデフォルトの値を持つ関数をRcppに定義しようとしています。次の例である:デフォルトの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; 
} 

しかし、私はコードを実行すると:

test(1) 

を私は次のエラーを取得する:

Error: not compatible with requested type

どのように私はこの問題を解決することができますか?

+2

'cout'を使わず、' Rcpp :: Rcout'を使用してください。 – Roland

+0

@Rolandなぜですか?違いは何ですか? – Nick

+0

AFAIK、 'cout'は端末からRを実行する場合にのみ動作します。他にも問題があるかもしれませんが、わかりません。私はこれらの点で私のベター(ディルクなど)の助言に従います。 – Roland

答えて

13

あなたは幸運です。我々はこれをmvabundRblpapiに必要とし、最後(2回)のRcppリリース以降に持っています。

だから、これは試してみてください。

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

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

素敵な完全な例がhere in Rblpapiです。 また、既定値を設定することもできます(デフォルトの値を持つこのオプションの右側にあるすべてのオプションのC++での通常の規則に従います)。

編集:完全酒について、ここでは完全な例である:この出力を生成

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

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

[機能要求](https://github.com/RcppCore/Rcpp/issues/394)も参照してください。 – Roland