2014-10-07 14 views
10

Tôi đang chuyển đổi mã R dựa vào mã dựa trên Rcpp. Người đứng đầu chức năng của tôi là:Kiểm tra chức năng Rcpp nếu thiếu giá trị

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

} 

Tôi muốn xử lý cuộc gọi đến chức năng mà ngưỡng4Clean bị thiếu nhưng tôi không tìm cách thực hiện ... Mọi trợ giúp sẽ được đánh giá cao.

+2

Khi bạn nói mất tích, bạn có nghĩa là "NA" hay bạn có nghĩa là bạn không chuyển bất kỳ giá trị nào cho nó? – stanekam

Trả lời

7

Cả Rcpp và RcppArmadillo đều có các biến vị ngữ để kiểm tra NA, NaN (phần mở rộng R) và Inf.

Đây là một RcppArmadillo ngắn ví dụ:

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

Chúng tôi khởi tạo một ma trận các zeros, và thử nghiệm cho các cuộc tranh cãi. Nếu nó là hữu hạn (tức là không phải là NA hoặc Inf hoặc NaN), thì chúng tôi thêm giá trị đó. Nếu bạn muốn, bạn có thể kiểm tra các khả năng riêng lẻ.

Điều này tạo ra kết quả mong muốn: không có đối số thứ hai, giá trị mặc định là NA sẽ áp dụng và chúng tôi nhận được ma trận số không.

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

Cảm ơn Dirk, bạn có một ví dụ Rcpp thuần túy không? –

20

R có cả NaNNA (mà thực sự là một loại đặc biệt của NaN) cho đại diện cho các giá trị bị mất tích. Đây là quan trọng để biết vì có rất nhiều chức năng mà kiểm tra xem một giá trị là NaN -y (NA hoặc NaN):

Một số bảng sự thật cho các chức năng từ R/C API (lưu ý sự thiếu nhất quán bực bội)

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

và Rcpp:

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

và từ người phiên dịch R (lưu ý: Rcpp cố gắng để kết hợp này, chứ không phải là R/C API):

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

Thật không may đó là bối cảnh khó hiểu, nhưng điều này sẽ trao quyền cho bạn một chút.

+1

Được thực hiện tốt. Có lẽ chúng ta nên kéo nó vào trong Rcpp FAQ? –

Các vấn đề liên quan