Klonowanie wektorów
W przeciwieństwie do R, C++ stosuje system kopiowania przez referencję — oznacza to, że jeśli skopiujesz zmienną, a następnie zmodyfikujesz kopię, zmiany zostaną wprowadzone również w oryginale.
// [[Rcpp::export]]
NumericVector always_returns_two(NumericVector x) {
// Make a copy
NumericVector y = x;
// Modify the copy
y[0] = 2;
// The changes also happen in the original
return x[0];
}
Aby temu zapobiec, należy użyć funkcji clone(), która kopiuje dane z oryginalnej zmiennej do nowej. Składnia wygląda następująco: y = clone(x).
W tym ćwiczeniu przygotowano dla ciebie dwie funkcje:
change_negatives_to_zero(): przyjmuje wektor liczbowy, modyfikuje go, zastępując wartości ujemne zerami, a następnie zwraca zarówno oryginalny wektor, jak i kopię.change_negatives_to_zero_with_cloning(): działa tak samo jak powyższa, ale przed modyfikacją klonuje oryginalny wektor.
To ćwiczenie jest częścią kursu
Optymalizacja kodu R za pomocą Rcpp
Instrukcje do ćwiczenia
- Uzupełnij definicję funkcji
change_negatives_to_zero(), przypisującthe_originaldothe_copy. - Uzupełnij definicję funkcji
change_negatives_to_zero_with_cloning(), przypisując dothe_copyklon zmiennejthe_original. - Przeczytaj zawartość konsoli i porównaj wyniki obu funkcji.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
#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)
*/