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
Oefeninstructies
- Maak de definitie af van een functie
sum_cppdie over de elementen van eenNumericVectorloopt en de som teruggeeft.- Stel
nin op desize()vanx. - Initialiseer
resultop nul. - Specificeer de argumenten van de
for-lus. Initialiseerimet0, stel de iteratievoorwaarde in alsikleiner dann, en verhoogibij elke stap met één. - Tel in elke iteratie het ide element van
xop bijresult.
- Stel
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))
*/