4

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 コンソールを作成する方法を知っている人はいますか?

4

2 に答える 2

0

コードを段階的にインタラクティブに進めたい場合は、組み込み関数browser()を commandnで使用できます。 を参照してください?browser。使用例:

f <- function(x) {
  # invoke interactive debugging
  browser()

  # rest of the function - by pressing 'n' while in browser mode, the expressions
  # will be executed one after another and you are able to explore the
  # intermediate values of variables etc. (as in standard R promt)
  y <- x^2
  [...]
}

これがニーズに合わない場合は、 のソース コードを参照してくださいbrowser

于 2012-12-18T20:22:25.577 に答える