2013-06-26 2 views
5

ブラウザを使用して他の関数を多くのレベルで呼び出す関数をデバッグする場合、特定の変数を検査するためにどのレベルを入力するのかを知ることは難しいことがあります。関数がapply,sapply,lapplyの中間レベルを生成すると、それは意味が分かりません。スタックのすべてのレベルで変数を名前で検索する方法はありますか?ブラウザを使用しているときに呼び出しスタック内のオブジェクトを検索する

ここで、私はf3にエラーを生成する以下の機能を持っているとします。私は、レベル5に入ると、私が現在使っている環境の上に、何らかの形でposまたはenvir引数を使って、どのような環境のコンテンツもリストできるはずだと思います。 v2を検索するにはどうすればよいですか?

f1 <- function(){ 
    v1 <- 1 
    sapply(1:3, f2) 
} 
f2 <- function(...){ 
    v2 <- 2 
    f3() 
} 
f3 <- function(){ 
    v3 <- 3 
    stop("Oh no!") 
} 
> options(error=recover) 
> f1() 

Error in f3() : Oh no! 

Enter a frame number, or 0 to exit 

1: f1() 
2: #3: sapply(1:3, f2) 
3: lapply(X = X, FUN = FUN, ...) 
4: FUN(1:3[[1]], ...) 
5: #3: f3() 

答えて

5

あなたはsys.frameslistにコールスタックを取得します。この場合、browserが起動した後にsys.framesに電話すると、listの長さが9になります。フレーム6-9には、エラーが発生したコールと、browserの開始に関連するコールが含まれます(sys.calls )。最初の5つのフレームは、recoverが印刷するコールスタックに表示されます。 browser開始したら、あなたは

lapply(sys.frames()[1:5], ls) 

または

which(sapply(sys.frames(), function(frame) 'v2' %in% ls(frame))) 
+0

で変数を含むフレームを検索して、あなたの例では、コールスタックの各レベルの名前空間で、非常にエレガントに見えることができ、ありがとうございました! – Backlin

関連する問題