處理遺漏值
在 R 中,要測試是否為遺漏值,必須使用 is.na(x)。(如果你嘗試 x == NA 會怎樣?)
在 Rcpp 中的對應作法是使用靜態方法 is_na()。回想一下,靜態代表這個方法是類別的一部分,而不是特定變數的成員。例如,NumericVector::is_na(x) 會測試 double 型別的 x 是否為遺漏值。
同樣地,靜態方法 get_na() 會回傳該類別對應的 NA。例如,CharacterVector::get_na() 會回傳遺漏的字元值。
請注意,C++ 中的邏輯「或」與 R 相同,都是 ||。
本練習屬於課程
用 Rcpp 最佳化 R 程式碼
練習說明
- 將前一個練習中的
weighted_mean_cpp()函式更新為:一旦在x或w中遇到遺漏值就立刻回傳遺漏值。- 新增一個
if區塊,用來檢查x的第 i 個元素是否為NA,或w的第 i 個元素是否為NA。 - 在該
if區塊中,回傳數值型的NA。
- 新增一個
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
#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)
*/