Как отследить несколько функций

Если у меня есть несколько взаимосвязанных функций, то может быть полезно проследить путь через них. Что использует trace функция для выдачи сообщения каждый раз, когда R входит или выходит из одной из функций. Например,

f <- function() g()
g <- function() h()
h <- function()
{
 if(runif(1) > 0.3) g() else 99
}

trace_my_fns <- function()
{
  fn_names <- c("f", "g", "h")
  invisible(trace(
    fn_names,
    tracer = quote(0),
    exit   = quote(0),
    where  = globalenv()
  ))
}

trace_my_fns()
set.seed(4)
f()

Когда я закончу эту трассировку, мне нужно их отследить.

untrace_my_fns <- function()
{
  fn_names <- c("f", "g", "h")
  invisible(trace(
    fn_names,
    where = globalenv()
  ))
}
untrace_my_fns()

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

f
body(f)

Например, если я вызываю untrarace для каждой функции untrace(f) на командной строке, это работает. Как мне создать функцию, которая бы отслеживала все мои функции одновременно?

1 ответ

Решение

Ну, поменяйте на:

untrace_my_fns <- function()
{
  fn_names <- c("f", "g", "h")
  invisible(untrace(
    fn_names,
    where = globalenv()
  ))
}

untrace_my_fns()
set.seed(4)
f() # no more tracing...

... потому что ты звонил trace вместо untrace!

Другие вопросы по тегам