Чтобы установить точку в функции, с которой начинается отладка, вам, вероятно, захочется использовать 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)