Home R 3.5.0~ 버전에서 패키지 업데이트 블라블라 문제가 있었던 사람들을 위한 후일담
Post
Cancel

R 3.5.0~ 버전에서 패키지 업데이트 블라블라 문제가 있었던 사람들을 위한 후일담

( 요즘 긴 제목이 유행이라기에 한 번 써봤습니다(그거 아님) . 그림은 Peanuts. R 3.5.0 버전명은 Joy In Playing이고 R은 피너츠 코믹스를 아낍니다.)

물론 R 3.5.0 버전은 작년에 나왔다. 하지만 사실 내가 작년에는 R을 많이 쓰지 않은 관계로(아는 사람은 알겠지만 나는 그 때 그 때 필요한 것을 쓰기 때문이고 작년에는 R을 쓸 일이 별로 없었다…) 이전 R 3.3.x 버전을 쓰다가, 이제 다시 좀 쓰기 시작해서 업데이트를 했다. 마침 최근 쓰게 된 서버에서도 Ubuntu에 기본으로 내장된 R을 쓰다가 그게 3.2.x 버전인 것을 보고 이건 아니다 싶어서 이 것도 한꺼번에 최근 나온 3.6.1로 업데이트를 했다.

즐겁게 업데이트를 한 후 전에 하다 만 일을 계속 하기 위해서 R 프로젝트를 다시 불러와서 패키지를 실행하는데, 아니 잘 돌아가던 패키지가 와장창창 이상한 에러를 뱉어내는 것이 아닌가.

Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) : namespace ‘rlang’ 0.4.0 is already loaded, but >= 0.4.0.9001 is required

이괴머여. 심지어 저 패키지의 0.4.0은 최신 버전…. (충격과 공포)

처음에는 패키지의 문제인가 하여 다른 패키지를 불러봐도 다른 패키지 역시 비슷한 문제가 발생. 로컬 머신의 문제인가 하여 새로 업데이트한 서버에서도 실행해 보고 RStudio를 찾아봐도 아니 이거 최신버전이고 어느 쪽이든 똑같은 문제가 생기는 것이었다.

아 어쩌지 이게 뭐지 싶어서 열심히 인터넷과 스택오버플로우를 떠돌다가 어디선가 package recompile 어쩌고 하는 것을 보고는 혹시나 하는 마음에 전체 패키지 업데이트-재컴파일을 해 보았다.

update.packages(checkBuilt=TRUE, ask=FALSE)

checkBuilt 의 경우 이를 TRUE로 설정하면 CRAN에 보다 최신 버전의 패키지가 있는 경우 업데이트를 하고, R의 이전 버전에서 만들어진 경우 새 버전에서 새로 컴파일해서 설치한다. (RStudio Server를 쓰는 경우 개인별로 설치하는 경우가 있고 어드민이 전체용으로 설치하는 경우가 있으니 이 경우 두 군데서 다 해주는 것이 좋다)

이렇게 하니 문제 해결. 끗!


하지만 이렇게 문제가 끝난 것은 좋지만. 자고로 문제가 일어났으면 원인을 이해하고 가야 하는 법. 열심히 R을 뒤지고 뒤져서 R 3.5.0에서 와장창 업데이트가 된 것을 발견했다. (왜 내가 안 쓰는 사이에 이런 일이 일어난 것이냐…) (이제서야 찾으려니 더 찾기 힘들었다. ) (아니 0.1 업데이트해놓고 왜 메이저 업데이트라는가 이래도 되는건가 (…))

R 3.5.0 release 문서에 보면 ‘유의하게 눈에 띄는 변화’로 패키지가 설치될 때 바로 byte-compile되는 것을 꼽는다. 이전에는 일부 패키지는 미리 바이트로 컴파일되어 있었지만 그렇지 않은 경우가 기본이었고, 그래서 필요시 (자주 사용하는 함수나 패키지가 너무 크고 느리다) compiler 패키지를 추가로 써서 함수 같은 것을 바이트 컴파일 버전으로 만들어서 사용하면 되었다. 그러다 3.5.0 버전에서 바이트 컴파일이 자체적으로 들어가서, 기본적인 패키지나 패키지에 들어가는 함수를 이런 식으로 사용할 필요는 없어졌다. (자체 함수를 무겁게 만들어서 사용하는 경우에는 여전히 compiler 패키지가 유용하다. 찾아보니 며칠 전에 4.0으로 메이저 업데이트(…)가 있었다. ) 이러면서 패키지 컴파일 형태가 바뀌면서 이런 에러가 와장창 났었던 것이다. (더불어 최근 사용하는 것들 중에서는 크게 영향은 없겠지만 3.6.0에서도 로케일이나 기존 포트란 지원 등에서 바뀐 것이 다소 있기도 하고 R도 성능 개선 등에 대해서 계속 노력을 하는 중이니 메이저 업데이트 후에는 깔끔하게 한 번씩 패키지 리컴파일 업데이트를 돌려줘도 좋겠다)

추가로 그간 많은 기능 추가와 버그 픽스가 있었지만 그 중에서 바이트 컴파일과 함께 성능 개선용으로 만들어진(그러면서 눈에는 안 띄는) 것이 아마도 새 직렬화 포맷(버전 3)으로 업데이트된 것(3.5.0에서 올라와서 3.6.0에서 기본 포맷으로 지정되었다. 더불어 성능 개선은 아니지만 3.6.0의 메이저 업데이트 중 하나는 sample() 방식이 바뀐 것이니 이에 대해서도 살펴보면 좋을 것이다)과 ALTREP(ALTernative REPresentation for R Objects) 프레임워크일 것이다. R 데이터 타입에 대응하는 추상화 클래스를 만들어서 이를 코드에서 내재적으로 사용하도록 하는 식인 것으로 보이며 아직 계속 개발 되는 중(이고 개발 될 것이 많음)으로 보인다. 지금까지 성능 테스트한 결과들이 꽤 괜찮아 보여서 앞으로가 기대가 된다.

    This post is licensed under CC BY 4.0 by the author.

    201905-201908 책 로그

    Google BigQuery 쉽게 쓰게 하기 (feat. ARRAY)