R コンソールをエミュレートできるようにする R 関数が必要ですが、グローバル環境とは異なる環境で式が評価されるという違いがあります。(関数が呼び出されたローカルパラメーターを復元し、エミュレートされた R コンソールに関数コードをステップバイステップで貼り付けるだけでデバッグできる、R の代替デバッグアプローチに使用したい)。以下は、parse と eval を使用し、ジョブを途中で実行する関数です (Esc キーを押すと、エミュレートされたコンソールが停止します)。
my.console = function() {
while(TRUE) {
tryCatch({
expr.out <- capture.output(eval(parse(prompt=": ")))
if (length(expr.out)>0) {
cat(expr.out,"\n")
}
}, error = function(e) {
str = as.character(e)
message(str)
})
}
}
console.env = new.env(parent=globalenv())
console.env$hello = "Hello World"
environment(my.console) <- console.env
my.console()
次に、エミュレートされたコンソールで簡単な式を評価できます。
: 5*5
[1] 25
: hello
[1] "Hello World"
問題は、複数行のコードを解析できないことです。たとえば、スクリプトから if ステートメントの先頭を貼り付けると、エラーがスローされます。
: if (TRUE) {
Error in parse(prompt = ": "): 2:0: unexpected end of input
R コンソールは、次の行にさらにコードが続くことを認識し、プロンプトを + に変更します。同様の動作をする parse 関数のバリアントもあるのだろうか。これまでのところ、私の唯一の考えは、エラーメッセージで部分文字列「入力の予期しない終了」を検索し、解析を続行することが判明した場合、非常に汚いアプローチです。しかし、たとえば、いくつかの R エラー メッセージは R が実行される言語に依存しているように見えるので、私はそのようなアプローチにはあまり満足していません。複数行の R コードを解析できる、より適切にエミュレートされた R コンソールを作成する方法を知っている人はいますか?