Rのバージョンアップに伴うパッケージの再インストール

目次

R のバージョンアップにより消えたパッケージを、コマンド一発で全て再インストールする。


目的

R のバージョンが上がると、インストールしたパッケージを探すディレクトリが変わるため、これまで使っていたパッケージが消えてしまう(ように見える)。

これを期に必要なものだけを再インストールしてもよいが、これまで使っていたパッケージをコマンド一発で全て再インストールする。

方法

installed.packages()を使用すると、現在インストールされているパッケージの一覧を取得できます。また、lib.locオプションを指定すると、指定したディレクトリーにインストールされているパッケージの一覧を取得します。

そこで、現在のパッケージの一覧と以前使っていたパッケージの一覧から差分を抽出して、不足するパッケージをインストールします。

CRAN に無いパッケージは、GitHub からインストールします。この時、パッケージ名が重なっている場合は、安全のためインストールしません。

#!/usr/bin/env Rscript

# Rscript R/upgrade_packages.R ~/R/x86_64-pc-linux-gnu-library/4.0/

#install.packages(c("tidyverse", "magrittr", "stringr", "devtools", "jsonlite"))
library(tidyverse)
library(magrittr)
library(stringr)
library(devtools)
library(jsonlite)

args = commandArgs(trailingOnly=TRUE)
if (length(args)==0) {
  stop("No previouse packages dir.")
}
prev_pkg_dir <- args[1]

# https://www.r-bloggers.com/2020/04/get-all-your-packages-back-on-r-4-0-0/

old_packages <- as_tibble(installed.packages(
             lib.loc =prev_pkg_dir))

#old_packages %$>%
#  head(Package)

new_packages <- as_tibble(installed.packages())

old_packages %>%
  anti_join(new_packages, by="Package") %$%
  install.packages(Package)

# install not from CRAN
new_packages <- as_tibble(installed.packages())
old_packages %>%
  anti_join(new_packages, by="Package") -> missing_packages
#missing_packages %$>%
#  head(Package)

# github_pkg_name <- function(pkg) {
#     repo = fromJSON(paste0("http://rpkg-api.gepuro.net/rpkg?q=", pkg))
#     repo %>%
#       filter(basename(pkg_name)== pkg) %>%
#       filter(! str_starts(pkg_name, "cran/")) -> tmp
#     if (nrow(tmp) == 1) {
#       result <- tmp$pkg_name[1]
#     } else {
#       result <- NA
#     }
#   result
# }
# github_pkg <- function(pkgs) {
#   sapply(pkgs, github_pkg_name)
# }

# get package name one by one.
github_pkg <- function(pkgs) {
  github <- c()
  for (pkg in pkgs) {
    repo = fromJSON(paste0("http://rpkg-api.gepuro.net/rpkg?q=", pkg))
    repo %>%
      filter(basename(pkg_name)== pkg) %>%
      filter(! str_starts(pkg_name, "cran/")) -> tmp
    if (nrow(tmp) == 1) {
      github <- c(github, tmp$pkg_name[1])
    } else {
      github <- c(github, NA)
    }
  }
  github
}

# install from GitHub
if (nrow(missing_packages) > 0) {
  missing_packages %>%
    mutate(github = github_pkg(Package)) %$%
    install_github(github)

  # check
  new_packages <- as_tibble(installed.packages())

  old_packages %>%
    anti_join(new_packages, by="Package") -> missing_packages
  missing_packages
}

使用方法

  1. 上のスクリプトを適当なファイル名で保存します。例えばupgrade_packages.Rとします。
  2. このupgrade_packages.Rを Rstudio 上で実行するときには、prev_pkg_dirに以前のバージョンで使用していたパッケージがインストールされているディレクトリーを指定します。コマンドラインから実行する場合には、引数としてディレクトリを指定します。
Rscript upgrade_packages.R ~/R/x86_64-pc-linux-gnu-library/4.0

参考サイトと脚注

Get all your packages back on R 4.0.0