1. Học hỏi
  2. /
  3. Khoa Học
  4. /
  5. Tối ưu hóa mã R với Rcpp

Connected

Bài tập

Nhân bản vector

Không giống R, C++ sử dụng hệ thống sao chép theo tham chiếu (copy by reference), nghĩa là nếu bạn sao chép một biến rồi thay đổi bản sao, các thay đổi đó cũng sẽ xảy ra trên bản gốc.

// [[Rcpp::export]]
NumericVector always_returns_two(NumericVector x) {
  // Tạo một bản sao
  NumericVector y = x;
  // Sửa đổi bản sao
  y[0] = 2;
  // Các thay đổi cũng xảy ra ở bản gốc
  return x[0];
}

Để tránh hành vi này, bạn cần dùng hàm clone() để sao chép dữ liệu nền từ biến gốc sang biến mới. Cú pháp là y = clone(x). Trong bài này, chúng tôi đã định nghĩa sẵn cho bạn hai hàm:

  • change_negatives_to_zero(): Nhận một numeric vector, sửa bằng cách thay các số âm thành 0, rồi trả về cả vector gốc và bản sao.
  • change_negatives_to_zero_with_cloning(): Làm giống như trên, nhưng nhân bản (clone) vector gốc trước khi sửa.

Hướng dẫn

100 XP
  • Hoàn thiện định nghĩa hàm change_negatives_to_zero() bằng cách gán the_original cho the_copy.
  • Hoàn thiện định nghĩa hàm change_negatives_to_zero_with_cloning() bằng cách gán the_copy bằng bản clone của the_original.
  • Đọc nội dung trên console để so sánh đầu ra của từng hàm.