패키지와 네임스페이스

방어적 R 프로그래밍

Dr. Colin Gillespie

Jumping Rivers

글로벌 환경

  • 기본 환경은 .GlobalEnv 입니다
  • 객체는 환경에 저장됩니다
  • 내용 보기는 ls() 를 사용합니다
  • 이 환경은 금방 가득 찹니다
  • 객체를 혼동하기 시작할 수 있습니다
n
# 또는 내가 원한 것은
N
방어적 R 프로그래밍

패키지와 환경

  • 패키지는 이름 공간으로 네임스페이스 를 사용합니다
    • 네임스페이스는 패키지를 담는 상자라고 볼 수 있습니다
  • 네임스페이스는 정리를 도와줍니다
    • 폴더와 비슷합니다
방어적 R 프로그래밍

내보낸 함수

  • library() 는 이 패키지 상자에 직접 접근하게 합니다
  • library("dplyr")dplyr 의 내보낸 함수에 직접 접근하게 합니다
## 238 exported functions
getNamespaceExports("dplyr")
  • 또는 :: 로 함수를 직접 호출할 수 있습니다
## dplyr의 filter 함수
dplyr::filter
방어적 R 프로그래밍

생각이 통할 때가 있죠

  • 때로는 패키지들이 같은 함수명을 사용합니다
## filter() 함수
stats::filter()
dplyr::filter()
  • 제가 filter() 를 치면 어떤 버전이 호출될까요?
  • 패키지 로드 순서에 달려 있습니다!
방어적 R 프로그래밍

생각이 통할 때가 있죠

  • search() 가 도와줍니다
search()
# [1] ".GlobalEnv"         "package:dplyr"      "package:stats"  
# <Other packages>
방어적 R 프로그래밍

방어적으로 접근하기

네임스페이스 충돌은 성가신 것 이상입니다

  • 진단하기 어려운 버그로 이어질 수 있습니다
방어적 R 프로그래밍

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 프로그래밍

이제 깨어날 시간

방어적 R 프로그래밍

Preparing Video For Download...