R) 패키지 문제해결

R) 패키지 문제해결

패키지를 불러오다 보면 설치가 제대로 안될때가 있고, 잘 쓰던 함수가 안될때도 있다. 이와 관련해서 어떤 문제가 발생할 수 있고 어떻게 대처하는지 알아보자.

함수

분명히 기존에 어떠한 함수를 잘 사용 하고 있었는데 갑자기 안될때가 있다. 코드가 실행되고 안되고는 분명한 원인이 있기 때문이다. 그 원인 파악이 되지 않을 때 우리는 “어제는 분명 돌아갔는데…” 라는 말을 하곤 한다.

이런 상황에서 발생하는 대표적인 원인 중 하나는 오타이지만 그런 단순한 이유로 오랫동안 고통받지는 않을 것이다. 분명히 함수는 존재하고 함수를 사용하고자 하는데 똑같은 코드인데 먹지 않는 이유는 함수이름은 같지만 다른 패키지의 함수가 로드 되었을 때 이런 현상이 나타난다. 이와 관련하여 보다 자세하게 알아보도록 하겠다.

특정 함수만 불러오기

패키지 개요에서 소개한 내용인 원하는 패키지의 원하는 함수를 정확하게 지정하여 사용하는 방법을 사용해야 한다.

예를 들어 data.table 패키지의 fread() 함수를 사용하는 코드는 다음과 같다.

1
data.table::fread()

그런데 또 어떤 경우에는 굳이 이렇게 코드를 작성하지 않아도 올바르게 작동하는 경우가 있다. 도대체 왜 그런 것일까? 그 이유는 패키지를 불러올 때 함수 이름이 겹치는 경우 발생하는 문제 때문에 그렇다. 다음의 함수 덮어쓰기를 보자.

함수 덮어쓰기

같은 이름의 함수가 등장할 때 R이 가만히 있을 이유가 없다. 예기치 않은 동작을 방지하기 위해서 반드시 무언가 이 문제를 처리해야 한다. 가끔 패키지를 로드할 때 여러가지 메세지를 보지만 혹시 mask 라는 단어를 본적 있는가?

데이터 전처리에서 많이 사용하는 dplyr 패키지를 불러보겠다.

1
library("dplyr")

dplyr 패키지 메세지

메세지 중에서 ‘masked from’ 이라는 문구를 잘 보면 된다. 지금 dplyr 패키지를 불러오면서 총 6개 함수가 dplyr 패키지의 함수로 덮어씌워졌다고 안내하고 있다. 그 중 filter() 함수와 lag() 함수는 stats 패키지의 것을 덮어썼고, instersect(), setdiff(), setequal(), union() 함수는 base 패키지의 함수를 덮어썼다.

즉, 이와 같은 메세지가 등장한다면 dplyr 패키지를 불러오기 전에는 lag() 함수를 사용하더라도 stats 패키지의 것을 쓰지만, dplyr 패키지를 불러온 이후에는 dplyr 패키지의 lag() 함수가 우선시되어 동작한다는 것을 의미한다.

참고로 tidyverse 패키지의 경우 관련 메세지를 굉장히 화려하고 직관적으로 보여준다.

tidyverse 패키지 메세지

‘Conflicts’ 메세지 아래에 어떤 패키지의 함수가 어떤 패키지의 함수와 충돌이 나서 덮어씌워졌는지 알려준다.

패키지 설치

버전 문제

최신 버전의 패키지가 제대로 설치되지 않는 경우가 있다. 가끔 최신 버전의 패키지가 안정성의 문제로 제대로 동작을 하지 않을 때가 있는데, 그럴때는 직전 버전의 패키지를 설치하는 등 원하는 패키지 버전을 지정하여 설치할 수 있다.

cran에서 직접 패키지 다운로드를 받을 때 다음과 같은 화면을 본적이 있을 것이다.

cran 패키지 다운로드 화면

해당 화면 가장 아래쪽을 보면 [Old sources]를 누르면 다음과 같이 다른 버전의 패키지목록을 볼 수 있다.

A3 패키지의 아카이브

예를 들어서 A3 패키지의 0.9.1 버전을 설치하고자 한다면 다음과 같이 코드를 작성하면 된다.

1
2
3
install.packages("https://cran.r-project.org/src/contrib/Archive/A3/A3_0.9.1.tar.gz",
repos = NULL,
type = "source")

물론 압축파일의 웹 주소 대신 직접 다운로드 받은 후 압축파일 경로를 입력해도 된다.

패키지 관리

버전 관리

패키지는 계속 업데이트 되는데 어떤 패키지가 새로 나왔는지 확인하는 것은 귀찮고 어렵다. 정말 중요한 패키지라면 정보도 많이 공유하고 할텐데 직접 불러오지 않는 패키지도 많고, 패키지 개수도 많기에 자동화 도구가 필요한 것이 사실이다.

RStudio는 이런 불편을 덜기 위해 편리한 패키지 업데이트 기능을 지원한다. 다음과 같이 따라해보자.

RStudio 패키지 업데이트 확인 메뉴

패키지 업데이트 확인 메뉴를 누르게 되면 다음과 같이 업데이트가 필요한 패키지의 목록을 나열해준다. 해당 목록을 보고 원하는 패키지를 지정해서 업데이트 하던지, [Select All] 버튼을 눌러 업데이트가 필요한 패키지 전체를 한 번에 업데이트할 수 있다.

패키지 업데이트 팝업

우선 상단의 3개 패키지만 선택하여 패키지 업데이트를 진행한 화면은 다음과 같다.

3개 패키지 업데이트 화면

사실 패키지 업데이트 함수가 따로 있는 것은 아니고 패키지 설치 함수인 install.packages() 함수를 그대로 쓴다. 이 경우는 단지, 함수 내에 패키지명을 입력하는 것을 RStudio가 편하게 해 줄 뿐이다.

오프라인 설치

오프라인으로 설치를 해야하는 경우는 보통 특정 조직이나 기업에서 보안상의 문제로 PC와 외부 인터넷 연결이 차단되어있을 때 실시하는 경우가 많다. 그리고 패키지의 오프라인 설치는 패키지 개요에서 다룬적이 있다. 하지만 cran에서 하나씩 압축파일을 다운받아 설치하는 방법은 의존 패키지 설치까지 하기엔 무리가 있다. 왜냐하면 어떤 패키지는 의존 패키지가 10개 이상인 경우도 있고, 의존 패키지의 의존 패키지도 있을 수 있기 때문에 직접 다 찾아서 다운받기는 어렵다.

그래도 방법은 있다. 다음의 절차를 따라해보자.

패키지 이동 순서도

  1. 우선 외부 인터넷이 연결된 PC를 준비한다.
  2. 해당 PC에 R을 설치하고 필요한 패키지를 죄다 설치한다.
  3. 패키지가 설치되어 있는 폴더를 압축한다.
  4. 외부 저장매체로 인터넷이 되지 않는 PC에 압축파일을 옮긴다.
  5. 패키지가 설치되어 있는 폴더에 압축을 풀고 전부 덮어쓰기 한다.

이렇게 조치해주면 거의 대부분의 패키지가 정상동작한다. 즉, install.packages() 함수를 사용하지 않고도 패키지를 설치한 것과 같은 효과가 나는 것이다. 이제 library() 함수를 바로 사용하면 된다. 그래도 가끔 의존 패키지 문제나 환경 문제로 동작하지 않는 패키지가 있을 수 있으니 주의하자.

기타

패키지를 설치할 때 해석하기 어려운 팝업 메세지창이 뜨곤 한다. 대표적으로 두 가지 경우의 팝업창이 있는데 먼저 메세지 내용이 긴 것을 보도록 하자.

로드된 패키지 설치 경고

중요한 문장은 메세지 제목인 “Updating Loaded Packages” 이다. 즉, 이미 패키지가 불러와져 있는 상태에서 또 설치할지 묻는 내용이다. 여기서 R의 재시작을 권장하는데 설치하기 전에 재시작을 하려면 [Yes] 버튼을 누르면 된다.

두 번째 메세지는 조금 짧다.
R 설치 버전 경고

이 경우는 특정 패키지의 source와 binary 세부 버전이 조금 차이날 때 어떤 것을 선택하여 설치할 것인지 묻는 것이다. [예]를 누르면 최신버전이 설치되나, [아니오]를 누르는 것이 보통 별 문제 없이 제대로 설치가 되기에 [아니오]를 권장한다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×