Gói và không gian tên

Lập trình R theo hướng phòng thủ

Dr. Colin Gillespie

Jumping Rivers

Môi trường global của bạn

  • Môi trường mặc định là .GlobalEnv
  • Đối tượng được lưu trong các môi trường
  • Dùng ls() để xem nội dung
  • Môi trường này đầy rất nhanh
  • Ta dễ nhầm lẫn giữa các đối tượng
n
# hay tôi muốn
N
Lập trình R theo hướng phòng thủ

Gói và môi trường

  • Gói dùng namespace làm không gian đặt tên
    • Hãy coi namespace như chiếc hộp chứa gói
  • Namespace giúp mọi thứ gọn gàng
    • Giống như thư mục
Lập trình R theo hướng phòng thủ

Các hàm được export

  • library() cho bạn truy cập trực tiếp vào chiếc hộp của gói
  • library("dplyr") cho bạn dùng trực tiếp các hàm được export trong dplyr
## 238 exported functions
getNamespaceExports("dplyr")
  • Hoặc dùng :: để gọi trực tiếp một hàm
## Hàm filter từ dplyr
dplyr::filter
Lập trình R theo hướng phòng thủ

Tư tưởng lớn gặp nhau

  • Đôi khi các tác giả gói đặt trùng tên hàm
## Hàm filter()
stats::filter()
dplyr::filter()
  • Nếu tôi gõ filter() tôi sẽ nhận phiên bản nào?
  • Tùy vào thứ tự nạp gói!
Lập trình R theo hướng phòng thủ

Tư tưởng lớn gặp nhau

  • search() sẽ giúp bạn
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
Lập trình R theo hướng phòng thủ

Hãy phòng ngừa

Xung đột không gian tên không chỉ phiền toái

  • Chúng có thể gây lỗi khó chẩn đoán
Lập trình R theo hướng phòng thủ

Gói conflicted buộc bạn chọn hàm một cách tường minh

library("conflicted")
library("dplyr")
filter
#Error: [conflicted] `filter` found in 2 packages.
#Either pick the one you want with `::` 
# * dplyr::filter
# * stats::filter
#Or declare a preference with `conflict_prefer()`
# * conflict_prefer("filter", "dplyr")
# * conflict_prefer("filter", "stats")
Lập trình R theo hướng phòng thủ

Đến giờ thức dậy

Lập trình R theo hướng phòng thủ

Preparing Video For Download...