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 とする文化があるようです