默认NULL参数Rcpp

时间:2015-12-10 15:37:25

标签: r parameters null rcpp

我正在尝试使用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)

但是当我运行代码时:

fn:concat('<span class="highlight">',$cts:text,'</span>')

我收到以下错误:

  

错误:与请求的类型不兼容

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:17)

你很幸运。我们在mvabundRblpapi中需要这个,并且从最后(两个)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&GT; sourceCpp(&#34; /tmp/nick.cpp")

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

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