我正在将基于R的代码转换为基于Rcpp的代码.我的职责是:
NumericMatrix createMatrixOfLinkRatiosC(NumericMatrix matr, double threshold4Clean) { int i,j; NumericMatrix myMatr(matr.nrow(),matr.ncol()); myMatr=matr; ....; }
我想处理对threshold4Clean缺失的函数的调用,但我没有找到怎么办...任何帮助将不胜感激.
R有两个NaN
和NA
(实际上是一种特殊的NaN
)用于表示缺失值.这一点很重要,因为有许多函数可以检查值是否为NaN
-y(NA
或NaN
):
来自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 | +---------------------+
不幸的是,这是一个令人困惑的景观,但这应该给你一些权力.
既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) ***/
我们初始化一个零矩阵,并测试参数.如果它是有限的(即不是NA
或Inf
或NaN
),那么我们添加该值.如果您愿意,您也可以单独测试各种可能性.
这会产生所需的结果:没有第二个参数的默认值NA
apply,我们得到一个零的矩阵.
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>