3

相互接続された関数がいくつかある場合は、それらを通るパスを追跡すると便利です。つまり、trace関数を使用して、Rが関数の1つに出入りするたびにメッセージを送信します。例えば、

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)

たとえばuntrace(f)コマンドラインで、各関数でuntraceを直接呼び出すと、機能します。すべての関数を一度に追跡解除する関数を作成するにはどうすればよいですか?

4

1 に答える 1