1. ホーム
  2. r

[解決済み] Rの新バージョンをインストールするのに苦労しない方法?

2022-05-02 08:53:16

質問

Andrew Gelmanは最近、Rのアップグレードが簡単でないことを嘆いていました。 (おそらく、LinuxよりもWindowsの方がより適切でしょう)。 ソフトウェアのインストールから、すべての設定やパッケージのコピーまで、アップグレードを行うための良いトリックをお持ちの方はいらっしゃいますか?

この提案はコメントに含まれていたもので、私が最近使っているものです。 まず、新しいバージョンをインストールし、次に古いバージョンでこれを実行します。

#--run in the old version of R
setwd("C:/Temp/")
packages <- installed.packages()[,"Package"]
save(packages, file="Rpackages")

続いて新バージョンではこのようになります。

#--run in the new version
setwd("C:/Temp/")
load("Rpackages")
for (p in setdiff(packages, installed.packages()[,"Package"]))
install.packages(p)

解決方法は?

念のため、この問題が発生しないようにするための方法がいくつかあります。Dirk が言ったように、パッケージをコンピュータの別のディレクトリに保存してください。

install.packages("thepackage",lib="/path/to/directory/with/libraries")

デフォルトの .Library の値は、関数 .libPaths

.libPaths("/path/to/directory/with/libraries")

の最初の値としてこのパスを配置します。 .Library という変数があり、これをデフォルトとします。

さらに自動化したい場合は、Rビルドの/etc/ディレクトリにあるRprofile.siteファイルで指定することができます。そうすれば、Rがロードされるたびに自動的にロードされるようになり、もう心配する必要はありません。指定したディレクトリからパッケージをインストールし、読み込むだけです。

最後に、私はRprofile.siteに小さなコードを入れて、新しいRのバージョンをインストールしたときにすべてのパッケージを再インストールできるようにしています。あなたはただ、それらをリストアップする必要があります 以前 新しいRのバージョンにアップデートしたとき。私は、すべてのパッケージの更新されたリストを含む.RDataファイルを使用してそれを行う。

library(utils)

## Check necessary packages
load("G:\Setinfo\R\packagelist.RData") # includes a vector "pkgs"
installed <- pkgs %in% installed.packages()[, 'Package']
if (length(pkgs[!installed]) >=1){
  install.packages(pkgs[!installed])
}

を指定して、packagelist.RDataを作成しています。 .Last() をRprofile.siteに追加しました。これは、私がいくつかの.NET Frameworkをインストールした場合、パッケージリストを更新します。

.Last <- function(){
  pkgs <- installed.packages()[,1]
  if (length(pkgs) > length(installed)){
    save(pkgs,file="G:\Setinfo\R\packagelist.RData")
  }
}

新しいRのバージョンをインストールするときは、Rprofile.siteファイルに必要な要素を追加するだけで、すべてのパッケージが再インストールされるんだ。私はどのみちRprofile.siteを調整しなければならないので(sum contrastsの使用、Tinn-R用の追加コードの追加など)、実際には余分な作業ではありません。ただ、すべてのパッケージを新たにインストールするのに余計な時間がかかるだけです。

この最後の部分は、元の質問で解決策としてあげられているものと同等です。ただ、最初に"installed"のリストを取得することを心配する必要はありません。

繰り返しますが、CRANからインストールされていないパッケージがある場合、これは完璧に機能しません。しかし、このコードはそれらのパッケージを含めるために簡単に拡張することができます。