默认 NULL 参数 Rcpp

Default NULL parameter Rcpp

我正在尝试在 Rcpp 中定义一个带有默认 NULL 参数的函数。下面是一个例子:

// [[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

我该如何解决这个问题?

你很幸运。我们在 mvabund and Rblpapi 中需要它,并且自上次(两次)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>