0

コール スタック ロギングを使用する正しい方法を探しています。
リストへの呼び出しをログに記録する関数があります。

s <- list()
f <- function(){
  s <<- c(s,list(sys.call()))
  g()
}
g <- function(){
  s <<- c(s,list(sys.call()))
  1
}

それらは不明な順序で呼び出されます。

f()
f()
g()
f()

sys.call()呼び出し階層を構築できるようにするために、他にどのデータをログに記録する必要がありますか?
現在のログの粒度を変更したいと考えています。

sapply(s,deparse)
# [1] "f()" "g()" "f()" "g()" "g()" "f()" "g()"

以下のようなものに。

#    sys.call call_id call_seq
#  :      f()       1        0
#  :      g()       1        1
#  :      f()       2        0
#  :      g()       2        1
#  :      g()       3        0
#  :      f()       4        0
#  :      g()       4        1

このような粒度のデータがあれば、呼び出しの階層を再構築できます。

ありがとう

4

1 に答える 1

0

私はそのプロセスを管理することができました。
各呼び出しで、呼び出しチェーンの再帰的な深さを測定します。呼び出し深度と呼び出し順序を使用して、単一の呼び出しチェーンを計算しました。
問題を解決したコードの一部は、次のようなものです

dt[, seq := depth( call_chain )
   ][, id := cumsum( seq==1L ) ]

完全なケースについては、この.

于 2015-03-25T21:18:18.817 に答える