R 4.0.0 リリース

R のメジャーバージョンアップが 2020/04/24 に行われて、最新版は R 4.0.0 になった。バージョン３までとは非互換になったところがあるので、勢いで変更点を訳してみた。個人的に勝手に翻訳しただけで、意味を取り違えたりしてるとこもあると思うし、言葉を思いつかなかったところや、これまで知らなかった言葉もあるし、手抜きの部分もあるので、翻訳の品質は全く保証できない。でも英語が苦手な人の役に立てばいいな、と思ってここに載せる。

もし修正した方がいいところを見つけたら、遠慮なく是非バンバン教えてほしい。

翻訳元：[R 4.0.0 is released](https://stat.ethz.ch/pipermail/r-announce/2020/000653.html) by Peter Dalgaard

# R 4.0.0 での変更点

## 利用者にとって重要な変更
- パッケージはインストールし直す必要がある。
- 行列オブジェクトは配列クラスを継承するようになった。class(diag(1)) はc("matrix",  "array") を返すので、class(matrix_obj)) の長さが 1 であることを想定したコードはうまく動作しなくなる。S3 メソッド array クラスを行列オブジェクトとして扱うようになった。
- C++ の r"(...)" という文字列定数構文が使えるようになった。... には )" という文字列を含まないあらゆる文字列を指定できる。バックスラッシュやシングル／ダブルクオーテーションが入っていてもよい。詳細は ?Quote を参照の事。
- stringsAsFactors = FALSE がデフォルトになった。これにより、data.frame() や read.table() では、デフォルトでは文字列を因子に変換しなくなった。多くのパッケージに影響が及ぶはずなので、それぞれアップデートする必要がある。
- S3 メソッドの plot() は graphic パッケージから base に移された。graphic パッケージを使わないメソッドにとってはより自然になった。グラフィクスの名前空間からもエクスポートされているので、そこから読み込んでいるパッケージの動作には影響はないが、これは将来的には変更される可能性がある。
- plot() で S4 メソッドを定義しているパッケージは再インストールする必要がある。またそういったパッケージのコードは、検索パスに従って読み込まれているのではないこと（名前空間の base は検索パスより優先）に注意せねばならない。

## 参照カウント
- Ｒを実装しているＣ言語のコード上で、これまでの NAMED な方法から、オブジェクトが安全に変更できるかどうかを参照カウントで管理する事になった。これによってオブジェクトの複製を減らす事ができ、また将来にはより最適化できるようになった。またＲの内部コードの管理も楽になるはずである。どのパッケージも、C/C++のコーディングが推奨する方法にしたがっていれば、これによる影響はないと思われる。

## PCRE2 対応
- Perl 互換の正規表現ライブラリ PCRE2 が使えるようになった (非 Windows 環境ではビルド時に PCRE2 がない場合には PCRE1 を使うようにできる)。使っている PCRE のバージョンは extSoftVersion() を使えば得られる。PCRE1 (以前は単に 'PCRE' だった) では <= 8、PCRE2 では >= 10 になる。
- Ｒをソースからビルドするときには PCRE2 (ver. 10.30 以降) が強く推奨される。PCRE1 は開発が終了しているためである。おそらく ver. 8.44 が PCRE1 の最終版になるだろう。
- PCRE1 で指定できる正規表現が、PCRE2 ではエラーになる事がある。ハイフンをリテラルのハイフンとして指定するためにはエスケープしなければならない (正規表現の最初または最後に位置するときを除く)。\R、\B、\X は PCRE2 では使えない (PCRE1 ではこれらはリテラルとして扱われた)。
- PCRE_study オプションは PCRE2 では廃止された。指定されたときには FALSE を返す。

## 新機能
- assertError() と assertWarning() (tools パッケージ) で、一部のエラーまたは警告を、二つ目の引数に指定する事で確認できる (以前は二つ目の引数を名前なしで指定できたが、これと互換ではない)。
- DF2formula() (データフレームの列名から formula() と同じように formula を返す関数) は、構文解析や明示的な評価をしなくても動作する。Suharto Anggono の助言 PR#17555 による。
- approxfun() と approx() で引数に na.rm を取る (デフォルトで TRUE)。これに FALSE を指定すると y が欠損値のところが補間される。
- for() ループの引数として、長いベクトルを指定できる。
- str(x) で deparse.lines オプションを指定できる。デフォルトで x がサイズの大きなオブジェクトのときに高速化するようになっている。
- エラーシグナルの発生時にトレースバックオブジェクト (. Traceback) が生成されるようになった。ユーザーレベル関数の .traceback() および traceback() のために逆構文解析するのは後回しにして、これには deparse() されたものではない呼び出しが含まれる。
- data.matrix() では文字列の列を因子に変換し、因子から整数に変換する。
- package.skeleton() は NAMESPACE ファイル中のエクスポートをすべて列挙する。
- .S3method() という新しい関数で S3 メソッドをＲスクリプト内に登録できる。
- file.path() で、セッションの言語エンコーディングとは違う文字コードを扱えることがある。非 UTF-8 ロケールにおいて UTF-8 で入力された場合、出力は UTF-8 とされる。
- ファイルパスの入力を受け付ける多くの関数で、その時に指定されているエンコーディング (その環境のネイティブなエンコーディングや、または Windows で UTF-8 に変換する場合など) での変換に失敗した場合に、エラーを出すようになった。エスケープして違うパス名に変換する事はない。dir.exists()、file.exists()、file.access()、file.info()、list.files()、normalizePath()、path.expand() などはファイルがないときと同じように振る舞うが、警告を出力する事もある。
- help("file path encoding") で見られるヘルプドキュメントに、エンコーディングが指定されているときのファイルパスの扱いについて詳細がある。
- list2DF() という新しい関数で変数のリストからデータフレームを作る事が出来る。
- iconv() に sub = "Unicode" という新しいオプションが用意された。これによって UTF-8 の入力を \<U+xxxx> というエスケープに変換できる。
- infoRDS() という新しい関数で、シリアル化されたオブジェクトについて、シリアルな形式で情報を見る事ができる。
- S3 メソッドは、大域環境と base 環境の間の検索パスの各要素を、デフォルトでスキップするようになった。
- 複数のデータセットの合計サイズが小さい場合でもデータあるいはデータリストのファイルを生成できるように、add_datalist(*, small.size = 0) という引数が用意された。
- バッククオート関数 bquote() に splice という新しい引数が用意された。LISP のバッククオートの ,@ のように、式を評価してできたリストを他の expression につなげる事ができる。
- t.test() と wilcox.test() で、一標本および対応ありの二群の場合でも formula を指定できるようになった。
- palette() 関数のデフォルトのカラーセットが変更された (色の飽和度が下がり、アクセシビリティが向上した)。新しく追加されたいくつかの組込みのカラーパレットを、palette.pals() 関数で見る事ができる。これまでデフォルトだったものは "R3" という名前になっている。palette.colors() という新しい関数で、組込みのカラーパレットの一部分を取り出すことができる。
- n2mfrow() でアスペクト比に asp = 1 を指定できるようになった。Michael Chirico の提案 PR#17648 が元である。
- head(x, n) と tail() で、n がベクトルのとき、つまり行列の「角」を取り出したいとき、より高次元の配列に対応するようになった。Gabe Becker の提案 PR#17652 による。これによって addrownums は廃止され、代わりに (より一般的な) keepnums を使うようになった。第二引数の値が無効のときに出すエラーメッセージが、より読みやすいものになった。
- .class2() という新しい関数で、S3 メソッドに渡すために使われるクラス名の、完全な文字ベクトルが得られるようになった。
- methods(..) は新しい format() メソッドを使うようになった。
- sort.list(x) は、x がアトミックなオブジェクトじゃないときでも使えるようになった。また order(x) が対応しているときには method = "auto" (これがデフォルト) か "radix" が指定できるようになった。
- writeBin() でより長いベクトルを、扱えるときは扱えるようになった。
- deparse1() という新しい関数は、deparse() をラッピングしたもので、一つの文字列を生成する。PR#17671 に対応したもので、deparse1(substitute(*)) のように使う。
- wilcox.test() が改良された。対応のない二群の場合に Inf を非常に大きな値として扱う事で、よりロバスト性が整合的になった。厳密な計算を行ったときには、返されるオブジェクトに含まれる method 要素に exact という文字列が含まれるようになった。tol.root と digits.rank という二つの引数が新しく用意された。後者は、タイのように非常に近い値を扱う際の安定性を向上する。
- readBin() と writeBin() はエンディアンが無効のときにエラーを出すようになった。これまでは、エンディアンがおかしなときには自動的に入れ替えるという仕様には書かれていない動作になっていたので、これに依存するコードは、注意して修正する必要がある。
- sequence() は内部で実装されている組み込みの S3 メソッドになり、より複雑な数列を生成できるようになった。S4Vectors Bioconductor パッケージのコードを元にしている。Herv'e Pag`es の助言による。
- print() の、デフォルトを含む多くのメソッド (最終的にデフォルトが呼ばれたり、他のメソッドにわたったり) は新しく width という引数を取れるようになった。これによって options("width") を何度も使わなくて済むようになった。
- memDecompress() は、RFC 1950 と同様に、RFC 1952 の形式 (gzip 圧縮されたメモリ上のコピー) もサポートするようになった。
- memCompress() と memDecompress() は "gzip" と "zx" という型に対して長い raw ベクトルをサポートするようになった。
- sweep() と slice.index() は MARGIN 引数に dimnames の名前を使えるようになった (apply では10年くらい前から使えるが)。
- proportions() と marginSums() と言う新しい関数が、命名が不運だった prop.table() と margin.table() の代わりに用意された。これはほぼ単に置き換わっただけだが、named-margin 対応が追加された。互換性維持のために、昔の関数名も使えるようになっている。
- rbinom()、rgeom()、rhyper()、rpois()、rnbinom()、rsignrank()、rwilcox() は R 3.0.0 以降、返り値が整数だったため、値が整数の範囲を超えると NA を返していたが、そう言った場合には (NA を含まない) 実数ベクトルを返すようになった。
- matplot(x, y) (と matlines() と matpoints()) は、x が "Date" か "POSIXct" のときにはそれに対応する plot() や lines() のメソッドを呼ぶようになった。Spencer Graves からの提案による。
- stopifnot() では、namees という引数でエラーメッセージを指定できるようになった。Neal Fultz のパッチ案 PR#17688 による。
- unlink() では、新しい引数 expand でワイルドカードとチルダの展開を抑制できるようになった。値が "~" の x の要素は無効になる。
- stat4 パッケージの mle() が改良され、負の対数尤度関数の引数に一つまたは複数のベクトルを指定できるようになった。探索範囲、探索開始点、固定値のパラメータも同様である。これには "mle" クラスの拡張が少し必要だったため、以前に計算、保存されたオブジェクトについては再計算が必要になることがある。
- pdf() では、デフォルトで useDingbats = FALSE になった。
- hist() と boxplot() の塗り潰しの色のデフォルトが col = "lightgray" になった。
- spineplot() と cdplot() のｙ軸での水準の順序が、これまでとは逆になった。
- 環境変数 R_ALWAYS_INSTALL_TESTS の値が true の時、コマンド R CMD INSTALL の実行時には常に --install-tests が指定されているのと同じようになる。Reinhold Koch の助言による。
- R_user_dir() という tools パッケージの新しい関数で、Ｒに関係する利用者のデータ、設定ファイル、キャッシュが保存される場所を表示できる。
- capabilities() 関数で、X11 に関する警告を抑制するための Xchk という引数が用意された。
- grid の unit の内部実装が変更された。利用者から見える変更点は、いくつかの単位で表示が僅かに変わったこと (特に複数の単位を混ぜた演算で)、処理が速くなったこと (単位の演算)、unitType() と unit.psum() の二つの関数を新しく用意した。Thomas Lin Pedersen のコードを元にしている。
- rep.int() と rep_len() の内部呼び出しが失敗した場合、rep() で同等の処理を試みるようになった。
- .Machine オブジェクトに新しく longdouble.* という要素が加わった (Ｒが内部で四倍精度実数を使っている場合)。
- news() が、R 3.x と 2.x もカバーするようになった。
- val の長さが 1 の時に N <- NULL; N[[1]] <- val を実行すると、N はリストになるようになった。これによって、１行だけの行列 r1 に対してdimnames(r1)[[1]] <- "R1" とできる。Serguei Sokol の報告 PR#17719 による。
- deparse(..)、dump(..)、dput(x, control = "all") で引数 control に "digits17" を指定すると、変換と逆変換が一対一になる。"hexDigits" で正確に逆変換できるようにするための control = "exact" が指定できるようになった。
- read.table() でデータを読み込むとき、data() が LC_COLLATE=C を使う事で、文字列を因子に変換する際の結果がロケールによって変わらないようになった。
- サーバーからの通信ソケットを受け付ける通信接続を serverSocket() で生成できるようになった。また socketAccept() で複数のソケットを同時に受け付けられる。
- socketTimeout() という新しい関数で、ソケットのタイムアウトまでの時間を指定できるようになった。
- 多数のノードを持つ localhost 上のヘテロではない PSOCK クラスタの開始までにかかる時間が、大幅に短縮された (parallel パッケージ)。
- globalCallingHandlers() と言う新しい関数で、大域的な動作条件の操作ができるようになった。
- tryInvokeRestart() と言う新しい関数で、可能なときには、指定された再起動オブジェクトがあり、エラーシグナルを返さないときには、それを実行できるようになった。Lionel Henry の貢献  PR#17598 による。
- str(x) は x がデータフレームの時、場合によっては属性の長さを表示するようになった。
- Rprof() では新しい引数 filter.callframes を指定する事で、遅延評価や明示的な eval() 呼び出しによる干渉を、記録されたプロファイルデータから除去できるようになった。Lionel Henry の貢献 PR#17595 による。
- Renviron ファイルでの \${FOO-bar} と ${FOO:-bar} の扱い方は POSIX のシェルと同じになった (少なくとも Unix 的なシステムでは)。したがって、空の環境変数は前者では定義されているとして扱われ、後者では未定義扱いとなる。以前はどちらも、空の環境変数は無視していた。etc/Renviron ファイルでは前者の利用例がある。
- suppressWarnings() と suppressMessages() では警告だけ、あるいは特定のクラスから継承されたメッセージを選択して、それを抑制できるようになった。Lionel Henry のパッチ PR#17619 による。
- activeBindingFunction() という新しい関数で、指定された環境でアクティブなバインディングの関数を取得できるようになった。
- grSoftVersion() の出力に "cairoFT" と "pango" が追加された。
- cairo ベースのグラフィクスデバイスでは、新しく symbolfamily という引数と  cairoSymbolFont() という関数が追加された。後者の関数で、前者の引数に指定できる値が分かる。

## Windows
- Rterm は MSYS2 ターミナルからも起動できるようになった。winpty コマンドがインストールされていてバ、ラインエディタが使える。
- normalizePath() がシンボリック・リンクに対応した。また大文字・小文字を区別しないフォルダ名のパスに含まれる長い名前で、大文字・小文字をノーマライズする (PR#17165)。
- md5sum() は、ネイティブのエンコーディングに変換できない文字を含む UTF-8 のファイル名に対応した (PR#17633)。
- Rterm は新しい --workspace で、レストアするワークスペースを指定できるようになった。Windows におけるファイルの関連付けによって起動する場合は、その名前の中に = が入っていてもよい。
- Rterm は、NumLock されているときでも ALT+xxx を受け付けるようになった。イタリア語キーボードでチルダがコピー＆ペーストできるようになった (PR#17679)。
- パッケージの確認中にジャンクションの生成が失敗したときは、Ｒがコピーに戻るようになった (Duncan Murdoch のパッチによる)。

## 非推奨および廃止
- Make の F77_VISIBILITY マクロは削除され、F_VISIBILITY に置き換わった。
- Make の F77、FCPIFCPLAGS、SHLIB_OPENMP_FCFLAGS マクロは削除され、それぞれ FC、FPICFLAGS、SHLIB_OPENMP_FFLAGS に置き換わった (パッケージのコンパイル時、make コマンドの多くは FC マクロに F77 を設定する。しかし可搬性の高いコードはこれに依存すべきではない)。
- パッケージのインストール時の C++98 の指定は非推奨だったが、削除された。
- R CMD config では、CXX98 と同様に、使われなくなった F77 と FCPIFCPLAGS も廃止された。
- PCRE1 のバージョン 8.20-8.31 対応は削除された。PCRE2 または PCRE1 >= 8.32 (Nov 2012) を使う必要がある。
- 廃止されていた base パッケージの mem.limits(), .readRDS(), .saveRDS(), ..find.package(), .path.package() 、およびメソッド allGenerics(), getAccess(), getAllMethods(), getClassName(), getClassPackage(), getExtends(), getProperties(), getPrototype(), getSubclasses(), getVirtual(), mlistMetaName(), removeMethodsObject(), seemsS4Object(), traceOff(), traceOn() は削除された。

## C 言語レベルでの変更
- installChar は Rinternals.h 内で、R 3.6.0 からラッパーになっていた installTrChar にマップされるようになった。installChar を使うパッケージでは、R 3.6.2 以上の場合はそれを置き換える事ができる。
- ヘッダファイル R_ext/Print.h でマクロ R_USE_C99_IN_CXX が定義された。C++11 以降のコンパイラでは Rvprintf と REvprintf が見えるようになった。
- スカラー変数の値を表示する新しい FORTRAN サブルーチン dblepr1、realpr1、intpr1 が定義された (gfortran では、スカラー変数と長さが 1 の配列を区別する必要があるため)。またラベルを表示するための labelpr も用意された。
- Ｃのコードでクラスエラーからコンディションを継承するために、R_withCallingErrorHandler で呼び出しハンドラーを確立できるようになった。

## UNIX 系でのインストール
- (config.site 中の) DEFS で、コンパイルするパッケージを利用者が設定できるようになった。
- オプション --enable-lto=check で BLAS/LAPACK/LINPACK 呼び出しの整合性を確認できるようになった。'Writing R Extensions' を参照の事。
- C++11 standard がインストールされているときだけ、C++ コンパイラのデフォルトが設定されるようになった。それがないときに自動的に C++98 が設定される事はない。
- PCRE2 があるときは、それを使うようになった。PCRE2 がないときに PCRE1 を使うようにするためには、configure で --with-pcre1 を指定する。
- libcurl はバージョン 7.28.0 (Oct 2012) 以上が必要になった。
- make の distcheck ターゲットでは、make dist で作られた tarball からＲが再構築できるか、tarball から作ったＲが make check-all をパスできるか、そのＲがインストールおよびアンインストールできるか、make distclean でソースファイルが適切に片づけられるか、が確認される。

## ユーティリティー
- R --help で --no-echo (以前は --slave だった) について表示されるようになった。またこれまで書かれてなかったが、これには -s という省略形がある。
- R CMD check では、非 Bourne シェルの configure と cleanup コード ('bashisms') が使えるようになった 。
- R CMD check --as-cran で \donttest example を実行するようになった (example() で実行される)。代わりにテスターが実行するよう、その方法を表示する。これにより、開発中にテストが自動で実行されるのを避けるために環境変数 \_R_CHECK_DONTTEST_EXAMPLES_ を FALSE に設定する必要がなくなった。

## パッケージのインストール
- C++20 の標準仕様が最近確定したのに伴い、C++14 と C++17 と同様に、そのサポートを始めた。コンパイラーでのサポートはまだわずかだが、 -std=c++20 や -std=c++2a といったオプションでこれを利用できる。とりあえず今のところ、configure test は、これらのフラグを受け付けることと C++17 でコンパイルすることである。

## バグ修正
- formula(x) では、length(x) > 1 の文字ベクトルのような x は非推奨になった。そういった利用例は稀であり、ちゃんと動作する事が期待されるのはごく一部の利用法だけである。そういった利用法以外では、x はだまって切り詰められ、エラーを出す事はない。
- 起動後しばらくは X11 がイベントを受け付け損ねるという、長い間あった問題は対応された (PR#16702)。
- rbind() の data.frame メソッドは、デフォルトでは因子の列から水準 <NA> を除去しなくなった (PR#17562)。
- available.packages() および install.packages() は引数 ... を download.file() に渡すようになった。PR#17532 の要望による。また available.packages() は新しい引数 quiet
が用意された。PR#17573 の問題への対処である。
- stopifnot() に新しい引数 exprObject が用意され、expression クラス (または他の 'language') のＲオブジェクトの挙動のおかしさが減った。Suharto Anggono の助言による。
- conformMethod() は Henrik Bengtsson による "&& logic" バグが含まれる場合でも正しく動作するようになった。シグネチャに "missing" エントリーが含まれる場合にメソッドを生成し、rematchDefinition() が適切な .local() 呼び出しを必要な名前付き引数で行えるようになった。
- format.default(*, scientific = FALSE) は、根拠のない n = 100 ではなく、options(scipen = n) に対応するようになった。
- format(as.symbol("foo")) が動作するようになった ("foo" を返す)。
- postscript(.., title = *) はタイトルの文字列に、PostScript コードを破綻させるような文字が入っている場合にはエラーを出すようになった。Daisuko Ogawa (PR#17607) による。
- 長さが 0 のデータフレームに対しても、演算子によっては動作するようになった (特に == での比較)。Hilmar Berger の報告による。
- methods(class = class(glm(..))) はより便利になって、警告を繰り返さなくなった。
- write.dcf() ではフィールド名が壊れなくなった (PR#17589)。
- 複雑に代入されるような式の外側であっても、プリミティブな痴漢関数が、その第一引数が参照であるときに、それを変更する事がなくなった。
- contour(*, levels = Inf) のエラーメッセージがよくなった。
- contourLines() の返り値は invisible() ではなくなった。
- lm.influence() 内で係数を計算する Fortran コードは非常に非効率的だったが、今はとりあえず、より速いＲのコードに置き換わった (PR#17624)。
- cm.colors(n) などでは、すべての色にコード  alpha = 1, "FF" を付加する事がなくなった。したがって８個の *.colors() 関数と rainbow() は明示されないが整合的なデフォルトを共通で持つ事になった (PR#17659)。
- dnorm は sd == -Inf または sd が負というおかしな場合にもエラーを出さなかった。Stephen D. Weigand の報告と Wang Jiefei の解析による。dlnorm() でも同様に修正された。
- plot.lm() (lm と glm による回帰の plot() メソッド) の iter.smooth 引数のデフォルト値は、glm に対しては 0 になった。回帰により得られた二値変数の確率が高い、あるいは低いとき、1 か 0 かどちらかの値を効率よく取り除いてプロットされる。また glm に対してプロットされる残差の種類が "pearson" になった。逸脱残差は一般的に、その平均値が必ずしも 0 付近ににはならないからである。
- plot.lm では、整合性の破綻を見やすくするため、重みなし残差からクックの距離を計算するようになった。通常の重み付き残差版を置き換えるものである (PR#16056)。
- 時系列データ ts(*, start, end, frequency) で時刻が小数の場合に対応した。Johann Kleinbub の報告と Duncan Murdoch の解析とパッチ (PR#17669) による。
-  mcmapply() でエラーが発生した場合に、返された "try-error" オブジェクトの属性が保存されるようになり、SIMPLIFY が FALSE に上書きされる事による単純化を避けるようになった (PR#17653)。
- as.difftime() で引数 tz = "UTC" を指定できるようになった。これにより夏時間との切り替え時を含む時の挙動が修正された。Johannes Ranke と Kirill M"uller の提案と解析 (PR#16764) による。
- round() は、測定と "to even" によってもっとも近い値によりよく切り捨てるようになった。元は Adam Wheeler らによる細心のアルゴリズム (PR#17668) である。負の値に対する round(x, dig) は、特に |dig| が大きな値の時に、適切に動作するようになった。
- S4 クラスでの継承の情報、特にクラスのユニオン場合の管理方法が改善された (部分的に PR#17596 と、Ezra Tucker の報告による)。
- is() の引数 class2 が classRepresentation オブジェクトの時の挙動がよりロバストになった。
- 存在しないクラスをエクスポートしようとしたときのエラーメッセージが読みやすくなった。Thierry Onkelinx の問題認識による。
- choose() が、n - k から k に切り替わり、n が整数に近いときに誤動作していたのを修正した (Erik Scott Wright の報告による)。
- stat4 パッケージの mle() で、制約条件がボックス型で初期値が固定の時の問題が修正された (特に信頼区間が影響を受けていた)。
- ? 演算子の優先順位が = より下がって仕様通りになった。これにより help を呼ぶときに = は <- と同じような挙動になった (PR#16710)。
- smoothEnds(x) は x が整数の時には、どちらの場合でも整数型を返すようになった。Bill Dunlap の報告と提案による (PR#17693)。
- methods パッケージは、パッケージ間の継承関係をよりよく追跡できるようになった。
- norm(diag(c(1, NA)), "2") が動作するようになった。
- subset() の列数 0 のデータフレームに対する問題が解消された (Bill Dunlap の報告による、PR#17721)。
- clang10 の 'undefined behaviour sanitizer' が検出する整数の桁あふれを、場合によっては回避するようになった。rhyper() が入力値が大きい場合に生成する値などが変わり得る。
- dotchart() で、ｙ軸のラベル (ylab) の配置が改善され、ラベルが重ならないようになった。Alexey Shipunov の報告と助言による。
- Ｃ言語レベルで稀に発生していた配列のオーバーフローが修正された。
- たとえば 2017 年の 366 日目のような、%j での年内の日数に対する無効な指定や、週に週内の日数を加える場合を、strptime() で検知できるようになった。これらに対しては、これまではランダムな値になり得るという警告が表示され、メモリ内容が壊れていたが、NA が返されるようになった。
- socketConnection(server = FALSE) は Linux 上でも接続のタイムアウトに対応した。
- socketConnection(server = FALSE) は localhost のような、ウェイトなしで確立できる接続を漏らさなくなった。
- ソケット接続は、外部からの可読性や可用性が不確実な接続に対してロバストになった。
- blocking = FALSE がソケット接続のサーバー側でも有効になった。これによってブロックしない読み込み操作ができるようになった。
- anova.glm() と anova.glmlist() が切片がない場合の検定でスコア (Rao) の計算が正しくなかった (Andr'e Gillibert、PR#17734)。
- summaryRprof() はチャンクが小さい場合でも (また "tseries" などに対しても) Rprof(*, memory.profiling=TRUE) に対して正しく動作するようになった。Benjamin Tyner のパッチ案 PR#15886 による。
- xgettext() は ngettext() に渡される文字列を無視する。ngettext() は xngettext() が扱うためである。Daniele Medri の報告と彼の最近のイタリア語翻訳のすべてに感謝する。
- data(package = "P") は P が base または stats のときは、datasets パッケージからのデータである事を表示しなくなった (広報互換性のために16年間この動作になっていた)。PR#17730　による。
- x\[[Inf]] (NULL を返す) の挙動は、不確定ではなくなった。Kirill M"uller の報告 (PR#17756) による。さらに x[[-Inf]] と x[[-n]] に対するエラーメッセージもより役立つものになった。
- Gamma() ファミリーはリンク名を保持するときに誤動作することがあった (PR#15891)。

## バグ修正 (Windows)
- Sys.glob() で Unicode Basic Multilingual Plane の文字は全て使えるようになった。(余り使われない) いくつかの文字での誤動作しなくなった (PR#17638)。
- Rterm で、その時のネイティブエンコーディングで表示できる多バイト文字は、正しく表示されるようになった (少なくとも Windows 10 では、文字が無視されることがあった。PR#17632)。
- scan() が DBCS ロケールで実行されているときに UTF-8 のデータに対して誤動作していたのは修正された (PR#16520、PR#16584)。
- RTerm は、ConPTY と使うときでも拡張キーと矢印キーを受け付けるようになった。
- ユーザードキュメント中の起動アイコンから直接、Ｒを起動できるようになった。システムのエンコーディングでＲのパスが表示できない場合でも起動できる。
- socketConnection(server = FALSE) は、接続に失敗してシグナルが送られた場合、Windows でも即座にかえってくるようになった。
- UTF-16 のサロゲートペアの問題が、tolower() や toupper() などいくつかの関数で解決された (PR#17645)。

# 以前のバージョンでの変更点
- 過去のお知らせは doc ディレクトリの NEWS.0、 NEWS.1、NEWS.2、NEWS.3 というテキストファイルにある。Ｒバージョン 3.x と 2.10.0 から 2.15.3 までについての HTML ファイルが doc/html/NEWS.3.html と doc/html/NEWS.2.html である。

(以上)