2014-10-07 15 views
10

Sto convertendo codice basato su R in codice basato su Rcpp. Il capo della mia funzione è:Rcpp controlla se manca il valore

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

} 

voglio gestire chiamata alla funzione in cui threshold4Clean manca, ma io non sto trovando come fare ... Qualsiasi aiuto sarà molto apprezzato.

+2

Quando dici "mancante", intendi "NA" o intendi che non stai trasmettendo alcun valore ad esso? – stanekam

risposta

7

Sia Rcpp che RcppArmadillo hanno i test previsti per NA, NaN (un'estensione R) e Inf.

Ecco un breve esempio RcppArmadillo:

#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) 
***/ 

Inizializziamo una matrice di zeri e di test per l'argomento. Se è finito (ovvero non NA o Inf o NaN), aggiungeremo quel valore. Se lo volessi, potresti anche testare individualmente le possibilità.

Questo produce il risultato desiderato: senza un secondo argomento si applica il valore predefinito di NA e otteniamo una matrice di zeri.

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

Grazie Dirk, hai anche un puro esempio di Rcpp? –

20

R ha sia NaN e NA (che è in realtà un tipo speciale di NaN) per rappresentare valori mancanti. Questo è importante sapere perché ci sono molte funzioni che controllano se un valore è NaN -y (NA o NaN):

Alcune tabelle di verità per le funzioni della API di R/C (notare la frustrante mancanza di coerenza)

+---------------------+ 
| Function | NaN | NA | 
+---------------------+ 
| ISNAN | t | t | 
| R_IsNaN | t | f | 
| ISNA  | f | t | 
| R_IsNA | f | t | 
+---------------------+ 

e Rcpp:

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

e dall'interprete R (nota: Rcpp cerca di corrispondere a questo, piuttosto che l'API di R/C):

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

Sfortunatamente è un paesaggio confuso, ma questo dovrebbe potenziarvi un po '.

+1

Ben fatto. Forse dovremmo farlo anche nelle FAQ di Rcpp? –

Problemi correlati