Aan de slagGa gratis aan de slag

Omgaan met missende waarden

In R moet je is.na(x) gebruiken om te testen op een missende waarde. (Wat gebeurt er als je x == NA probeert?)

Het equivalent in Rcpp is de statische methode is_na(). Onthoud dat statisch betekent dat de methode bij de klasse hoort, niet bij de specifieke variabele. Bijvoorbeeld, NumericVector::is_na(x) test of de double x een missende waarde is.
Op dezelfde manier geeft de statische methode get_na() je de NA van de bijbehorende klasse. Bijvoorbeeld, CharacterVector::get_na() retourneert een missende tekenreekswaarde.

Let op: de logische of in C++ is hetzelfde als in R, ||.

Deze oefening maakt deel uit van de cursus

R-code optimaliseren met Rcpp

Cursus bekijken

Oefeninstructies

  • Werk de functie weighted_mean_cpp() uit de vorige oefening bij zodat die meteen een missende waarde retourneert zodra er een missende waarde in x of w voorkomt.
    • Voeg een if-blok toe dat controleert of het ide element van x NA is of het ide element van w NA is.
    • Retourneer binnen dat if-blok een numerieke NA.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

#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)
*/
Code bewerken en uitvoeren