Scalaire generatie van willekeurige getallen
Als je R-code schrijft, is het meestal logisch om willekeurige getallen gevectoriseerd te genereren. In C++ mag je echter (zelfs van je schuldige geweten) lussen gebruiken en de gegevens element voor element verwerken.
De R-API geeft je functies om een willekeurig getal te genereren uit een van de gebruikelijke verdelingen, en Rcpp maakt deze functies toegankelijk in de R::-namespace. Zo geeft R::rnorm(2, 3) je één willekeurig getal uit de normale verdeling met gemiddelde 2 en standaardafwijking 3. Merk op dat het argument n uit de “echte” rnorm() ontbreekt. De Rcpp-versie retourneert altijd één getal.
Ga aan de slag en maak de functiedefinitie van positive_rnorm() af.
Let op: Dit laatste hoofdstuk is pittig, dus raak niet ontmoedigd als het niet in één keer lukt. Denk aan de beloning als je deze cursus afrondt: de prestaties van je R-code dramatisch verbeteren!
Deze oefening maakt deel uit van de cursus
R-code optimaliseren met Rcpp
Oefeninstructies
- Specificeer de geretourneerde waarde
outals een numerieke vector van grootten. - Lees de luscode om te zien wat elk deel doet.
- Genereer een normaal willekeurig getal met gemiddelde
meanen standaardafwijkingsd, en ken dit toe aanout[i]. - Terwijl
out[i]kleiner dan of gelijk aan nul is, probeer je het opnieuw.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
#include
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector positive_rnorm(int n, double mean, double sd) {
// Specify out as a numeric vector of size n
___ ___(___);
// This loops over the elements of out
for(int i = 0; i < n; i++) {
// This loop keeps trying to generate a value
do {
// Call R's rnorm()
out[i] = ___;
// While the number is negative, keep trying
} while(___);
}
return out;
}
/*** R
positive_rnorm(10, 2, 2)
*/