Xử lý giá trị thiếu
Trong R, để kiểm tra một giá trị thiếu bạn phải dùng is.na(x). (Điều gì xảy ra nếu bạn thử x == NA?)
Tương đương trong Rcpp là phương thức tĩnh is_na(). Hãy nhớ rằng "tĩnh" nghĩa là phương thức thuộc về lớp, không phải một biến cụ thể. Ví dụ, NumericVector::is_na(x) kiểm tra xem double x có phải là giá trị thiếu hay không.
Tương tự, phương thức tĩnh get_na() trả về giá trị NA cho lớp tương ứng. Ví dụ, CharacterVector::get_na() trả về một giá trị ký tự thiếu.
Lưu ý rằng toán tử logic "hoặc" trong C++ giống như trong R, ||.
Bài tập này là một phần của khóa học
Tối ưu hóa mã R với Rcpp
Hướng dẫn bài tập
- Cập nhật hàm
weighted_mean_cpp()từ bài trước để hàm trả về giá trị thiếu ngay khi thấy giá trị thiếu ởxhoặcw.- Thêm một khối
ifkiểm tra liệu phần tử thứ i củaxlàNAhoặc phần tử thứ i củawlàNA. - Bên trong khối
ifđó, trả về mộtNAkiểu số.
- Thêm một khối
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
#include
using namespace Rcpp;
// [[Rcpp::export]]
double weighted_mean_cpp(NumericVector x, NumericVector w) {
double total_w = 0;
double total_xw = 0;
int n = x.size();
for(int i = 0; i < n; i++) {
// If the ith element of x or w is NA then return NA
___
total_w += w[i];
total_xw += x[i] * w[i];
}
return total_xw / total_w;
}
/*** R
x <- c(0, 1, 3, 6, 2, 7, 13, NA, 12, 21, 11)
w <- 1 / seq_along(x)
weighted_mean_cpp(x, w)
*/