RのバージョンアップをRからやろうとして失敗したからゴリ押した話
少し前に、メジャーアップデートとしてR 4.1.0が来ていた。
地味に分量が多くて把握しきれていないが、Rネイティブなパイプ「|>」の実装とか、関数の「(x) x+1」表記とかが目立つ変更点かと思う。
せっかくならメジャーアップデートは対応しておきたいので、RユーザーらしくRからアップデートする。
と言っても、installrパッケージの中にあるupdateR()を使うだけなので楽。
……楽なんだけど、ちょっと油断すると割と面倒な落とし穴があるので書いておく。
やり方
ただ入れるだけなら、単純にこれでいい。
install.packages("installr") library(installr) updateR()
ちなみにRStudioから動かすとエラーが出るらしいので、R本体から実施した。
ただし、単純に関数だけで走らせてしまうと今まで使用していたパッケージをコピーできないという結構エグイ問題がある。
updateR(copy_packages = TRUE)で実行すれば勝手にやってくれるので、ちゃんと指定してから走らせると安心。
また、オプションを指定し忘れたとしても丁寧にポップアップ表示で「古いRからパッケージ移す?(意訳)」みたいな感じで訊いてくれるので、落ち着いて「Yes」を選択すればいい。
そのあと、古い方のRにパッケージを残すかなど訊かれるので、必要に応じて選択。
あとは勝手にやってくれる。
本題
さて。
自分の環境で、オプションは設定せずにポップアップでパッケージのコピーを実施したら、何故か失敗した。
エラーが出ていたので確認1。
どうやらフォルダを作ろうとしたけど権限がないから弾かれたっぽい。
そんなことある……?
悔しいので、あくまでもRで対応する。
旧バージョンからのパッケージのコピー
コピーとは書いたが、正確には「旧バージョンの持っているパッケージの情報を拾ってきてインストールする」という形。
まずは旧バージョンに入れていたパッケージの情報を拾ってくる。
パッケージは基本的に「Program Files」→「R」の各バージョンのフォルダ直下の「library」フォルダに保存されていると思うが、場合によっては「ドキュメント」→「R」→「win-library」の各バージョン直下に置いてある2。
この中のパッケージ名を纏めて拾ってしまえばいい。
install.packages( list.files( path = "C:/Program Files/R/R-4.0.3/library", full.names = F ) )
なお、一括読み込みするためのコードで初期インストールされている関数以外を使用すると、「Rを再起動(≠RStudioの再起動)してからインストールします」と出るが、言う通りに再起動するとパッケージの読み込みが解除されるためコードが走らなくなる。
なのでbase関数で実行する必要がある点は注意。
library(fs) #これだと上手く走らない xxx <- fs::dir_info( path = "C:/Users/name/documents/R/win-library/4.0.3", full.names = F ) install.packages(xxx)
パッケージの名前をメモ帳などにコピーしてからインストールしたいという奇特な人については、まず初めにパッケージ名を全て纏めて取得してからメモ帳か何かにコピペ。
library(tidyverse) xxx <- list.files( path = "C:/Users/name/documents/R/win-library/4.0.3", full.names = F ) %>% str_flatten(collapse=",")
これを新しいバージョンのR上で、以下のように処理すれば完了する。
ただし、この方法でinstall.packages()に大量のパッケージ名を渡すとエラーを起こすことがあるため、場合によっては分割して渡すなど注意が必要。
xxx <- "..." #メモ帳に保存した文字列をコピペ xxx1 <- unlist(strsplit(xxx, ",")) #分割してunlist() install.packages(xxx1)
この手法については、自分のRで入っているパッケージを他のPCのRにインストールする場合にも地味に役立つため、知ってると活躍することがある、かもしれない。
Enjoy!!