BaşlayınÜcretsiz başlayın

Vektör klonlama

R'den farklı olarak, C++ referansla kopyalama sistemi kullanır; yani bir değişkeni kopyalayıp kopya üzerinde değişiklik yaparsan, bu değişiklikler orijinalde de gerçekleşir.

// [[Rcpp::export]]
NumericVector always_returns_two(NumericVector x) {
  // Bir kopya oluştur
  NumericVector y = x;
  // Kopyayı değiştir
  y[0] = 2;
  // Değişiklikler orijinalde de olur
  return x[0];
}

Bu davranışı önlemek için, clone() fonksiyonunu kullanarak orijinal değişkendeki altta yatan veriyi yeni değişkene kopyalamalısın. Sözdizimi y = clone(x). Bu egzersizde senin için iki fonksiyon tanımladık:

  • change_negatives_to_zero(): Sayısal bir vektör alır, negatif sayıları sıfırla değiştirerek düzenler, sonra hem orijinal vektörü hem de kopyayı döndürür.
  • change_negatives_to_zero_with_cloning(): Yukarıdakinin aynısını yapar, ancak düzenlemeden önce orijinal vektörü klonlar.

Bu egzersiz, kursun bir parçasıdır

Rcpp ile R Kodunu Optimize Etme

Kursa Göz Atın

Egzersiz talimatları

  • change_negatives_to_zero() fonksiyon tanımını, the_originalthe_copyye ayarlayarak tamamla.
  • change_negatives_to_zero_with_cloning() fonksiyon tanımını, the_copyyi the_originalın klonuna ayarlayarak tamamla.
  • Her bir fonksiyonun çıktısını karşılaştırmak için konsol içeriğini oku.

Uygulamalı etkileşimli egzersiz

Bu egzersizi bu örnek kodu tamamlayarak deneyin.

#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)
*/
Kodu Düzenle ve Çalıştır