R 패키지

R 패키지

R에서 쓰는 모든 함수와 데이터는 **패키지(package)**라는 단위에 담겨 있어요. 그리고 여기서 핵심은, 그 패키지가 로드되어야만 안에 든 내용물을 쓸 수 있다는 점이에요. 왜 이렇게 했을까요? 모든 패키지를 한꺼번에 다 불러두면 메모리도 더 차지하고, 함수를 찾을 때도 검색 범위가 늘어나 비효율적이거든요. 게다가 이름이 서로 겹쳐 생기는 충돌로부터 패키지 개발자를 보호해 주는 효과도 있고요. 패키지를 만드는 과정 자체는 Creating R packages(Writing R Extensions)에서 다루니, 여기서는 사용자 입장에서 패키지를 어떻게 쓰는지 위주로 볼게요.

출처: R 공식 매뉴얼

본문

먼저 내 R 환경에 어떤 패키지가 설치되어 있는지 확인하고 싶다면, 인자 없이 library()를 실행하면 돼요.

> library()

특정 패키지를 로드할 때는 이렇게 해요. 예를 들어 Davison & Hinkley (1997)의 함수들을 담고 있는 boot 패키지는 아래처럼 부르면 돼요.

> library(boot)

인터넷에 연결된 사용자는 install.packages()update.packages() 함수로 패키지를 설치하고 업데이트할 수 있어요. 이 함수들은 Windows와 macOS GUI의 Packages 메뉴에서도 쓸 수 있는데, 자세한 내용은 R Installation and AdministrationInstalling packages를 참고하면 돼요.

지금 어떤 패키지가 로드되어 있는지 볼 때는 search()를 실행해서 검색 목록(search list)을 확인해요.

> search()

그런데 일부 패키지는 로드는 되어 있어도 검색 목록에는 나타나지 않을 수 있어요(이건 아래 Namespaces에서 다시 다룰게요). 그런 패키지들은 loadedNamespaces()가 보여주는 목록에 포함돼요.

> loadedNamespaces()

설치된 패키지에서 쓸 수 있는 도움말 주제 전체 목록을 보려면, help.start()로 HTML 도움말 시스템을 연 다음 Reference 섹션의 패키지 목록으로 이동하면 돼요.

> help.start()

여기까지가 패키지를 "확인"하고 "로드"하는 기본 도구들이에요. 이제 이 챕터에서 조금 더 깊이 다룰 세 가지 주제를 하나씩 살펴볼게요.

13.1 표준 패키지 (Standard packages)

표준 패키지, 다시 말해 베이스(base) 패키지는 R 소스 코드의 일부로 간주돼요. 이 패키지들은 R이 동작하게 하는 기본 함수들, 그리고 이 매뉴얼에서 설명하는 데이터셋과 표준 통계·그래픽 함수들을 담고 있어요. 그래서 어떤 R 설치 환경에서든 기본적으로 자동으로 쓸 수 있죠. 전체 목록이 궁금하다면 R FAQWhich add-on packages exist for R?를 보면 돼요.

13.2 기여 패키지와 CRAN (Contributed packages and CRAN)

R에는 수천 개의 기여 패키지가 있고, 만든 사람도 저마다 달라요. 어떤 패키지는 특수한 통계 방법을 구현하고, 어떤 것은 데이터나 하드웨어에 접근하게 해 주며, 또 어떤 것은 교과서 내용을 보완하려고 만들어졌어요. 그중 일부(추천(recommended) 패키지)는 R의 모든 바이너리 배포판에 함께 딸려 나와요. 대부분의 패키지는 CRAN(https://CRAN.R-project.org/과 그 미러 사이트), 그리고 Bioconductor(https://www.bioconductor.org/) 같은 저장소에서 내려받을 수 있어요. R FAQ에는 배포 시점 기준의 CRAN 패키지 목록이 실려 있지만, 사용 가능한 패키지의 목록은 매우 자주 바뀐다는 점을 함께 기억해 두면 좋아요.

13.3 네임스페이스 (Namespaces)

패키지는 **네임스페이스(namespace)**를 갖고 있는데, 네임스페이스는 세 가지 일을 해요. 첫째, 패키지 작성자가 내부용으로만 쓰려는 함수와 데이터를 숨길 수 있게 해 주고, 둘째, 사용자(또는 다른 패키지 작성자)가 패키지 안의 이름과 겹치는 이름을 골라도 함수가 망가지지 않게 막아 주며, 셋째, 특정 패키지 안의 객체를 가리키는 방법을 제공해요.

예를 들어 t()는 R에서 전치(transpose)를 구하는 함수인데, 사용자가 자기만의 t라는 함수를 정의할 수도 있겠죠. 네임스페이스가 있으면 사용자가 만든 정의가 우선해서, 행렬을 전치하려는 모든 함수가 망가지는 사태를 막아 줘요.

네임스페이스를 다루는 연산자는 두 개가 있어요. 이중 콜론 연산자 ::는 특정 네임스페이스에서 정의를 골라내요. 아까 예의 전치 함수는 base 패키지에 정의되어 있으니 base::t로 항상 쓸 수 있어요. 다만 이렇게 가져올 수 있는 건 패키지에서 내보낸(exported) 함수뿐이라는 점을 알아두세요.

삼중 콜론 연산자 :::는 R 코드에서 가끔 볼 수 있는데요, ::처럼 동작하면서도 숨겨진 객체에까지 접근할 수 있게 해 줘요. 다만 사용자 입장에서는 여러 패키지를 뒤져 주는 getAnywhere() 함수를 쓰는 편이 더 흔해요.

패키지들은 서로 의존하는 경우가 많아서, 하나를 로드하면 다른 패키지가 자동으로 로드되기도 해요. 위에서 본 콜론 연산자들도 관련 패키지를 자동 로드시켜요. 이때 네임스페이스를 가진 패키지가 자동으로 로드되면 검색 목록에는 추가되지 않는다는 점도 함께 기억해 두면 좋아요.

더 알아보기