在 Rcpp 中,如何使用声明为 Nullable 的变量?

In Rcpp, how can I use a variable declared as Nullable?

我是 Rcpp 的新手,但精通 R。我正在尝试编写一个 Rcpp 函数,其参数可以输入为 NULL。在 Rcpp 中,我的理解是,这意味着在函数参数中将变量声明为“可空”,使用 .isNotNULL() 测试输入对象是否为 NULL,并为新变量分配原始参数的值(遵循说明描述 here).

当我尝试 运行 以下代码时,我收到一条错误消息 use of undeclared identifier 'x':

// [[Rcpp::export]]
NumericVector test(Nullable<NumericVector> x_) {
  if (x_.isNotNull()) {
    NumericVector x(x_);
  }
//Other stuff happens
  if (x_.isNotNull()) {
    return x;
  } else {
    NumericVector y = NumericVector::create(3);
    return y;
  }
}

如果发现 x_ 不是 NULL,我正在编写的实际函数在循环中使用 x 下游。我见过的所有可为空参数的示例都只在 if 语句内使用新分配的变量,而不是在语句外。如何在后续代码中使用 x

你应该研究一下 C++ 中的局部变量和全局变量。

这个有效:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector test(Nullable<NumericVector> x_) {
  NumericVector x;
  if (x_.isNotNull()) {
    x = x_;
  }
  //Other stuff happens
  if (x_.isNotNull()) {
    return x;
  } else {
    NumericVector y = NumericVector::create(3);
    return y;
  }
}

但是,我会重组代码并避免重复 if 条件:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector test(Nullable<NumericVector> x_) {
  NumericVector x;
  if (x_.isNull()) {
    x = NumericVector::create(3);
    return x;
  }
  
  x = x_;
  //Other stuff happens
  return x;
}