2014-10-07 52 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