서론
이 글을 읽는 사람들은 R의 package를 사용할때 생기는 사소한 불편함에 공감을 가질 것으로 생각된다.
- install 해야되는 package개수\(^1\)가 많은데 설치여부가 확실하지 않아 모두 설치하느라 시간을 낭비할 때
- 자주 쓰는 package를 불러오도록 이미 설정을 했거나 작업중 현재 불러온 package 여부를 찾기 귀찮을 때
- 오랜만에 사용하는 package의 새로운 version이 나왔는데 모르고 지나칠때
이런 상황들 이외에도 다양한 상황을 한번쯤은 느껴봤을 것이라고 생각한다. 심지어 R, RStudio의 update를 매일 확인하지 않는다면 새로운 기능을 모르고 지나치거나 bug fix가 되지 않은 상태로 작업을 하는 것은 아쉽지 않을까?
매일 아니 매번 이런 환경을 확인하는 분들이라면 모르겠지만 필자처럼 깜박하는 사람들을 위해 code\(^2\)를 작성해보았다.
흐름도
흐름도의 내용을 목록화 한다면,
1. 사용할 package를 입력
2. install 되어 있는가 확인
3. latest version 을 확인
4. 필요한 package를 install
5. 현재 load 되어 있는가 확인
6. 필요한 paackage load
이렇게 대략 6단계로 구성되어 있다는 것을 알 수 있을 것이다. 이렇게 흐름도를 그린다던가 아래와 같이 구조를 알 수 있는 간략한 명령어로된 식을 구성해 보는 것이 좋다.
본론
설치 안된 package 목록
사용할 package 목록 중에 설치가 안된 package의 목록을 만든다.
new.pkg <- pkg[!(pkg %in% installed.packages()[,"Package"])]
업데이트가 필요한 package 목록
최신 버전이 아닌 업데이트가 필요한 package의 목록을 new.pkg에 추가한다.
old.pkg <- pkg[pkg %in% old.packages()]
if(length(old.pkg)) {
new.pkg <- c(new.pkg, old.pkg)
}
packge 설치
new.pkg 목록에 1개 이상의 package가 있다면 설치를 진행한다.
if(length(new.pkg)) install.packages(new.pkg)
packge 불러오기
현재 session에서 이미 불러온 package를 제외한 아직 불러오지 않은 package를 차례로 불러온다.
loaded.pkg <- search()[search() %in% paste0("package:", pkg)]
loaded.pkg <- substring(loaded.pkg, 9)
load.pkg <- pkg[!(pkg %in% loaded.pkg)]
if(length(load.pkg)) {
for(i in 1:length(load.pkg)) {
library(load.pkg[i], character.only=TRUE)
}
}
결론
autoload() 라는 함수 하나로 package의 install, update 확인, load까지 해결하는 편리한 기능이라고 생각한다. 그렇지만 update.packages() 함수를 활용한다면 autoload() 안의 update list 부분은 생략해도 될 것이다. 매번 세션을 시작하거나 파일을 새로 만들 때 필자의 github에 올려놓은 autoload.R\(^3\) 파일을 불러와서 활용할 수도 있고, 또는 기본 환경에서 실행되도록 설정해놓는 것도 방법일 것이다.
비고
키워드
R, packages, install, install.packages, load, library, update, automatic, function, old.packages, update.packages
LS0tCnRpdGxlOiAiUiBwYWNrYWdl7J2YIGluc3RhbGwsIHVwZGF0ZSDqt7jrpqzqs6AgbG9hZOulvCDtlZzrsojsl5AhIgphdXRob3I6ICLrsJXsooXrr7wgKEpvbmdtaW4gUGFyaykiCmRhdGU6ICdgciBTeXMuRGF0ZSgpYCcKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHRoZW1lOiBwYXBlcgotLS0KCgojIyA8Zm9udCBjb2xvcj0iYmx1ZSI+7ISc66GgPC9mb250PgoK7J20IOq4gOydhCDsnb3ripQg7IKs656M65Ok7J2AIFLsnZggcGFja2FnZeulvCDsgqzsmqntlaDrlYwg7IOd6riw64qUIOyCrOyGjO2VnCDrtojtjrjtlajsl5Ag6rO16rCQ7J2EIOqwgOyniCDqsoPsnLzroZwg7IOd6rCB65Cc64ukLgoKKiBpbnN0YWxsIO2VtOyVvOuQmOuKlCBwYWNrYWdl6rCc7IiYPGEgaHJlZj0iI2Zvb3QxIj48Zm9udCBjb2xvcj0icmVkIj4kXjEkPC9mb250PjwvYT7qsIAg66eO7J2A642wIOyEpOy5mOyXrOu2gOqwgCDtmZXsi6TtlZjsp4Ag7JWK7JWEIOuqqOuRkCDshKTsuZjtlZjripDrnbwg7Iuc6rCE7J2EIOuCreu5hO2VoCDrlYwKKiDsnpDso7wg7JOw64qUIHBhY2thZ2Xrpbwg67aI65+s7Jik64+E66GdIOydtOuvuCDshKTsoJXsnYQg7ZaI6rGw64KYIOyekeyXheykkSDtmITsnqwg67aI65+s7JioIHBhY2thZ2Ug7Jes67aA66W8IOywvuq4sCDqt4DssK7snYQg65WMCiog7Jik656c66eM7JeQIOyCrOyaqe2VmOuKlCBwYWNrYWdl7J2YIOyDiOuhnOyatCB2ZXJzaW9u7J20IOuCmOyZlOuKlOuNsCDrqqjrpbTqs6Ag7KeA64KY7Lmg65WMCgrsnbTrn7Ag7IOB7Zmp65OkIOydtOyZuOyXkOuPhCDri6TslpHtlZwg7IOB7Zmp7J2EIO2VnOuyiOyvpOydgCDripDqu7TrtKTsnYQg6rKD7J2065286rOgIOyDneqwge2VnOuLpC4g7Ius7KeA7Ja0IFIsIFJTdHVkaW/snZggdXBkYXRl66W8IOunpOydvCDtmZXsnbjtlZjsp4Ag7JWK64qU64uk66m0IOyDiOuhnOyatCDquLDriqXsnYQg66qo66W06rOgIOyngOuCmOy5mOqxsOuCmCBidWcgZml46rCAIOuQmOyngCDslYrsnYAg7IOB7YOc66GcIOyekeyXheydhCDtlZjripQg6rKD7J2AIOyVhOyJveyngCDslYrsnYTquYw/IDxicj4K66ek7J28IOyVhOuLiCDrp6Trsogg7J2065+wIO2ZmOqyveydhCDtmZXsnbjtlZjripQg67aE65Ok7J20652866m0IOuqqOultOqyoOyngOunjCDtlYTsnpDsspjrn7wg6rmc67CV7ZWY64qUIOyCrOuejOuTpOydhCDsnITtlbQgKipbY29kZV0oaHR0cHM6Ly9nenVwYXJrLmdpdGh1Yi5pby91c2VmdWxjb2RlL2F1dG9sb2FkLlIpPGEgaHJlZj0iI2Zvb3QyIj48Zm9udCBjb2xvcj0icmVkIj4kXjIkPC9mb250PjwvYT4qKuulvCDsnpHshLHtlbTrs7TslZjri6QuCgoKIyMgPGZvbnQgY29sb3I9ImJsdWUiPu2dkOumhOuPhDwvZm9udD4KPGNlbnRlcj48aW1nIHNyYz0iaHR0cHM6Ly9jMS5zdGF0aWNmbGlja3IuY29tLzMvMjIwNC8zMjYyODQxMTkyMF9hMWEwNGYxZGQzLmpwZyI+PC9jZW50ZXI+CgrtnZDrpoTrj4TsnZgg64K07Jqp7J2EIOuqqeuhne2ZlCDtlZzri6TrqbQsIDxicj4KMS4g7IKs7Jqp7ZWgIHBhY2thZ2Xrpbwg7J6F66ClIDxicj4KMi4gaW5zdGFsbCDrkJjslrQg7J6I64qU6rCAIO2ZleyduCA8YnI+CjMuIGxhdGVzdCB2ZXJzaW9uIOydhCDtmZXsnbggPGJyPgo0LiDtlYTsmpTtlZwgcGFja2FnZeulvCBpbnN0YWxsIDxicj4KNS4g7ZiE7J6sIGxvYWQg65CY7Ja0IOyeiOuKlOqwgCDtmZXsnbggPGJyPgo2LiDtlYTsmpTtlZwgcGFhY2thZ2UgbG9hZCA8YnI+CuydtOugh+qyjCDrjIDrnrUgNuuLqOqzhOuhnCDqtazshLHrkJjslrQg7J6I64uk64qUIOqyg+ydhCDslYwg7IiYIOyeiOydhCDqsoPsnbTri6QuIOydtOugh+qyjCDtnZDrpoTrj4Trpbwg6re466aw64uk642Y6rCAIOyVhOuemOyZgCDqsJnsnbQg6rWs7KGw66W8IOyVjCDsiJgg7J6I64qUIOqwhOuete2VnCDrqoXroLnslrTroZzrkJwg7Iud7J2EIOq1rOyEse2VtCDrs7TripQg6rKD7J20IOyii+uLpC4KPGNlbnRlcj48aW1nIHNyYz0iaHR0cHM6Ly9jMS5zdGF0aWNmbGlja3IuY29tLzMvMjA1Mi8zMjg1NTc4NzczMl9hYWNjMDYyYzEyLmpwZyI+PC9jZW50ZXI+CgoKIyMgPGZvbnQgY29sb3I9ImJsdWUiPuuzuOuhoDwvZm9udD4KYGBge3IsIGVjaG89RkFMU0V9CiMga25pdCDqs7zsoJXsl5DshJwgcmVwb3NpdG9yeSBlcnJvcuulvCDrsKnsp4DtlZjquLAg7JyE7ZWcIOyEpOyglQpsb2NhbCh7CiAgciA8LSBnZXRPcHRpb24oInJlcG9zIikKICByWyJDUkFOIl0gPC0gImh0dHA6Ly9jcmFuLm5leHIuY29tLyIKICBvcHRpb25zKHJlcG9zID0gcikKfSkKIyBhdXRvbG9hZCDtlajsiJjsnZgg7J6F66Cl6rCS7J2EIOqwgOyglQpwa2cgPC0gYygidGlkeXIiLCAiZ2dwbG90MiIsICJzbm93IiwgIm5sbWUiKQpgYGAKCgojIyMjIDxmb250IGNvbG9yPSJibHVlIj7shKTsuZgg7JWI65CcIHBhY2thZ2Ug66qp66GdPC9mb250PgrsgqzsmqntlaAgcGFja2FnZSDrqqnroZ0g7KSR7JeQIOyEpOy5mOqwgCDslYjrkJwgcGFja2FnZeydmCDrqqnroZ3snYQg66eM65Og64ukLgpgYGB7ciwgaW5jbHVkZT1UUlVFfQpuZXcucGtnIDwtIHBrZ1shKHBrZyAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpWywiUGFja2FnZSJdKV0KYGBgCgoKIyMjIyA8Zm9udCBjb2xvcj0iYmx1ZSI+7JeF642w7J207Yq46rCAIO2VhOyalO2VnCBwYWNrYWdlIOuqqeuhnTwvZm9udD4K7LWc7IugIOuyhOyghOydtCDslYTri4wg7JeF642w7J207Yq46rCAIO2VhOyalO2VnCBwYWNrYWdl7J2YIOuqqeuhneydhCBgbmV3LnBrZ2Dsl5Ag7LaU6rCA7ZWc64ukLgpgYGB7ciwgaW5jbHVkZT1UUlVFfQpvbGQucGtnIDwtIHBrZ1twa2cgJWluJSBvbGQucGFja2FnZXMoKV0KaWYobGVuZ3RoKG9sZC5wa2cpKSB7CiAgICBuZXcucGtnIDwtIGMobmV3LnBrZywgb2xkLnBrZykKfQpgYGAKCgojIyMjIDxmb250IGNvbG9yPSJibHVlIj5wYWNrZ2Ug7ISk7LmYPC9mb250PgpgbmV3LnBrZ2Ag66qp66Gd7JeQIDHqsJwg7J207IOB7J2YIHBhY2thZ2XqsIAg7J6I64uk66m0IOyEpOy5mOulvCDsp4TtlontlZzri6QuCmBgYHtyLCBpbmNsdWRlPVRSVUV9CmlmKGxlbmd0aChuZXcucGtnKSkgaW5zdGFsbC5wYWNrYWdlcyhuZXcucGtnKQpgYGAKCgojIyMjIDxmb250IGNvbG9yPSJibHVlIj5wYWNrZ2Ug67aI65+s7Jik6riwPC9mb250PgrtmITsnqwgc2Vzc2lvbuyXkOyEnCDsnbTrr7gg67aI65+s7JioIHBhY2thZ2Xrpbwg7KCc7Jm47ZWcIOyVhOyngSDrtojrn6zsmKTsp4Ag7JWK7J2AIHBhY2thZ2Xrpbwg7LCo66GA66GcIOu2iOufrOyYqOuLpC4KYGBge3IsIGluY2x1ZGU9VFJVRX0KbG9hZGVkLnBrZyA8LSBzZWFyY2goKVtzZWFyY2goKSAlaW4lIHBhc3RlMCgicGFja2FnZToiLCBwa2cpXQogICAgbG9hZGVkLnBrZyA8LSBzdWJzdHJpbmcobG9hZGVkLnBrZywgOSkKICAgIGxvYWQucGtnIDwtIHBrZ1shKHBrZyAlaW4lIGxvYWRlZC5wa2cpXQogICAgaWYobGVuZ3RoKGxvYWQucGtnKSkgewogICAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGxvYWQucGtnKSkgewogICAgICAgICAgICBsaWJyYXJ5KGxvYWQucGtnW2ldLCBjaGFyYWN0ZXIub25seT1UUlVFKQogICAgICAgIH0KICAgIH0KYGBgCgoKIyMgPGZvbnQgY29sb3I9ImJsdWUiPuqysOuhoDwvZm9udD4KYGF1dG9sb2FkKClgIOudvOuKlCDtlajsiJgg7ZWY64KY66GcIHBhY2thZ2XsnZggaW5zdGFsbCwgdXBkYXRlIO2ZleyduCwgbG9hZOq5jOyngCDtlbTqsrDtlZjripQg7Y6466as7ZWcIOq4sOuKpeydtOudvOqzoCDsg53qsIHtlZzri6QuIOq3uOugh+yngOunjCBgdXBkYXRlLnBhY2thZ2VzKClgIO2VqOyImOulvCDtmZzsmqntlZzri6TrqbQgYGF1dG9sb2FkKClgIOyViOydmCB1cGRhdGUgbGlzdCDrtoDrtoTsnYAg7IOd65617ZW064+EIOuQoCDqsoPsnbTri6QuIOunpOuyiCDshLjshZjsnYQg7Iuc7J6R7ZWY6rGw64KYIO2MjOydvOydhCDsg4jroZwg66eM65OkIOuVjCDtlYTsnpDsnZggZ2l0aHVi7JeQIOyYrOugpOuGk+ydgCBbYGF1dG9sb2FkLlJgXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vR3p1UGFyay91c2VmdWxjb2RlL21hc3Rlci9hdXRvbG9hZC5SKTxhIGhyZWY9IiNmb290MyI+PGZvbnQgY29sb3I9InJlZCI+JF4zJDwvZm9udD48L2E+IO2MjOydvOydhCDrtojrn6zsmYDshJwg7Zmc7Jqp7ZWgIOyImOuPhCDsnojqs6AsIOuYkOuKlCDquLDrs7gg7ZmY6rK97JeQ7IScIOyLpO2WieuQmOuPhOuhnSDshKTsoJXtlbTrhpPripQg6rKD64+EIOuwqeuyleydvCDqsoPsnbTri6QuCgoKIyMgPGZvbnQgY29sb3I9ImJsdWUiPuu5hOqzoDwvZm9udD4KCiMjIyMgPGZvbnQgY29sb3I9ImJsdWUiPuq8rOumrOunkDwvZm9udD4KPGEgbmFtZT0iZm9vdDEiIHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+JF4xJDwvc3Bhbj48L2E+W1IgcGFja2FnZV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2F2YWlsYWJsZV9wYWNrYWdlc19ieV9uYW1lLmh0bWwp7J2YIOyiheulmOuKlCDrp6TsmrAg64uk7JaR7ZWY66mwIO2YhOyerCA8Zm9udCBjb2xvcj0icmVkIj5gciBkaW0oYXZhaWxhYmxlLnBhY2thZ2VzKCkpWzFdYDwvZm9udD7qsJzqsIAg7J6I64ukLiAoYHIgcGFzdGUoU3lzLnRpbWUoKSwgU3lzLnRpbWV6b25lKCkpYCDquLDspIAsIGh0dHA6Ly9jcmFuLm5leHIuY29tLykgPGJyPgo8YSBuYW1lPSJmb290MiIgc3BhbiBzdHlsZT0iY29sb3I6cmVkIj4kXjIkPC9zcGFuPjwvYT5baHR0cHM6Ly9nenVwYXJrLmdpdGh1Yi5pby91c2VmdWxjb2RlL2F1dG9sb2FkLlJdKGh0dHBzOi8vZ3p1cGFyay5naXRodWIuaW8vdXNlZnVsY29kZS9hdXRvbG9hZC5SKSA8YnI+CjxhIG5hbWU9ImZvb3QzIiBzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPiReMyQ8L3NwYW4+PC9hPltgc291cmNlKCJodHRwczovL2d6dXBhcmsuZ2l0aHViLmlvL3VzZWZ1bGNvZGUvYXV0b2xvYWQuUiIpYF0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0d6dVBhcmsvdXNlZnVsY29kZS9tYXN0ZXIvYXV0b2xvYWQuUikKCgojIyMjIDxmb250IGNvbG9yPSJibHVlIj7ssLjqs6A8L2ZvbnQ+ClthdmFpbGFibGUucGFja2FnZXMoKV0oaHR0cHM6Ly9zdGF0LmV0aHouY2gvUi1tYW51YWwvUi1kZXZlbC9saWJyYXJ5L3V0aWxzL2h0bWwvYXZhaWxhYmxlLnBhY2thZ2VzLmh0bWwpIDxicj4KW2xpYnJhcnkoKV0oaHR0cHM6Ly9zdGF0LmV0aHouY2gvUi1tYW51YWwvUi1kZXZlbC9saWJyYXJ5L2Jhc2UvaHRtbC9saWJyYXJ5Lmh0bWwpIDxicj4KW29sZC5wYWNrYWdlcygpXShodHRwczovL3N0YXQuZXRoei5jaC9SLW1hbnVhbC9SLWRldmVsL2xpYnJhcnkvdXRpbHMvaHRtbC91cGRhdGUucGFja2FnZXMuaHRtbCkgPGJyPgpbc2VhcmNoKCldKGh0dHBzOi8vc3RhdC5ldGh6LmNoL1ItbWFudWFsL1ItZGV2ZWwvbGlicmFyeS9iYXNlL2h0bWwvc2VhcmNoLmh0bWwpIDxicj4KCgojIyMjIDxmb250IGNvbG9yPSJibHVlIj7tgqTsm4zrk5w8L2ZvbnQ+ClIsIHBhY2thZ2VzLCBpbnN0YWxsLCBpbnN0YWxsLnBhY2thZ2VzLCBsb2FkLCBsaWJyYXJ5LCB1cGRhdGUsIGF1dG9tYXRpYywgZnVuY3Rpb24sIG9sZC5wYWNrYWdlcywgdXBkYXRlLnBhY2thZ2Vz