ESS で快適 R ライフ ~操作編~(2012年度版)

前回は ESS のインストールと設定についてご紹介しました。
今回は簡単な操作方法についてご紹介します。
前回ご紹介した設定を適用していることを前提とします。init.el の内容が少し変わっているので、ご注意ください。

サンプルコード

次のようなサンプルコードを使うことにします。

# ess_sample.R
library(MASS)

compareModels <- function(model1, model2) {
    plot(data)
    abline(model1, col = "blue")
    abline(model2, col = "red")
}

set.seed(1)
x <- runif(100, max = 100)
y <- 2 * x + rnorm(x, sd = 5)
data <- data.frame(x = c(x, 150), y = c(y, 1000))

model1 <- lm(y ~ x, data)
model2 <- rlm(y ~ x, data)
compareModels(model1, model2)

Emacs を起動します。

$ emacs ess_sample.R

次のような画面になったかと思います。
20120422173258

iESS の操作方法

まずは C-c C-y を押して R バッファに移動して iESS を使ってみます。

補完機能

現在のディレクトリを system(“pwd”) で確認しようと sys まで入力してみます。
すると次のような状態になります。
20120422173303

sys で始まる補完候補が表示され、特定の関数で1.5秒(デフォルト設定の場合)静止するか M-h を押すと黄色い背景でその関数に対するドキュメントが表示されます。これが auto-complete の機能です。
超便利ですね!!

<down>, <up> や C-p, C-n を押すことで補完候補を選択できますし、C-s で候補を絞ることも可能です。
ここでは system が選択されている状態なので TAB や Enter を押して system の補完を完了します。

なお、ドキュメントが表示されている間は C-M-n, C-M-p でドキュメントをスクロールすることができます。
補完候補が表示されるまでに時間がかかりますが、C-M-i を押すことで即座に候補を表示することも可能です。

関数の引数を確認する(Eldoc)

先ほどの画面で “(“ を入力すると次のような画面になるかと思います。
20120422173154

引数に関する補完機能も提供されていて auto-complete が凄まじく便利なことはおわかりいただけると思うのですが、注目していただきたいのはエコーエリア(最下部)に system 関数の引数の情報が表示されていることです。
こちらは Eldoc によって提供されているもので、デフォルト引数が何なのかなど知りたい時に便利です。
関数の名前や引数の部分にキャレットを持って行くと表示されるので、補完機能とは違って入力中以外にも確認できます。

スマートコンマを利用する

スマートコンマは ESS 12 から導入された機能です。
プロンプト(”>”)の直後にカンマを入力すると次のような画面になります。
20120422173256

左の画面は anything によるもので、コマンドを選択する際にはスペース区切りで AND 検索をしたり、正規表現を使ったりすることができます。

スマートコンマにはいくつかのコマンドが用意されており、例えば change-directory が選択されている状態で Enter を押すと、どこのディレクトリに移動するか聞かれるので、移動先のディレクトリを入力して Enter を押します。
もう一度 system(“pwd”) を実行すると指定したディレクトリに移動していることが確認できると思います。
なお、change-directory は作業ディレクトリとカレントディレクトリ両方を変更します。getwd() を実行すると、同時に作業ディレクトリも変わっていることが確認できます。

ちなみにスマートコンマを利用しないでも

M-x ess-change-directory

で同じことができます。

スマートコンマの他のコマンドとして、install.packages を選択すると CRAN のパッケージリストを取得して、どれをインストールするか一覧を提示してくれたり、library を選択するとどのパッケージをロードするかインストール済みのパッケージ一覧を提示してくれたりと、かなり便利です。
いろいろ試してみると良いと思います。

コマンド履歴を利用する

M-p で実行したコマンドの履歴を遡ることができます。M-n はその逆です。また、M-r でインクリメンタルサーチを行うこともできます。

rdired を利用する

rdired は dired のようなインタフェースで R のオブジェクトを確認できる機能です。
個人的に全然使わないのですが、一応紹介しておきます。

M-x ess-rdired

を実行することで R dired というバッファが開き、現在存在するオブジェクトの一覧が表示されます。
中身を確認したいオブジェクトにキャレットを持って行き、v を押すとオブジェクトの内容を確認することができます。
他にもオブジェクトを削除したり、プロットしたりできるので、興味のある方は R dired バッファで ? を押してヘルプをご確認ください。

ドキュメントを確認する

C-c C-v で関数のドキュメントを確認することができます。
例えば seq.Date のドキュメントを確認したい場合は C-c C-v seq [Space] da [Enter] を押すだけで確認できます。
20120422173156

anything-R を導入しているので、C-c r でも同じようなことができます。
C-c r と C-c C-v の違いは、C-c C-v はヘルプを参照することしかできませんが、C-c r だとヘルプの確認以外のこともできることです。
試しに C-c C-v seq [SPACE] da [TAB] を押すと次のような画面になります。
20120422173157

ここで help を選択すればドキュメントが表示されますし、view source を選択すると関数の定義を確認することができます。

ヘルプバッファでの操作

ドキュメントのバッファ(ヘルプバッファ)は特殊なキーが割り当てられているので覚えておくと何かと便利です。
比較的使いそうなものだけ以下に示します。

基本操作

キー 説明
? ヘルプの表示
q 現在のバッファを閉じる(kill はしない)
x 現在のバッファを kill して R のバッファに戻る

移動系のキー

キー 説明
n 次のセクションへ移動
p 前のセクションへ移動
s d Description へ移動
s D Details へ移動
s u Usage へ移動
s a Arguments へ移動
s v Values へ移動
s s See Also へ移動
s r References へ移動
s e Example へ移動

Exampleの実行

キー 説明
l 現在の行を実行して次の行へ移動
r リージョンを実行する

スクリプトの編集

iESS の操作でご紹介した機能は、スマートコンマや履歴機能以外であればスクリプトの編集においても利用可能です。

スクリプトを実行する

現在編集中のスクリプトの一部分を実行するコマンドが用意されています。
個人的によく使うものは次のとおりです。

コマンド 説明
C-c C-j 現在の行を実行
C-c C-f 現在の関数を定義
C-c C-r 現在のリージョンを実行
C-c C-b 現在のバッファを実行

C-c M-j、C-c M-f のように後のキーの Ctrl を Meta に変えるとコマンド実行後に R のバッファに移動します。

データや関数の定義にジャンプする(imenu)

ESS における imenu は少し特殊です。

M-x imenu

を実行すると次のように Data と Functions が用意されていることが確認できます。
20120422173200

Data を選択すると、スクリプト内で data.frame や as.data.frame によって定義されたデータの一覧が表示され、定義部分にジャンプすることができます。
20120422173201

Functions を選択すると、スクリプト内で定義されている関数の一覧が表示され、定義部分にジャンプすることができます。
20120422173202

その場でオブジェクトの内容を確認する(ess-R-object-popup)

C-c C-g を押すことで現在のキャレット上のオブジェクトに対する概要などを確認することができます。
次のキャプチャ画像はキャレットが library 上にある状態で C-c C-g を押した状態の画像です。
20120422173204

ところが、キャレットが x の上にある状態で C-c C-g を押しても中身が確認できません。
これは、ess_sample.R と結び付けられている R プロセスに x というオブジェクトが存在しないからです。
x の代入までを実行した後であれば 次のようにオブジェクトの中身を確認することができます。
20120422173205

補足

ess-R-object-popup の説明で、R のプロセスに x が定義されていない状態で C-c C-g を押しても x の中身を確認できないことを述べました。
これは auto-complete や eldoc にも言えることで、ESS では R のプロセスで何らかのコマンドを実行して、その結果を利用して便利な機能を提供しています。
例えば auto-complete にしても library(MASS) を実行する前だと rl を入力しても rlm は補完の候補として出てきません。
20120422173158

library(MASS) を実行した後であれば補完候補に挙がります。
20120422173207

そして ESS では .Last.value がほとんど意味を成さないことも注意が必要です。
auto-complete や eldoc で R のプロセスに対して何らかの処理を行った時点で .Last.value にはその結果が入ります。

以上、ESS の操作についてでした!
ESS をダウンロードして解凍した際にできる ess-12.04/doc/refcard/refcard.pdf はチートシートのようなものなので、これを印刷しておくと便利かもしれません。ただし一部は昔のものと互換性がなくなって使えないコマンドがありますが・・・。

また、ESS 12 から導入された ess-tracebug は開発効率をかなり向上できる可能性のある機能なのですが、個人的に微妙だなぁと思うところがあるので紹介しませんでした。もう少し良くなったら紹介するかもしれません。

ではでは快適な R ライフを!