Отладочный оператор browser () R - PullRequest
1 голос
/ 24 января 2012

У меня есть скрипт R, в который я вставил следующий код:

options(Debug=TRUE)
#SOME MORE CODE
browser(expr = isTRUE(getOption("Debug")))
#SOME MORE CODE

После запуска отладчика я бы хотел перейти к следующей строке, чтобы я набрал n.Однако это не переходит к следующей строке, а скорее продолжается.

Как мне пройти остаток моего кода после browser() заявления?

Спасибо

Ответы [ 2 ]

5 голосов
/ 24 января 2012

Чтобы установить точку в функции, с которой начинается отладка, вам, вероятно, захочется использовать trace().

Допустим, у вас есть функция 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)):

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

Заметив, что вызов сюжета происходит на шаге 4, вы можете использовать trace(), чтобы сообщить R, что вы 'Я хотел бы войти в браузер непосредственно перед шагом 4 каждый раз, когда вызывается 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() определена в текстовом файле "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)
1 голос
/ 24 января 2012

browser() обычно используется при работе в интерактивном режиме и используется в подфункции, потому что, если она встроена в скрипт и источник, все это просто выполнит следующую строку в ответ на приглашение браузера, когда оноПозвонил.

Например, при условии, что скрипт:

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

Он будет выполняться так:

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

Если бы вам нужно было запустить скрипт шаг за шагом, а затем вызватьфункция как таковая, тогда ее использование имеет больше смысла:

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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...