Aan de slagGa gratis aan de slag

Som van double-vector

Omdat lussen in C++ meestal veel sneller draaien dan in R, is het schrijven van lussen een belangrijke vaardigheid. Laten we beginnen met een functie die waarden uit een NumericVector optelt. Dit sluit aan op wat je hebt geleerd in hoofdstuk 2, oefening 10, en in de vorige oefening van dit hoofdstuk.

Deze oefening maakt deel uit van de cursus

R-code optimaliseren met Rcpp

Cursus bekijken

Oefeninstructies

  • Maak de definitie af van een functie sum_cpp die over de elementen van een NumericVector loopt en de som teruggeeft.
    • Stel n in op de size() van x.
    • Initialiseer result op nul.
    • Specificeer de argumenten van de for-lus. Initialiseer i met 0, stel de iteratievoorwaarde in als i kleiner dan n, en verhoog i bij elke stap met één.
    • Tel in elke iteratie het ide element van x op bij result.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

#include 
using namespace Rcpp;

// [[Rcpp::export]]
double sum_cpp(NumericVector x) {
  // The size of x
  int n = ___;
  // Initialize the result
  double result = ___;
  // Complete the loop specification
  for(int i = 0; ___; ___) {
    // Add the next value
    result = result + ___;
  }
  return result;
}

/*** R
set.seed(42)
x <- rnorm(1e6)
sum_cpp(x)
# Does the function give the same answer as R's sum() function?
all.equal(sum_cpp(x), sum(x))
*/
Code bewerken en uitvoeren