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