首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rcpp:如何获得Rcpp::Nullable NumericVector的大小

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

Stack Overflow用户
提问于 2017-04-13 09:38:27
回答 1查看 1K关注 0票数 2

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

代码语言:javascript
复制
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)
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-13 12:10:32

而不是像在这里那样直接调用对象-- .size() -- N = t.size(); --您需要将它转换为底层类型。例如,

代码语言:javascript
复制
#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

*/

正如Dirk所指出的那样,在这里使用.get()并不是绝对必要的--使用NumericVector x(x_);将调用Nullable<>::operator SEXP()并同样良好地工作。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43388698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档