2016-05-24 37 views
10

Tembel değerlendirmeler nedeniyle bilinmeyen paketler biliniyorsa, R'de nasıl hata ayıklanabilir. browser() temel işlevselliğini, harika çalışıyor - testthat package ile bile sürdürmek istiyorum. Aşağıdaki post'da açıklandığı gibi, projem için "proje seçenekleri => Oluşturma Araçları" içinde --with-keep.source belirtilmiştir. Hata ayıklama paketi :: function() tembel değerlendirme kullanılmış olmasına rağmen

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

ve bir komut dosyası içeren TestDebug bir paket oluşturmak Davranışı yeniden oluşturmak için

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

example.R

Düzenleme: TestDebug::myfun(1,2) aramalar otherpackage::myfun2(1,2) da ele alınmalıdır durum. Her "gerçek" pakette durumun olması gerektiğini düşünüyorum?

cevap

5

Aşağıdaki işlemler benim için.

benim işlevi ile paketimi TestDebug sahip

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

Haklı değil onun yaptığı gibi :: fonksiyonunun içine TestDebug::myfun() kaynağı haline komut dosyası

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

ayıklayıcı adımlarını çalıştırırsanız TestDebug::myfun(1,2) çağrısından önce bir browser() yerleştirdiğinizde.

Sorunuzda belirttiğiniz gibi: gerçek yaşam koşullarında genellikle otherpackage::myfun2(1,2)'u çağırır. otherpackage::myfun2(1,2)'a girmeye çalışırsanız, tekrar :: işlevinin içine gireceksiniz.

bu ben anında debug endeksine diğer fonksiyonların içinde denilen bu fonksiyonlar eklemek önlemek için:

hemen sonra denir otherpackage::myfun2(1,2)TestDebug::myfun() iç hat üzerinde oldukları gibi konsolda debug(otherpackage::myfun2(1,2)) çalıştırın. Bundan sonra otherpackage::myfun2(1,2)'a sorunsuzca girebilir ve otherpackage::myfun2(1,2) kaynak koduna girebilirim. (..ve değil :: kaynak kodunda)

Eğer sorun otherpackage::myfun2(1,2) içine denir dahaki sefere atlamak için ayıklayıcısını önlemek için otherpackage::myfun2(1,2) içinde değil etmediğinden emin olduktan sonra undebug(otherpackage::myfun2(1,2)) aramaya unutma.

İsterseniz, yalnızca bir kez hata ayıklamak için debugonce(otherpackage::myfun(1,2)) (debug(..) yerine) kullanabilirsiniz.

+0

Bu, örneğimin sorununu çözüyor. Daha fazla seviyeli bir "gerçek" paketiniz olduğunda, ör. 'TestDebug :: myfun (1,2)' otherpackage :: myfun2 (1,2) 'çağrılarını tekrar aynı problemle karşılaşırsınız. Soruyu düzenlememe bakın. – Christoph

+0

Geliştirilmiş yanıtınız en azından bir geçici çözümdür. Daha fazla seçenek yoksa hala merak ediyorum. İstenen davranışa sahip olabilecek bir hata ayıklama seçeneği 'skip_base_functions' gibi bir şey. – Christoph