2020/05/06

R Version 4.0 リリース

4/24、R Version 4.0 がリリースされました。主要な変更点を説明します。

パッケージの再インストールが必要です


クラス matrix がクラス array を継承するようになりました

class([行列]) が c("matrix") から c("matrix", "array") に変わっています。
行列がクラス array 用の S3 メソッドにディスパッチされるようになりました。

raw character 定数構文が導入されました

C++ の raw string literal と似た構文で、
r"(任意の文字シーケンス)" 
と書きます。
任意の文字シーケンスのところは、「)"」さえ含まなければ、何を書いても大丈夫です。バックスラッシュ、シングルクォート、ダブルクォートなどがそのまま書けますし、改行もできます。
「)"」を使いたいときは、「()」の代わりに「[]」や「{}」を使うこともできます。
「)"」も「]"」も「}"」も同時に使いたいときは……
r"-----(任意の文字シーケンス)-----"
という記法があります。ダブルクォートと「()」の間に「-」を好きな数だけ書きます。開始と終了で個数を合わせてください。
これであれば、任意の文字シーケンスには「)-----"」さえ含まなければOKになります。「-」の数を調整すれば、何でも書けますね。この場合も「()」、「[]」、「{}」のどれを使っても構いません。
詳しくは「?Quotes」を見てください。

stringsAsFactors オプションのデフォルトが FALSE になりました

options("stringsAsFactors") が TRUE の場合、data.frame(), read.table() では文字列を自動的に factor とみなす仕様ですが、このデフォルト設定値が FALSE になりました。
この設定値が TRUE であることに依存しているパッケージがたくさんあります。アップデートが必要です。

S3 generic 関数の plot() が graphics パッケージから base パッケージに移動されました

graphics パッケージを使用しないメソッドを用意することが合理的との考えによるものです。
現在のところ、graphics 名前空間から再エクスポートされていますが、将来は変更される可能性があります。

plot() の S4 generic 関数を定義するパッケージは、再インストールと、
そのような generic 関数を使用するコードのパッケージ化が必要です。
base 名前空間は検索パスよりも優先されますので、検索パスでの検索に依存するのではなく、
確実にインポートされるようにする必要があります。

リファレンスカウント

R は関数呼び出しの引数は、call-by-value のセマンティクスになっています。
つまり、引数に渡したオブジェクトが呼び出し先の関数内で変更されても、呼び出し元のオブジェクトに変化はありません。
しかし実装上は、実際に値をコピーして渡しているわけではなく、copy-on-modify というポリシーで動作しています。つまり、修正を加えるときに初めてコピーを作ります。
これを実現するため、これまでの R では NAMED メカニズムが使用されていましたが、これに代えてリファレンスカウントが使用されるように変更されました。
コピーの必要性が減ったり、将来のさらなる最適化が出来るようになったりといった効果が期待できます。内部コードの保守性も向上しました。

正規表現ライブラリの PCRE1 から PCRE2 への移行

その結果、今まで使えていた正規表現の一部が動かなくなります。
    文字クラス中の「-」のエスケープが必要になりました (先頭でも末尾でも)
    文字クラス中の \R, \B, \X が使えなくなりました
PCRE_study オプションが使用されなくなりました。

他にも新機能、廃止機能、バグ修正等が多数あるので、https://stat.ethz.ch/pipermail/r-announce/2020/000653.htmlを見てください。