10

アップデート:

この質問は@TylerRinkerのものとほぼ同じであるように見えるため、私は個人的にこの質問を重複としてマークしました。ただし、この特定の質問にはまだ回答がないと考えています。私はdebug/debugonceそれらが異なるツールであることを気に入っていますが (非常に便利ではありますが)、browserコンテキストを制御する方法については引き続き興味があります。

__________________________________________________

元の質問:

browserデバッグするときは、別のコンテキスト内からコンテキストにステップインすると簡単で、多くの場合役に立ちますbrowser。ネストされたレベルが反復ループから呼び出された場合、終了して前のコンテキストに戻るには、反復ごとにステップ実行する必要があります。すべてのコンテキスト からのQ出口による終了。 browser

質問は:

下位のコンテキストですべての反復を手動で進める必要なく、終了するコンテキストを指定する方法はありますか?

以下の例では、 100 回Browse [1]ヒットせずに に戻ることを意味します。c

私が使用する 2 つは、
(1) 反復回数を変更するか、
(2) を使用Qし、元の関数を再度呼び出してから、以前の場所に戻ります。
どちらも「素晴らしい」または「良い」イベントではありません。


例:

outerFunc <- function() { 
  # < ... cropped .. >
  browser()
  # < ... cropped .. >
}

outerFunc()
lapply(seq(100), function(i) browser(text=paste("i is #", i)))

これはウォークスルーです

> outerFunc()
Called from: outerFunc()
Browse[1]> lapply(seq(100), browser)
Called from: lapply(seq(100), browser)
Browse[2]> c
Called from: lapply(seq(100), browser)
Browse[2]> c
Called from: lapply(seq(100), browser)
Browse[2]> c
Called from: lapply(seq(100), browser)
Browse[2]> Q    # <~~~~~~  `Q` quits all contexts
> 
4

1 に答える 1

6

browser()expr=引数を利用して、いつでもループ内でブラウジングをオフにできるようにする、少しハックなアイデアを次に示します。

outerFunc <- function() { 
  # < ... cropped .. >
  BROWSE <- TRUE
  browser()
  # < ... cropped .. >
}

outerFunc()
lapply(seq(100), function(i) browser(text=paste("i is #", i),
       expr=BROWSE))

Called from: FUN(1:100[[1L]], ...)
Browse[2]> 
Called from: FUN(1:100[[2L]], ...)
Browse[2]> 
Called from: FUN(1:100[[3L]], ...)
Browse[2]> 
Called from: FUN(1:100[[4L]], ...)
Browse[2]> 
Called from: FUN(1:100[[5L]], ...)
Browse[2]> BROWSE <<- FALSE        ## From here on, browser() won't be triggered
Browse[2]> 
[... many snipped lines ...]
Browse[1]>                         ## so that you're returned to next level
                                   ## up without further interruption
于 2013-10-22T16:29:05.170 に答える