2014-10-07 28 views
10

R tabanlı kodu Rcpp tabanlı koda dönüştürüyorum. Benim işlevi başıdır:Rcpp işlevi eksik değeri kontrol edin

NumericMatrix createMatrixOfLinkRatiosC(NumericMatrix matr, double threshold4Clean) { 
int i,j; 
NumericMatrix myMatr(matr.nrow(),matr.ncol()); 
myMatr=matr; 
....; 

} 

Ben threshold4Clean eksik işlevine çağrı işlemek istiyorum ama nasıl yapılacağını bulamıyorum ... Herhangi bir Yardım büyük takdir edilecektir.

+2

Kayıp dediğinizde, "NA" mı demek istiyorsunuz, yoksa buna herhangi bir değer aktarmıyorsunuz demektir? – stanekam

cevap

7

Rcpp ve RcppArmadillo Hem NA, NaN (R uzantısı) ve Inf test etmek için yüklemler'ıN sahiptir.

#include <RcppArmadillo.h> 

// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export]] 
arma::mat foo(int n, double threshold=NA_REAL) { 
    arma::mat M = arma::zeros<arma::mat>(n,n); 
    if (arma::is_finite(threshold)) M = M + threshold; 
    return M; 
} 

/*** R 
foo(2) 
foo(2, 3.1415) 
***/ 

Biz bağımsız değişkeni için bir sıfır matris ve bir test başlatmak: Burada

kısa RcppArmadillo örnektir. Sonlu ise (yani NA veya Inf veya NaN), o değeri ekliyoruz. İsterseniz, olasılıkları ayrı ayrı test edebilirsiniz.

Bu, istenen sonucu verir: ikinci bir bağımsız değişken olmadan, NA varsayılan değeri uygulanır ve bir sıfırlar matrisi elde ederiz.

R> Rcpp::sourceCpp("/tmp/giorgio.cpp") 

R> foo(2) 
    [,1] [,2] 
[1,] 0 0 
[2,] 0 0 

R> foo(2, 3.1415) 
     [,1] [,2] 
[1,] 3.1415 3.1415 
[2,] 3.1415 3.1415 
R> 
+1

Teşekkürler Dirk, ayrıca saf bir Rcpp örneğiniz var mı? –

20

R, eksik değerleri temsil (gerçekten NaN özel bir tür olan) NaN ve NA hem de sahiptir. R/C API fonksiyonları için

Bazı doğruluk tabloları (tutarlılık sinir bozucu eksikliğini dikkat edin)

: Bu, bir değer NaN -y ( NA veya NaN) olup olmadığını kontrol bazı işlevler de vardır, çünkü bilmek önemlidir
+---------------------+ 
| Function | NaN | NA | 
+---------------------+ 
| ISNAN | t | t | 
| R_IsNaN | t | f | 
| ISNA  | f | t | 
| R_IsNA | f | t | 
+---------------------+ 

ve Rcpp:

+-------------------------+ 
| Function  | NaN | NA | 
+-------------------------+ 
| Rcpp::is_na | t | t | 
| Rcpp::is_nan | t | f | 
+-------------------------+ 

ve R tercüman

(not: Rcpp yerine R/C API daha bu eşleşecek şekilde çalışır):

+---------------------+ 
| Function | NaN | NA | 
+---------------------+ 
| is.na | t | t | 
| is.nan | t | f | 
+---------------------+ 

Maalesef bu kafa karıştırıcı bir manzaradır, ancak bu sizi biraz güçlendirmelidir.

+1

Güzel bitti. Belki de bunu Rcpp SSS'ye de eklemeliyiz? –