ほくそ笑む

R言語と統計解析について

R を終了させる最短コードがおもしろい

R 環境を終了させたいときは、コマンドライン

q()

と打てば終了できます。q() は quit() の省略形で、このままだと

Save workspace image? [y/n/c]:

などと聞かれるので、それがうっとおしい人は

q("no")

のように打てば確認されずに終了できます。
しかし、R を終了させるために 7 文字も打つのはめんどくさいと言う人たちがいます。
そういう人たちのために、

Q

と打つだけで終了できるようにするテクニックがあります。
どういうテクニックかちょっとおさらいしておきましょう。*1

Q で R を終了させるテクニック

まず、コマンドライン

x <- 3.14
x

と打つと

[1] 3.14

と表示されますね。
ここで、2行目の x は暗黙のうちに print(x) を呼び出していることを思い出してください。
print() は内部で UseMethod("print") を使っていますから、クラスごとに print() メソッドを用意すれば、独自の関数として定義することが可能です。
次のコードを見てください。

Q <- 1
class(Q) <- "quit"
print.quit <- function(x) {
    q("no")
}

このコードを実行するとどうなるでしょうか?
まず、Q というオブジェクトが生成されます。
つぎに、Q のクラスを quit に書き変えています。
そして、クラス quit に対する print メソッド print.quit を作成し、q("no") を呼び出しています。
このコードを実行したあと、コマンドライン

Q

と打てば、print.quit() が実行され、自動的に R が終了される、というわけです。
上のコードを .Rprofile に書いておけば R を起動したときに常に読み込まれますね。

R を終了させる最短コード

さて、ここからが本題です。
それでは、上記のコードをどれだけ短く書けるのか?というクイズが
[R] Quiz {was "Quit asking me .."}
において出題されました。
ちなみに、出題者は「オレは 51 文字でできたぜ」と言っています。
ちょっと上のコードをワンライナーに整形してみましょうか。

Q<-1;class(Q)<-"quit";print.quit<-function(x)q("no")

数えてみると、52文字です。
代入記号を = にすると、

Q=1;class(Q)="quit";print.quit=function(x)q("no")

49文字です。簡単に出題者を抜かしてしまいましたね。
しかし、すごいのは回答者の Henrik さんで、ここから怒涛の最適化が始まります。

Q="no";class(Q)=Q;print.no=function(x)q(Q)

まず、Q の値を "no" にして、クラス名や q() へ渡す引数に再利用しています。
これで 42 文字です。

Q="no";class(Q)=Q;print.no=q

さらに、print() メソッドに渡される引数は Q 自身であることを利用して、function() を消去してしまいました。
これで 28 文字です。

class(Q)=Q="no";print.no=q

最終的に、連鎖代入文を利用して、26 文字にまで削減してしまいました。
もう正直、謎の呪文にしか見えません。

まとめ

q("no") と打つのが面倒な人は、ぜひこの呪文を .Rprofile に付け足してみてください。
みなさまの快適な R ライフの一助となれば幸いです。
ではでは〜。

*1:べつに文字は Q じゃなくてもいいんですが、Q とする文化があるようです