Rcpp:我如何获得Rcpp :: Nullable NumericVector的大小

时间:2017-04-13 09:38:27

标签: rcpp

我想将R函数转换为Rcpp,一个简单的测试代码如下,但我不知道如何处理默认设置为NULL的参数。

test<- function(t=NULL,tmax=NULL,tmin=NULL){
  if(is.null(t)){
    yout=(tmax-tmin)*(tmin+tmax)
  }else{
    yout=2*t
  }
  return(yout)
}

test(tmax=1:3,tmin=0:2)




  // [[Rcpp::export]]
    NumericVector cpptest(Rcpp::Nullable<Rcpp::NumericVector> t=R_NilValue,
                          Rcpp::Nullable<Rcpp::NumericVector> tmax=R_NilValue,
                          Rcpp::Nullable<Rcpp::NumericVector> tmin=R_NilValue){
      int N=0;
      if(t.isNotNull()) {
        N=t.size(); /* which show a error*/
      }else{
        N=tmax.size(); /* which show a error*/
      }
      NumericVector yout=NumericVector(N);

      if(t.isNotNull()) {
        for(i=0;i<N,i++){
          yout[i]=2*t[i]
        }
      }else{
        for(i=0;i<N,i++){
          yout[i]=(tmax[i]-tmin[i])*(tmin[i]+tmax[i])
        }
      }
      return(yout)
    }

1 个答案:

答案 0 :(得分:3)

而不是打电话,例如.size()直接在对象上进行N = t.size(); - #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] int nullable_size(Nullable<NumericVector> x_ = R_NilValue) { if (x_.isNotNull()) { NumericVector x(x_.get()); return x.size(); } warning("argument x_ is NULL"); return -1; } /*** R nullable_size(rnorm(5)) # [1] 5 nullable_size(NULL) # [1] -1 # Warning message: # In .Primitive(".Call")(<pointer: 0x000000006aa417a0>, x_) : # argument x_ is NULL */ - 您需要将其强制转换为基础类型。例如,

.get()

正如Dirk所指出的,NumericVector x(x_);在这里并不是绝对必要的 - 使用int ang = angle_ + angle; 会调用Nullable<>::operator SEXP()并且同样有效。

另外,请在将来更好地格式化您的代码。