2016-05-24 6 views
10

遅延評価のためにパッケージが不明な場合、Rで効率的にデバッグする方法を教えてください。私は基本的なbrowser()の機能をそのままにしておきたいと思います。testthat packageを使っても機能します。 postで説明されているように、--with-keep.sourceは「プロジェクトオプション=>ビルドツール」で私のプロジェクトに設定されています。 遅延評価が使用されているにもかかわらず、package :: function()のデバッグ

myfun <- function(a,b) {return(a+b)} 

やスクリプトを含むTestDebugパッケージを作成し、動作を再現するには

{ 
browser() 
TestDebug::myfun(1,2) 
} 

example.R

編集TestDebug::myfun(1,2)通話 otherpackage::myfun2(1,2)もカバーされるべき状況。私は状況がすべての "本当の"パッケージで発生すべきだと思いますか?

答えて

5

以下は私のために働く。

それがないと私は右::関数にTestDebug::myfun()ないのソースにスクリプト

debug(TestDebug::myfun) 
TestDebug::myfun(1,2) 

デバッガのステップを実行した場合、私は私の機能

myfun <- function(a,b) {return(a+b)}

と私のパッケージTestDebugを持っていますTestDebug::myfun(1,2)の呼び出しの前にbrowser()を配置すると、

ご質問にお答えください:実際の状況では、TestDebug::myfun(1,2)はよくotherpackage::myfun2(1,2)を呼び出します。 otherpackage::myfun2(1,2)に入ると、::の機能が再び終了します。

は、これは私がその場で debugインデックスに他の関数の内部で呼ばれるこの機能を追加しないようにするには:

をするとすぐに呼ばれotherpackage::myfun2(1,2)TestDebug::myfun()内側の線の上にあるように私はコンソールでdebug(otherpackage::myfun2(1,2))実行します。その後、問題なくotherpackage::myfun2(1,2)に入り、otherpackage::myfun2(1,2)のソースコードに終わることができます。 (..andない::のソースコード内の)

は、あなたがあなたの問題がotherpackage::myfun2(1,2)にそれが呼び出された次の時間をジャンプして、デバッガを防ぐためにotherpackage::myfun2(1,2)内にないことを確認していた後undebug(otherpackage::myfun2(1,2))を呼び出すことを忘れないでください。

もしあなたが好きなら、(debug(..)ではなく)debugonce(otherpackage::myfun(1,2))を使って関数を1回だけデバッグすることもできます。

+0

これは私の例の問題を解決します。より多くのレベルを持つ「本当の」パッケージを持っているとわかりました。 'TestDebug :: myfun(1,2)'は 'otherpackage :: myfun2(1,2)'を呼び出して同じ問題に再び遭遇します。私の質問の編集を参照してください。 – Christoph

+0

あなたの改善された答えは、少なくとも回避策です。それ以上のオプションがないかどうか、私はまだ不思議です。何か、デバッグオプション 'skip_base_functions'のようなものがあります。 – Christoph

関連する問題