Rのバージョン3.6.0がリリース

概要
統計処理言語の R のバージョン3.6.0が、2019年4月26日に公開された。この新リリースでは、離散一様分布に従う乱数の生成手法が変更されたり、文字列を表現式 (expression) に変換する新しい関数が導入されたりした。

バージョン3.6.0のリリース

2019年4月26日、R のバージョン3.6.0がリリースされた。コードネームは Planting of a Tree(木を植えること)である。バージョン3.6.0での変更点の詳細は、Rアナウンスメーリングリストでのバージョン3.6.0リリースの通知R 3.3.0 is released、英語)を参照されたい。

ちなみに、Rのバージョンごとに付けられるコードネームは米国の漫画 Peanuts から取られるのが通例。今回の Planting of a Tree は、おそらく1963年3月3日付けの作品から取られたもの。この作品ではルーシーとライナスが木を植えるというもので、その中でルーシーが “The planting of a tree shows faith in the future” (強調引用者)と言っている。

Rのバージョン3.6.0のコードネームは Planting of a Tree(木を植えること)である
Rのバージョン3.6.0のコードネームは Planting of a Tree(木を植えること)である

バージョン3.6.0での主な変更点

バージョン3.6.0での変更点のうち、自分が気になった点をいくつか紹介したいと思う。

文字列処理

  • 文字列の冒頭や末尾にある空白文字を取り除くtrimws()関数に whitespace オプションが加わった。このオプションで何を空白文字と見なすか指定できるようになった。
    • これまでのバージョンと同様に、trimws()はデフォルトでは [ \t\r\n](半角スペース、水平タブ、キャリッジリターン、ニューライン)を空白文字と見なす。しかし、デフォルトの空白文字の範囲だと、全角スペースなどが空白文字と見なされないことになる。
    • Unicode に収録されている空白文字全般を trimws() での空白文字として指定するには、whitespace="[\\h\\v]" と指定すればよい。なお、PCRE形式の正規表現で "\h" は水平方向の空白文字、"\v" は垂直方向の空白文字を示す。
    • stringr パッケージに str_trim() という関数がある。この関数も文字列の冒頭や末尾にある空白文字を取り除く関数であるが、こちらはデフォルトで全角スペースなども空白文字として取り除いてくれる。trimws() でわざわざオプションを指定するよりも、str_trim()を使った方が便利だろう。
    • 以下の例では、「あああ」の前後に全角スペースがある。trimws()では特に指定しないかぎり、全角スペースは消えない。
trimws(" あああ   ")
# [1] " あああ   "
trimws(" あああ   ", whitespace="[\\h\\v]")
# [1] "あああ"
stringr::str_trim(" あああ   ")
# [1] "あああ"

統計処理

  • summary() 関数のデフォルトのメソッドで、分位数の計算方法を quantile.type オプションで指定できるようになった。
    • 例えば、xを数値ベクトルとするとき、summary(x) を実行すると、その四分位数が表示される。その四分位数の計算方法が指定できると言うことである。
    • 分位数の計算方法については、quantile()関数のマニュアルを参照のこと。
  • 分散を計算する関数var() が、factor を引数に取れなくなった。標準偏差を計算する関数 sd() でも同様。
  • t検定を行う t.test() 関数が平均(の差)の標準誤差を返すようになった。この関数が返すリストの stderr という部分にこの標準誤差の値が入っている。
x <- 1:10
y <- 11:20
result <- t.test(x, y)
result$stderr
# 結果は [1] 1.354006

描画

  • 軸ラベルを描画するときに、軸ラベル同士の間に空けるべき隙間の最小値を設定できるようになった。
    • この値を設定するには、axis() 関数の gap.axisオプションで設定したい数値を指定するか、plot() する際に xgap.axisygap.axis オプションで設定したい数値を指定する。
  • 棒グラフを描く barplot() 関数が、モデル式 (formula) を書く形式に対応するようになった。例えば、barplot(GNP ~ Year, data = longley) で以下のような出力が得られる ((これまでのバージョンでは、barplot() の最初の引数(=棒の高さに対応する数値)として取れるのはベクトルか行列のみであった。そして、今回挙げた出力例は barplot(longley$GNP, names.arg = longley$Year) のように書かざるをえなかった。)) 。
モデル式 (formula) を使った barplot() の出力例。
モデル式 (formula) を使った barplot() の出力例。
  • カラーパレットを作るために使う関数(rainbow()terrain.colors() など)に、色の順番を逆順にするためのオプション rev が加わった。rev = TRUE と指定すると、デフォルトとは色が逆順になる。
    • 事例として、pie(rep(1, 5), col = rainbow(5)) とした場合と、pie(rep(1, 5), col = rainbow(5, rev = TRUE)) とした場合を掲げる。
左側がカラーパレットの順番をデフォルト通りにしたもので、右側は逆順にしたものである。
左側がカラーパレットの順番をデフォルト通りにしたもので、右側は逆順にしたものである。

数値計算

  • gamma()関数やlgamma() 関数が Inf を返すときなどに警告が発せられなくなった。
    • 旧来のバージョンでは、gamma(1e10) を計算すると、 Inf が返り、さらに「 ‘gammafn’ 中の値が範囲を超えています」という警告メッセージが出た ((lgamma() 関数の場合は、lgamma(0) のようにすると同様の警告メッセージが出ていた。)) 。
    • バージョン3.6.0 以降ではこのような警告メッセージは出ない。
    • 内部的にgamma()関数を使っている他の関数でも警告メッセージは発せられなくなった。例えば、階乗を計算する factorial()関数でも警告メッセージは出ないようになった。
  • ローマ数字を使った演算ができるようになった。厳密に言うと、romanクラスのオブジェクトに対して、算術演算・比較演算・論理演算が可能になった。
three <- as.roman(3)
five <- as.roman(5)
three + five # 結果は VIII
three > five # 結果は FALSE
sum(as.roman(1:10)) # 結果は LV (=55)

乱数生成

  • 離散一様分布に従う乱数を生成する手法sample() などで使われている)が変わった。これまでのバージョンでは、大きな母集団においては、一様とはほど遠いものであったが、このバージョンから改善された。
    • RNGkind()を実行すると、Rでどのような乱数生成手法が用いられているかを表示することができる(下のコード参照)。この実行結果の3番目に出てくるのが、離散一様分布に従う乱数を生成する方法であり、"Rounding" か "Rejection" のいずれかになる。前者は古い生成手法を使っていることを示し、後者は改善された新しい手法を使っていることを示す。
    • RNGkind(sample.kind = "Rounding") を実行すると、バージョン3.6.0より前の古いやり方で離散一様分布に従う乱数を生成するようになる。古いバージョンで計算したときと同じ結果を再現する場合にのみ用いるべきである。
    • RNGkind(sample.kind = "Rejection") を実行すると、バージョン3.6.0で改善された新しいやり方で離散一様分布に従う乱数を生成するようになる。特に理由がなければ、こちらを使うべきである。
RNGkind()
# [1] "Mersenne-Twister" "Inversion"        "Rejection"

プログラミング

  • 新しい関数として、str2langstr2expression が加わった。str2lang は文字列を呼び出し (call) あるいはアトミックな定数などに変換する ((マニュアルを見ると、“a call or simpler”(呼び出しまたはそれより単純なもの)を返すと書いてある。)) 。str2expression は文字列を表現式 (expression) に変換する。
    • これまでの R でも parse() 関数を使えばできたことだが、それが簡潔に表現できるようになった。
  • 新しい関数として、asplit() が導入された。これは、配列(行列を含む)を分割してリストにするものである。
(x <- matrix(1 : 6, 2, 3))
# 以下の結果が返る
#      [,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    2    4    6

asplit(x, 1) # 行ごとに分割
# 以下の結果が返る
# [[1]]
# [1] 1 3 5
#
# [[2]]
# [1] 2 4 6

asplit(x, 2) # 列ごとに分割
# 以下の結果が返る
# [[1]]
# [1] 1 2
#
# [[2]]
# [1] 3 4
#
# [[3]]
# [1] 5 6

注釈