2014-10-07 51 views
10

我將基於R的代碼轉換爲基於Rcpp的代碼。我的函數的頭部是:Rcpp函數檢查是否缺失值

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

} 

我想處理呼叫到threshold4Clean缺少的功能,但我沒有找到怎麼辦...任何幫助將不勝感激。

+2

當你說失蹤時,你的意思是「不適用」還是你的意思是你沒有給它任何價值? – stanekam 2014-10-07 17:22:12

回答

7

Rcpp和RcppArmadillo都有謂詞來測試NA,NaN(R擴展)和Inf

這裏是一個短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) 
***/ 

我們初始化爲零的對於參數的矩陣,並且測試。如果它是有限的(即不是NAInfNaN),那麼我們添加該值。如果你想,你也可以單獨測試可能性。

這產生所需的結果:沒有第二個參數,默認值NA適用,我們得到一個零矩陣。

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

謝謝德克,你是否也有一個純粹的Rcpp例子? – 2014-10-08 09:42:08

20

R有兩種NaNNA(這實在是一種特殊的NaN)爲代表缺失值。這是重要的是知道,因爲有檢查,如果值是NaN -Y(NANaN)許多功能:

從R/C API函數的一些真值表(注意是令人沮喪的缺乏一致性)

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

和RCPP:

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

和從R解釋器(注:RCPP嘗試匹配這一點,而不是R/C API):

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

不幸的是,這是一個令人困惑的景觀,但這應該給你一點權力。

+1

很好地完成。也許我們應該將這一點放入Rcpp FAQ中? – 2014-10-08 20:00:28