2017-04-13 13 views
1

R関数をRcppに変換したいのですが、簡単なテストコードは次のようになりますが、設定されている引数をどのように扱うかわかりませんデフォルトではNULLです。Rcpp:Rcpp :: Nullable NumericVectorのサイズを取得するには

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) 
    } 

答えて

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()の使用は、ここで厳密には必要ではない - NumericVector x(x_);を使用すると、Nullable<>::operator SEXP()を起動し、同じようにうまく動作します。


また、将来的にコードのフォーマットを改善してください。

+2

正解ですが、フォーマットについてのヒントは非常に正確です。これは単純に、あなたが必要とする変数の_instantiation_を欠いていました。私は実際には[もっとシンプルなフォーム](https://github.com/aliceyiwang/mvabund/blob/master/src/Rinterface.cpp#L52-L53)を好ん​​でいます。 'NumericVector'や他の' SEXP'互換型と同じように動作します。 –

関連する問題