2012-01-23 5 views
1

は、私は、次のコードを挿入したRスクリプトを持っています。しかし、これは次の行に進むのではなく、むしろ継続するようです。ブラウザ()デバッグ文R

browser()ステートメントの後、残りのコードをどのようにステップ実行すればよいですか?デバッグを開始するために、あなたはおそらくtrace()を使用したいと思うれる関数内のポイントを設定するには

おかげ

答えて

5

のは、あなたが機能myFunを持っているとplot()に右の呼び出し前にデバッグを開始したいとしましょう:

myFun <- function() { 
    x <- 
     8:1 
    y <- 
     1:8 
    plot(y~x) 
    lines(y~x) 
    text(x,y, letters[1:8], pos=3) 
} 

traceへの呼び出しを構築するために、あなたはどのでmyFunをステップを知っている必要がありますplot()への呼び出しが発生します。 ことを決定するには、構文as.list(body(myFun))使用:プロットへの呼び出しが、ステップ4で発生したことを指摘した後

as.list(body(myFun)) 
# [[1]] 
# `{` 
# 
# [[2]] 
# x <- 8:1 
# 
# [[3]] 
# y <- 1:8 
# 
# [[4]] 
# plot(y ~ x) 
# 
# ... More ... 

を、あなたは右のステップ4の前にブラウザを入力したいというRを伝えるためにtrace()を使用することができます毎回myFunが呼び出されます:あなたが関数のデバッグ完了したら

trace(myFun, browser, 4) 

# TRY IT OUT 
# (Once in the browser, type "n" and press Enter to step through the code.) 
myFun()  

最後に、untrace(myFun)への呼び出しをトレースをオフにします。


EDIT:ソース化-でスクリプトのブレークポイントを設定するための戦略が類似しています。ここでも、スクリプトに実際にコードを挿入するわけではありません。代わりにfindLineNum()setBreakPoint()を使用してください。

上記の関数myFun()は、関数定義の前に5行の空白行を持つテキストファイル"myScript.R"で定義されているとします。プロットするために右の呼び出しの前にブレークポイントを挿入するには、次のスクリプトでインラインそれを持っている場合、それに全部を調達するので、対話型モードで実行されていると、サブ機能で使用する場合

source("myScript.R")   # Must source() once before using findLineNum 
           # or setBreakPoint 
findLineNum("myScript.R#10") # I see that I missed the step by one line 
setBreakpoint("myScript.R#11") # Insert the breakpoint at the line that calls 
           # plot() 

myFun()       # Test that breakpoint was properly inserted 
           # (Again, use "n" and Enter to step through code) 
+0

お返事ありがとうございます。私は関数をデバッグしようとしているのではなく、むしろかなり長いスクリプトを(おそらくそれは少しモジュール化する必要があります)。関数の場合、私は 'debug(myFun)'を実行しています。これはうまくいくようです。しかし、私はスクリプトにブレークポイントを設定し、そのブレークポイントの後にコードをステップ実行したいと思います... – Alex

+0

そこに、スクリプトにブレークポイントを設定する方法を示す例を追加しました。うまくいけば、 'trace'の呼び出しと同様に、実際にスクリプトファイル内の関数の定義にコードを挿入する必要はありません。乾杯! –

+0

ジョシュ、答えに感謝します。スクリプト全体を最初に調達することなくブレークポイントを設定するにはどうすればよいですか?ありがとう。 – Alex

1

browser()を使用するため、一般的です呼び出されたときにブラウザのプロンプトに対して次の行を単に実行します。

など。あなたがステップバイスクリプトステップを実行した場合

R> options(Debug=TRUE) 
R> browser(expr = isTRUE(getOption("Debug"))) 
Called from: top level 
Browse[1]> b <- 1 
Browse[1]> b <- 2 
Browse[1]> b <- 3 

、次にように、それは使用がより理にかなっています関数を呼び出す:

options(Debug=TRUE) 
browser(expr = isTRUE(getOption("Debug"))) 
b <- 1 
b <- 2 
b <- 3 

は、それは次のように実行します:

をスクリプトを想定し
R> options(Debug=TRUE) 
R> a <- function() { 
browser(expr = isTRUE(getOption("Debug"))) 
b <- 1 
b <- 2 
b <- 3 
return(b) 
} 
R> e <- a() 
Called from: a() 
Browse[1]> n 
debug at #5: b <- 1 
Browse[2]> # ENTER 
debug at #6: b <- 2 
Browse[2]> b 
[1] 1 
Browse[2]> # ENTER 
debug at #7: b <- 3 
Browse[2]> b 
[1] 2 
Browse[2]> # ENTER 
debug at #8: return(b) 
Browse[2]> b 
[1] 3 
Browse[2]> # ENTER 
[1] 3 
R> 
関連する問題