为 Rcpp 函数中的参数设置“NULL”默认值

SN2*_*248 3 rcpp

我想NULLRcpp函数中设置参数的默认值,如果参数不是,则根据参数进行一些计算NULL。这种代码的一个例子是

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int test_null(Nullable<DataFrame> p1 = R_NilValue){

  if(p1.isNull()){
    NumericMatrix T(2,2);
    Rcout << T << std::endl;
  }
    else{
    NumericMatrix T(p1.nrow());
    Rcout << T << std::endl;
  }
  return (42);
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法编译此函数并收到错误消息

error: no member named 'nrow' in 'Rcpp::Nullable<Rcpp::DataFrame_Impl<PreserveStorage> >'

这告诉我没有nrow定义 a Nullable DataFrame。有没有其他方法可以NULL为参数(即 a DataFrame)实现默认值,Rcpp以便我可以计算DataFrame它不是时的其他属性(编号或行、列等)NULL

任何帮助将不胜感激!

谢谢!

SN248

Dir*_*tel 5

你非常接近。你错过了一个实例化:aNullable<>还不是它的模板类型——我们需要先创建一个对象。

所以这是您的代码,其中包含更正的空格 ;-) 和缺失的行以及每个案例的测试调用:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int test_null(Nullable<DataFrame> p1 = R_NilValue){

  if (p1.isNull()) {
    NumericMatrix T(2,2);
    Rcout << T << std::endl;
  } else {
    DataFrame S(p1);
    NumericMatrix T(S.nrow());
    Rcout << T << std::endl;
  }
  return (42);
}

/*** R
test_null(NULL)
test_null(data.frame(a=1:3, b=letters[1:3]))
*/
Run Code Online (Sandbox Code Playgroud)

我得到了预期的结果:

R> Rcpp::sourceCpp("~/git/stackoverflow/61701367/answer.cpp")

R> test_null(NULL)
0.00000 0.00000
0.00000 0.00000

[1] 42

R> test_null(data.frame(a=1:3, b=letters[1:3]))
0.00000 0.00000 0.00000
0.00000 0.00000 0.00000
0.00000 0.00000 0.00000

[1] 42
R> 
Run Code Online (Sandbox Code Playgroud)