Clonage de vecteurs
Contrairement à R, C++ utilise un système de copie par référence, ce qui signifie que si vous copiez une variable puis apportez des modifications à la copie, ces changements s'appliqueront aussi à l'originale.
// [[Rcpp::export]]
NumericVector always_returns_two(NumericVector x) {
// Faire une copie
NumericVector y = x;
// Modifier la copie
y[0] = 2;
// Les changements se produisent aussi dans l'originale
return x[0];
}
Pour éviter ce comportement, vous devez utiliser la fonction clone() pour copier les données sous-jacentes de la variable originale vers la nouvelle variable. La syntaxe est y = clone(x).
Dans cet exercice, deux fonctions ont été définies pour vous :
change_negatives_to_zero(): Reçoit un vecteur numérique, le modifie en remplaçant les nombres négatifs par zéro, puis retourne à la fois le vecteur original et la copie.change_negatives_to_zero_with_cloning(): Fait la même chose que ci-dessus, mais clone le vecteur original avant de le modifier.
Cette activité fait partie du cours
Optimiser le code R avec Rcpp
Instructions de l’exercice
- Complétez la définition de la fonction
change_negatives_to_zero()en assignantthe_originalàthe_copy. - Complétez la définition de la fonction
change_negatives_to_zero_with_cloning()en assignant àthe_copyle clone dethe_original. - Lisez le contenu de la console pour comparer la sortie de chaque fonction.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
#include
using namespace Rcpp;
// [[Rcpp::export]]
List change_negatives_to_zero(NumericVector the_original) {
// Set the copy to the original
NumericVector the_copy = ___;
int n = the_original.size();
for(int i = 0; i < n; i++) {
if(the_copy[i] < 0) the_copy[i] = 0;
}
return List::create(_["the_original"] = the_original, _["the_copy"] = the_copy);
}
// [[Rcpp::export]]
List change_negatives_to_zero_with_cloning(NumericVector the_original) {
// Clone the original to make the copy
NumericVector the_copy = ___;
int n = the_original.size();
for(int i = 0; i < n; i++) {
if(the_copy[i] < 0) the_copy[i] = 0;
}
return List::create(_["the_original"] = the_original, _["the_copy"] = the_copy);
}
/*** R
x <- c(0, -4, 1, -2, 2, 4, -3, -1, 3)
change_negatives_to_zero(x)
# Need to define x again because it's changed now
x <- c(0, -4, 1, -2, 2, 4, -3, -1, 3)
change_negatives_to_zero_with_cloning(x)
*/