고아 패키지를 아시나요?

R Packages CRAN alookr

R 패키지에도 고아가 있는 것을 알았습니다. 부모가 없는 즉, 관리자가 없는 패키지를 고아 패키지라 부르더군요. 어떻게 알아냈는지 궁금하시죠? 자세하게 알려드립니다.

유충현 https://choonghyunryu.github.io (한국알사용자회)
2022-06-15

들어가기

처음 있는 일이었습니다.
고아 패키지를 어떻게 할지 모르겠습니다만, 당분간 지켜보렵니다. 그리고 대책을 세워야겠지요.
CRAN의 세계는 참 재미집니다.

TL;DR

alookr에 발생한 일

CRAN은 주기적으로 등록된 패키지에 대해서 Check를 수행합니다. 패키지를 제출했을 때 수행하던 패키지 검사 작업을 수행하는 것입니다. 패키지의 무결성을 수시로 검사하는 것입니다. 그러므로 사용자는 걱정 없이 패키지를 다운로드하여 사용할 수 있게 되는 것이죠.

패키지의 종속성을 거미줄보다 복잡합니다. 그리고 생명이 있는 패키지들은 끊임없이 진화하고 있습니다. 이것은 버그 패키가 될 수 있고, 새로운 기능을 추가한 마이너 업그레이드가 될 수 있고, 많은 기능이 변경되는 메이저 업그레이드가 될 수 있습니다.

어떤 패키지는 퇴출되기도 하고, 어떤 새로운 패키지가 등록되기도 합니다. 이런 변화에 개별 패키지가 종속성 측면에서 무결해야 하기 때문에 정기적인 패키지 검사는 타당한 작업입니다.

그런데, 갑자기 CRAN에 등록된 alookr 패키지에 checking package dependencies 영역의 검사에서 경고가 발생했습니다.

다음과 같은 메시지로 그 원인을 추론하기 시작합니다. 처음 접하는 메시지입니다.

낯선 이름의 패키지입니다.

R 패키지 DESCRIPTION 파일을 보면, Depends, Imports, Suggests와 같은 태그를 볼 수 있습니다. 이것은 해당 패키지를 구현할 때, 대그에 기술된 패키지를 사용하였다는 의미입니다. 즉, 패키지의 종속성에 대한 설명입니다.

그래서 alookr 패키지의 DESCRIPTION을 살펴봅니다.

이 목록에 gtools를 찾아볼 수는 없습니다. 그래서 alookr 패키지가 직간접적으로 사용하는 패키지를 검색해 보았습니다. 59번째에 gtools이 보입니다.

packrat:::recursivePackageDependencies("alookr",lib.loc = .libPaths()[1])
  [1] "AsioHeaders"  "Formula"      "KernSmooth"   "MASS"        
  [5] "MLmetrics"    "Matrix"       "R6"           "RColorBrewer"
  [9] "ROCR"         "Rcpp"         "RcppEigen"    "Rttf2pt1"    
 [13] "TH.data"      "askpass"      "backports"    "base64enc"   
 [17] "bitops"       "bookdown"     "broom"        "bslib"       
 [21] "caTools"      "cachem"       "callr"        "cli"         
 [25] "codetools"    "coin"         "colorspace"   "commonmark"  
 [29] "cpp11"        "crayon"       "crosstalk"    "curl"        
 [33] "data.table"   "digest"       "dlookr"       "dplyr"       
 [37] "ellipsis"     "evaluate"     "extrafont"    "extrafontdb" 
 [41] "fansi"        "farver"       "fastmap"      "fontawesome" 
 [45] "foreach"      "fs"           "future"       "gdtools"     
 [49] "generics"     "ggmosaic"     "ggplot2"      "ggrepel"     
 [53] "glmnet"       "globals"      "glue"         "gplots"      
 [57] "gridExtra"    "gtable"       "gtools"       "highr"       
 [61] "hrbrthemes"   "htmltools"    "htmlwidgets"  "httpuv"      
 [65] "httr"         "inum"         "isoband"      "iterators"   
 [69] "jquerylib"    "jsonlite"     "kableExtra"   "knitr"       
 [73] "labeling"     "later"        "lattice"      "lazyeval"    
 [77] "libcoin"      "lifecycle"    "listenv"      "magrittr"    
 [81] "matrixStats"  "mgcv"         "mice"         "mime"        
 [85] "modeltools"   "multcomp"     "munsell"      "mvtnorm"     
 [89] "nlme"         "openssl"      "pagedown"     "parallelly"  
 [93] "party"        "partykit"     "pillar"       "pkgconfig"   
 [97] "plotly"       "plyr"         "processx"     "productplots"
[101] "promises"     "ps"           "purrr"        "randomForest"
[105] "ranger"       "rappdirs"     "reactR"       "reactable"   
[109] "rlang"        "rmarkdown"    "rpart"        "rstudioapi"  
[113] "rvest"        "sandwich"     "sass"         "scales"      
[117] "selectr"      "servr"        "shape"        "shiny"       
[121] "showtext"     "showtextdb"   "sourcetools"  "stringi"     
[125] "stringr"      "strucchange"  "survival"     "svglite"     
[129] "sys"          "sysfonts"     "systemfonts"  "tibble"      
[133] "tidyr"        "tidyselect"   "tinytex"      "utf8"        
[137] "vctrs"        "viridisLite"  "webshot"      "websocket"   
[141] "withr"        "xfun"         "xgboost"      "xml2"        
[145] "xtable"       "yaml"         "zoo"         

내친 김에, alookr과 직접적인 종속성이 있는 어떤 패키지가 gtools를 사용하는 지 살펴봅니다.

tools::package_dependencies("alookr") |> 
  unlist() |> 
  purrr::walk(
    function(x) {
      is_in <- packrat:::recursivePackageDependencies(x, lib.loc = .libPaths()[1]) |>
        stringr::str_detect("gtools") |> 
        any()

      if (is_in) print(x)
    }
  )
[1] "MLmetrics"
[1] "ROCR"

MLmetrics, ROCR 패키지가 gtools를 사용하고 있습니다.

고아 패키지라구요?

alookr 패키지가 고아(orphaned) 패키지gtools 패키지를 필요로 한다는 것입니다. 즉, gtools 패키지를 사용하는 모든 패키지의 검사에서 “당신 패키지가 고아 패키지가 된 gtools 패키지를 사용하고 있습니다. 대책을 강구하세요.”라는 메시지를 주는 것입니다.

고아 패키지 정의

https://cran.r-project.org/src/contrib/Orphaned/README에 고아 패키지에 대한 CRAN의 정의가 있습니다.

고아 패키지로 설정하는 사례는 다음과 같습니다.:

그리고 CRAN은 다음과 같은 말을 덧붙입니다.

“누구든지 고아 패키지의 유지보수 관리자가 되는 것을 환영합니다. 패키지 소스를 다운로드 한 후 DESCRIPTION 파일의 관리자 섹션에 당신 이름을 기입하고 제출하세요.”

이 것은 유지보수에 대한 책임을 지는 행위입니다. 그러나 이런 사례가 있기에 CRAN은 이런 프로세스를 운영하고 있는 것입니다.

고아 패키지는 CRAN의 검사에서 문제가 발행하지 않는 한, CRAN에 계속 남을 수 있다고 합니다.

CRAN의 gtools 패키지 정보를 조회해 보았습니다. 인지 시점과 유사한 2022-06-13에 새로운 버전 3.9.2.2이 제출되었습니다. 패키지 관리자에는 고아(ORPHANED)라고 명시되어 있습니다.

DESCRIPTION 정보를 보면, 최근에 새 버전을 제출하였거, 많은 패키지들이 gtools 패키지를 사용하는 것을 알수 있습니다. 아마도 메일이 반송되어서 고아가 되었고, 관리자는 새로운 버전을 제출한 것으로 보입니다.

단상

짧은 기간동안 운영된 CRAN이 아니기에 많은 고아 패키지가 있을 것입니다. 대중적이지 않은 패키지가 더 그러하겠지요.

고아가 생기지 않았으면 좋겠고, 고아는 좋은 관리자에게 입양되었으면 좋겠습니다.

Citation

For attribution, please cite this work as

유충현 (2022, June 15). Dataholic: 고아 패키지를 아시나요?. Retrieved from https://choonghyunryu.github.io/2022-06-15-orphaned-package.Rmd

BibTeX citation

@misc{유충현2022고아,
  author = {유충현, },
  title = {Dataholic: 고아 패키지를 아시나요?},
  url = {https://choonghyunryu.github.io/2022-06-15-orphaned-package.Rmd},
  year = {2022}
}