แพ็กเกจและ Namespaces

การเขียน R แบบ Defensive Programming

Dr. Colin Gillespie

Jumping Rivers

Global environment ของคุณ

  • สภาพแวดล้อมเริ่มต้นคือ .GlobalEnv
  • ออบเจกต์ถูกเก็บในสภาพแวดล้อม
  • ใช้ ls() เพื่อดูเนื้อหา
  • สภาพแวดล้อมนี้จะเต็มได้รวดเร็ว
  • อาจทำให้ออบเจกต์ปะปนกันได้
n
# or did I want
N
การเขียน R แบบ Defensive Programming

แพ็กเกจและสภาพแวดล้อม

  • แพ็กเกจใช้ namespaces เป็นพื้นที่สำหรับชื่อ
    • ลองนึกภาพ namespace เป็นกล่องที่บรรจุแพ็กเกจไว้
  • Namespace ช่วยจัดระเบียบสิ่งต่าง ๆ
    • คล้ายกับโฟลเดอร์
การเขียน R แบบ Defensive Programming

ฟังก์ชันที่ export ออกมา

  • library() ให้เข้าถึงกล่องแพ็กเกจได้โดยตรง
  • library("dplyr") ให้เข้าถึงฟังก์ชันที่ export ออกมาใน dplyr โดยตรง
## 238 exported functions
getNamespaceExports("dplyr")
  • หรือใช้ :: เพื่อเข้าถึงฟังก์ชันโดยตรง
## The filter function from dplyr
dplyr::filter
การเขียน R แบบ Defensive Programming

ความคิดที่ตรงกัน

  • บางครั้งผู้พัฒนาแพ็กเกจใช้ชื่อฟังก์ชันเดียวกัน
## The filter() function
stats::filter()
dplyr::filter()
  • ถ้าพิมพ์ filter() จะได้เวอร์ชันไหน?
  • ขึ้นอยู่กับลำดับการโหลดแพ็กเกจ!
การเขียน R แบบ Defensive Programming

ความคิดที่ตรงกัน

  • search() มาช่วยได้
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
การเขียน R แบบ Defensive Programming

ป้องกันไว้ก่อน

การชนกันของ namespace ไม่ใช่แค่ความยุ่งยาก

  • แต่อาจทำให้เกิดบักที่วินิจฉัยได้ยาก
การเขียน R แบบ Defensive Programming

แพ็กเกจ conflicted ช่วยให้การเลือกฟังก์ชันเป็นเรื่อง ชัดเจน

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")
การเขียน R แบบ Defensive Programming

มาฝึกกันเถอะ!

การเขียน R แบบ Defensive Programming

Preparing Video For Download...